Aller au contenu
M04 · C. Mettre en forme une page web avec les feuilles de style CSS

Le responsive design et les media queries

Comprendre pourquoi un site doit s'adapter à toutes les tailles d'écran, utiliser la balise viewport, les unités relatives et les media queries, et concevoir d'abord pour le mobile.

1Situer

Au Maroc, la grande majorité des visiteurs d'un site arrivent depuis leur téléphone. Le snack « Chez Hamid » à Meknès a un joli site sur ordinateur, mais sur téléphone il faut zoomer, le menu déborde et les photos sortent de l'écran. Les clients abandonnent et appellent le concurrent. Un site responsive s'adapte tout seul à la taille de l'écran.

2Comprendre

Le même site sur trois écrans
375 px 768 px (tablette) 992 px et plus texte minuscule… illisible 🔍 .menu { display: flex;   flex-wrap: wrap; } .plat { width: 100%; } @media (min-width: 768px)   { .plat { width: 50%; } } @media (min-width: 992px)   { .plat { width: 33%; } } <meta name="viewport" …> ?

Sur téléphone (moins de 600 px), les plats s'affichent sur une seule colonne : c'est le CSS par défaut, « mobile first ».

1 / 4

Un site responsive s’adapte à toutes les tailles d’écran : téléphone, tablette, ordinateur, grand écran. On ne fait pas trois sites : on écrit un seul HTML et un CSS qui s’adapte.

1. La balise viewport

Sans elle, le téléphone fait comme s’il avait un écran d’ordinateur, puis rétrécit tout.

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

2. Des tailles relatives

  • largeurs en %, max-width plutôt que width fixe ;
  • textes en rem ;
  • img { max-width: 100%; height: auto; } ;
  • Flexbox avec flex-wrap: wrap : les éléments passent à la ligne seuls.

3. Les media queries

@media (max-width: 600px) { ... }   /* écrans de 600 px ou moins */
@media (min-width: 768px) { ... }   /* écrans de 768 px ou plus */
@media (min-width: 768px) and (max-width: 1023px) { ... }  /* tablettes */
@media print { ... }                /* à l'impression */

Les points de rupture (breakpoints) les plus courants :

ÉcranLargeur
téléphonemoins de 576 px
tabletteà partir de 768 px
ordinateur portableà partir de 992 px
grand écranà partir de 1200 px

4. Mobile first

On écrit d’abord le CSS du petit écran (une colonne, gros boutons), puis on ajoute des @media (min-width: ...) pour les écrans plus grands. Le code est plus court, et le téléphone ne charge que le nécessaire.

Tester

Dans Chrome ou Firefox, F12 puis l’icône téléphone (ou Ctrl + Maj + M) : on choisit un modèle d’appareil et on voit le rendu. Rien ne remplace un essai sur un vrai téléphone.

Exemple simple

L'eau prend la forme du verre

Versez la même eau dans un verre à thé ou dans une carafe : elle s'adapte au récipient. Un site responsive, c'est le même contenu qui s'adapte à l'écran : une colonne sur téléphone, trois sur ordinateur.

Exemple simple

La règle « si l'écran est petit »

Une media query est une condition : le CSS qu'elle contient ne s'applique que si l'écran respecte la condition.

@media (max-width: 600px) {
  /* seulement sur les écrans de 600 px ou moins */
  .menu { flex-direction: column; }
}

3Manipuler

Le menu du snack est en trois colonnes. Ajoutez une media query pour qu'il passe en une colonne sur téléphone. Utilisez le bouton 📱 pour simuler un téléphone : les deux dernières consignes ne se vérifient qu'en mode téléphone.
Ouvrir dans le lab ↗
  • Exprimez la taille du titre en rem (par exemple 2rem) plutôt qu'en px
  • En mode 📱, les plats passent en colonne (flex-direction: column dans @media (max-width: 600px))
  • En mode 📱, le titre devient plus petit (24px par exemple)

4Pratiquer

Exercice 1 · La balise oubliée

Un stagiaire a écrit de belles media queries, mais sur son téléphone la page s'affiche toute petite, comme sur un ordinateur. Quelle ligne manque dans le <head> ?

Voir le corrigé
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- sans elle, le téléphone simule un écran de 980 px de large -->

Exercice 2 · Mobile d'abord

Réécrivez cette règle en « mobile first » : par défaut une colonne, et trois colonnes à partir de 768 px. .menu { display: flex; } @media (max-width: 767px) { .menu { flex-direction: column; } }

Voir le corrigé
.menu {
  display: flex;
  flex-direction: column;     /* téléphone : par défaut */
}
@media (min-width: 768px) {
  .menu { flex-direction: row; }  /* tablette et plus */
}

Exercice 3 · Les images qui débordent

Sur téléphone, une photo de 1200 px de large fait apparaître une barre de défilement horizontale. Quelle règle CSS corrige le problème pour toutes les images du site ?

Voir le corrigé
img {
  max-width: 100%;  /* jamais plus large que son conteneur */
  height: auto;     /* garder les proportions */
}

5Vérifier

1. Que signifie @media (max-width: 600px) ?
2. Qu'est-ce que l'approche « mobile first » ?
3. Quelle unité est relative à la largeur de l'écran ?