Vous déposerez alors en fin de séance une archive zip de ce répertoire sur Moodle (dépôt de vos archives zip TP). Un seul dépôt (une seule archive) pour les parties 1 et 2 de ce TP.
Vous avez déjà utilisé cette propriété pour l'habillage d'un formulaire dans la première partie du TP n°2 (Démo MDN box-sizing). Nous revenons ici sur cette propriété, car elle est importante à connaître.
Par défaut - résultat obtenu avec box-sizing: content-box; - la largeur et la hauteur d'un élément sont calculées comme ceci (C'est le modèle classique de boîte CSS - Box Model en anglais) :
width + padding + border = largeur réelle d'un élément
hauteur + padding + border = hauteur réelle d'un élément
Un div de largeur 300px et hauteur 100px avec une bordure bleue continue de 1px.
Un div de largeur 300px et hauteur 100px avec une bordure rouge continue de 1px et une marge interne de 20px.
En modifiant la propriété box-sizing avec box-sizing: border-box; le navigateur compte la marge interne et la bordure dans la largeur et la hauteur d'un bloc.
En résumé (images issues de la doc MDN) :
Pour plus de précisions sur la propriété box-sizing, vous pouvez lire au besoin les docs MDN box-sizing et w3schools box-sizing.
Cette précision étant faite, vous allez maintenant réaliser un premier site web adaptatif avec une grille en pourcentage pour placer les blocs plus facilement.
De nos jours un site web peut se consulter sur de nombreux appareils : écrans d'ordinateurs fixes ou portables, tablettes, téléphones mobiles, liseuses, interfaces mode texte / consoles, ... Aussi pour rappel (cf TP1), un site web adaptatif ("responsive" en anglais) est un site permettant une bonne expérience de lecture et de navigation sur n'importe quel appareil.
Les documentations w3schools et MDN sur la création de site web adaptatif (ou "responsive web design" en anglais) sont respectivement là (w3schools) et là (MDN).
Le Mobile-first design est une philosophie de création de site web qui consiste à développer un site en commençant par les petits écrans puis les plus grands. Il aide à garantir que l'expérience de vos utilisateurs est homogène sur n'importe quel appareil. En outre, les sites sont de plus en plus consultés sur les téléphones mobiles (Transports en commun, facilités d'accès et d'utilisation, moindres coûts, ...).
On souhaite réaliser le site web illustré sur les images suivantes dans le cas d'un petit écran (plus petit que 600px de large / Téléphone mobile).
On souhaite ensuite avoir l'affichage suivant dès que l'écran (ou plutôt la "fenêtre de visualisation" ou la région visible de l'utilisateur) fait au moins 600px de large (Une tablette par exemple).
Enfin dès que la fenêtre de visualisation de l'utilisateur possède une largeur d'au minimum 768px (un ordinateur par exemple), on souhaite obtenir l'affichage suivant :
Pour réaliser ce site, nous vous présentons dans la suite deux choses :
Vous pourrez alors réaliser le site après.
Pour réaliser ce site, on choisit de découper la largeur de l'écran en 12 colonnes (une méthode classique également utilisée par Bootstrap par exemple). Chaque colonne a donc une largeur exprimée en pourcentage de 100/12=8,33%.
Chaque ligne du site sera ainsi constituée de blocs occupant les 12 colonnes. Par exemple :
Vous pouvez voir une illustration de cette grille dans la documentation w3schools. Cette partie de TP en est inspirée.
On a donc les organisations de blocs suivantes en fonction de la largeur de la taille du navigateur :
Pour réaliser ces colonnes, vous allez vous servir des propriétés CSS suivantes déclarant des classes de bloc de largeurs de 1 à 12 colonnes.
.col-1 {width: 8.33%;} .col-2 {width: 16.66%;} .col-3 {width: 25%;} .col-4 {width: 33.33%;} .col-5 {width: 41.66%;} .col-6 {width: 50%;} .col-7 {width: 58.33%;} .col-8 {width: 66.66%;} .col-9 {width: 75%;} .col-10 {width: 83.33%;} .col-11 {width: 91.66%;} .col-12 {width: 100%;}
Par exemple un bloc de classe col-3 occupera 3 colonnes en largeur, un bloc de classe col-5 occupera 5 colonnes en largeur, ...
La propriété [class*="col-"] (Pour rappel "toutes les classes contenant "col-") vous permettra alors de configurer toutes les propriétés communes à ces blocs. Dans notre cas, ce sera un positionnement flottant à gauche - pour les avoir les unes à la suite des autres - et un peu de marge interne :
[class*="col-"] { float: left; padding: 15px; }
Dans un fichier HTML vous pourrez alors par exemple créer une ligne (row) avec un premier bloc couvrant 3 colonnes et un deuxième bloc couvrant 9 colonnes (la somme devant faire 12 colonnes et 100% de la largeur de la page) ainsi :
......
Enfin pour que chaque ligne se finisse bien par un retour à la ligne (arrêt du positionnement flottant) et l'espace soit bien occupé (display:block) voici les propriétés qu'il faudra mettre pour la classe row :
.row::after { content: ""; clear: both; display: block; }
On aborde maintenant comment modifier le design du site (l'organisation des blocs) en fonction de la taille de la fenêtre du navigateur (Adaptivité du site).
Pour que votre site s'adapte à l'écran, vous devrez d'abord ajouter la balise meta suivante à vos pages :
Le "viewport" (qu'on pourrait traduire en français par "fenêtre de visualisation") correspond à la région visible de l'utilisateur.
La propriété width=device-width demande à ce que la page s'adapte à la taille de l'écran de l'appareil de l'utilisateur.
La propriété initial-scale=1.0 fixe le niveau de zoom initial à l'ouverture de la page.
La documentation w3school est ici.
Vous pourrez ensuite ajuster votre design de site en fonction de la taille de la fenêtre du navigateur grâce aux règles @media ("media queries").
Une règle @media permet d'exécuter un bloc de propriétés CSS (et donc définir un habillage) seulement si une certaine condition est vraie.
Voici la règle pour les fenêtres de visualisation de largeur maximum 600px (i.e. d'une largeur plus petite ou égale à 600px) (vous pourrez facilement généraliser pour n'importe quelle taille)
@media only screen and (max-width: 600px) { ... /* Règles CSS pour ce cas */ ... }
Voici la règle pour les fenêtres de visualisation de largeur minimum 600px (i.e. d'une largeur plus grande ou égale à 600px) (vous pourrez facilement généraliser pour n'importe quelle taille)
@media only screen and (min-width: 600px) {...}
Pour notre cas, en suivant l'approche mobile-first design, on part de l'habillage téléphone (pour un petit écran) puis on va ajouter des media queries concernant les modifications CSS dès que la fenêtre de visualisation dépasse 600px (~tablette) et dès que la fenêtre de visualisation dépasse 768px (les écrans plus grands). Ainsi le code CSS va ressembler à :
/* Design général en particulier pour les fenêtres plus petites que 600px; */ @media only screen and (min-width: 600px) { /* Modifications du design pour les fenêtres plus larges que 600px*/ } @media only screen and (min-width: 768px) { /* Modifications du design pour les fenêtres plus larges que 768px*/ }
Il est maintenant temps de mettre en pratique tout cela pour réaliser le site 🎉🎉🎉 (Enfin... Oui mais bon tout ce qui est avant est très important pour comprendre la suite...)
Mon Site en grille avec 12 colonnes Mon Site
Titre contenu page 1
Contenu de la page 1.
Blabla annexe
Mon Site
Titre contenu page 1
Contenu de la page 1.
Blabla annexe
Il faut ensuite considérer comment le site va évoluer en fonction de la taille de la fenêtre de visualisation. D'après le cahier des charges, on passe de deux blocs sur la deuxième ligne dans le cas d'un écran type tablette (au moins 600px de large) à trois blocs sur cette même ligne dans le cas des écrans les plus grands (au moins 768px de large).
Une stratégie consiste à utiliser deux grilles de 12 colonnes (i.e. deux types de classes CSS col-* et col-s-*) fonction de ces deux catégories d'écran (Bootstrap aussi fait cela pour plus de catégories - cf TP5). Ici pour l'affichage type téléphone, ce sera simple comme il n'y pas de découpage par ligne, chaque bloc occupera toute une ligne.
Dans le fichier CSS, on utilisera :
@media only screen and (min-width: 768px) { /* Autres écrans d'une largeur minimum de 768px */ .col-1 {width: 8.33%;} .col-2 {width: 16.66%;} .col-3 {width: 25%;} .col-4 {width: 33.33%;} .col-5 {width: 41.66%;} .col-6 {width: 50%;} .col-7 {width: 58.33%;} .col-8 {width: 66.66%;} .col-9 {width: 75%;} .col-10 {width: 83.33%;} .col-11 {width: 91.66%;} .col-12 {width: 100%;} }
@media only screen and (min-width: 600px) { /* Pour petits écrans / tablettes */ .col-s-1 {width: 8.33%;} .col-s-2 {width: 16.66%;} .col-s-3 {width: 25%;} .col-s-4 {width: 33.33%;} .col-s-5 {width: 41.66%;} .col-s-6 {width: 50%;} .col-s-7 {width: 58.33%;} .col-s-8 {width: 66.66%;} .col-s-9 {width: 75%;} .col-s-10 {width: 83.33%;} .col-s-11 {width: 91.66%;} .col-s-12 {width: 100%;} }
/* Mobile-first : pour téléphones portables*/ [class*="col-"] { width: 100%; }
Au final, il vous faut maintenant modifier la page page1.html pour qu'elle utilise les classes col- pour le design grand écran (largeur minimum de 768px) et les classes col-s pour le design petit écran (largeur minimum de 600px)
Titre contenu page 1
Contenu de la page 1.
Blabla annexe
Il reste à construire le fichier d'habillage CSS siteGrillePourcentages.css.
* { box-sizing: border-box; }
* { box-sizing: border-box; } .row::after { content: ""; clear: both; display: block; } html { /* Mettre la police Lucida Sans, sans-serif sinon. */ } .header { /* Couleur de fond #003466 */ /* Texte en blanc */ /* Marge interne 15 px */ } .menu ul { /* Ce qu'il faut pour un menu : Enlever les puces et mettre les marges externes et internes à 0 (cf TP précédent) */ } .menu li a{ /* Marges internes à 8 px */ /* Marge externe en bas à 7 px */ /* Couleur de fond #28d0d0 */ /* Texte en blanc */ /* Ce qu'il faut pour un menu : enlever les soulignements et mettre en balise de type bloc (cf TP précédent) */ } .menu li a:hover { /* Couleur de fond #F23000 */ } .menu li a.active { /* Couleur de fond #0D6889 */ } .aside { /* Couleur de fond #28d0d0 */ /* Texte en blanc */ /* Texte centré */ /* Taille de police 12 px */ /* Marge interne 15 px */ } .footer { /* Couleur de fond #003466 */ /* Texte en blanc */ /* Texte centré */ /* Taille de police 12 px */ /* Marge interne 15 px */ } [class*="col-"] { float: left; padding: 15px; } /* Mobile-first : pour téléphones portables*/ [class*="col-"] { width: 100%; } @media only screen and (min-width: 600px) { /* Pour petits écrans / tablettes */ .col-s-1 {width: 8.33%;} .col-s-2 {width: 16.66%;} .col-s-3 {width: 25%;} .col-s-4 {width: 33.33%;} .col-s-5 {width: 41.66%;} .col-s-6 {width: 50%;} .col-s-7 {width: 58.33%;} .col-s-8 {width: 66.66%;} .col-s-9 {width: 75%;} .col-s-10 {width: 83.33%;} .col-s-11 {width: 91.66%;} .col-s-12 {width: 100%;} } @media only screen and (min-width: 768px) { /* Autres écrans d'une largeur minimum de 768px */ .col-1 {width: 8.33%;} .col-2 {width: 16.66%;} .col-3 {width: 25%;} .col-4 {width: 33.33%;} .col-5 {width: 41.66%;} .col-6 {width: 50%;} .col-7 {width: 58.33%;} .col-8 {width: 66.66%;} .col-9 {width: 75%;} .col-10 {width: 83.33%;} .col-11 {width: 91.66%;} .col-12 {width: 100%;} }
Via zoom partagez votre écran pour faire valider votre site par l'enseignant.
Une pause de 10 mn est possible avant de passer à la deuxième partie une fois tout fini. Si vous avez fini avant les 2h aidez les autres à finir aussi :-)