TP M1106 n°3 - Partie 1 sur 2 - Durée 2h

Sites web adaptatifs HTML 5 / CSS 3 avec une grille 12 colonnes

html5 CSS3 M1106 rwd

Résumé des épisodes précédents...

Objectifs de cette première partie de TP

Et après...

Dépôt de votre archive d'un répertoire contenant vos fichiers TP

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.

Propriété CSS box-sizing et dimensionnement des blocs CSS

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

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) :

standard box model
Modèle de boîte CSS standard (Modèle par défaut - box-sizing: content-box;)
alternate box model
Modèle de boîte CSS alternatif avec box-sizing: border-box;

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.

Un premier site web adaptatif avec une grille en pourcentage

Vous avez dit site web adaptatif / responsive web design ?

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).

Mobile-first design

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, ...).

Présentation du site web adaptatif à créer

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).

page 1 tel page 2 tel page 3 tel page 1 tel survol souris menu

Illustrations du site à réaliser pour une largeur de fenêtre de visualisation de moins de 600px de large.

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).

page 1 tablette survol souris

Illustration du site à réaliser pour une fenêtre de visualisation de largeur d'au minimum 600px

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 :

page 1 ordinateur survol souris

Illustration du site à réaliser pour une fenêtre de visualisation de largeur d'au minimum 768px

Pour réaliser ce site, nous vous présentons dans la suite deux choses :

  1. Comment utiliser un système de grille CSS de 12 colonnes pour agencer les blocs.
  2. Comment modifier l'organisation des blocs (le design du site) en fonction de la taille de la fenêtre du navigateur.

Vous pourrez alors réaliser le site après.

Positionnements flottants et taille en pourcentage avec une grille de 12 colonnes.

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 :

<div class="row">
  <div class="col-3">...</div> <!-- 25% de largeur de page -->
  <div class="col-9">...</div> <!-- 75% de largeur de page -->
</div>

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).

Site web adaptatif / Responsive web design

HTML viewport

Pour que votre site s'adapte à l'écran, vous devrez d'abord ajouter la balise meta suivante à vos pages :


<meta name="viewport" content="width=device-width, initial-scale=1.0">

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").

CSS 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...)

Réalisation du site

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 :

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)

Il reste à construire le fichier d'habillage CSS siteGrillePourcentages.css.

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 :-)