đ©âđ« CSS 6 : Responsive Design & Media queries
Objectifs
- Comprendre ce que sont les media queries
- Découvrir comment tu peux les utiliser pour modifier ta mise en page
- Comprendre le concept du mobile first
Introduction
Aux dĂ©buts d'Internet, les pages web Ă©taient conçues pour des tailles d'Ă©cran trĂšs spĂ©cifiques. Aujourd'hui, nous avons tous des tailles d'Ă©cran diffĂ©rentes, mĂȘme nos smartphones sont tous de tailles diffĂ©rentes.
C'est pour résoudre ce problÚme spécifique que le responsive web design (design web réactif) a été inventé. Le responsive web design est un ensemble de pratiques qui permet aux pages web de changer leur mise en page pour s'adapter à des tailles d'écran différentes.
Dans cette quĂȘte, nous parlerons de ce qu'est le responsive web design et de la façon dont tu peux appliquer ces pratiques Ă tes sites web.

Sommaire
L'histoire des différentes mise en page des sites web
Avant que le concept de sites web réactifs n'existe, il n'y avait que deux façons de concevoir un site web.
- Créer une mise en page fixe (les sites web ont une taille fixe)

- Créer une mise en page liquide (les sites web ont une taille en % qui s'adapte à la largeur de l'écran)
Le responsive design a été créé pour résoudre les problÚmes des dispositions fixes et liquides.
Responsive Design
Le terme "responsive design" (conception réactive ou adaptative) ne se réfÚre pas à une technologie spécifique. Il fait plutÎt référence à un ensemble d'outils et de pratiques pour créer des mises en page qui "s'adaptent" à la taille des écrans. Le terme "responsive design" a été apposé par Ethan Matcotte en 2010.

Mobile-first
Un concept qui est également apparu avec le responsive design (et surtout à la "révolution mobile") est le concept de mobile-first.
La philosophie du mobile-first est de toujours commencer Ă travailler sur la version mobile avant de construire la version de bureau.
Non seulement les utilisateurs auront une meilleure expérience sur mobile, mais il est également plus facile de commencer à travailler sur une version mobile.
Illustrons ce concept. Imagine que tu vives dans une petite piÚce (quelques mÚtres carrés). Si tu dois déménager dans un appartement plus grand, il te sera bien plus facile de déplacer toutes tes affaires depuis un espace plus petit vers un espace plus grand que l'inverse.
C'est la mĂȘme chose pour le design rĂ©actif.
La plupart des utilisations d'Internet se font Ă partir d'un appareil mobile, il est donc crucial d'avoir une excellente version mobile de ton site web !
source: https://www.broadbandsearch.net/blog/mobile-desktop-internet-usage-statistics
Aujourd'hui, avoir une bonne version mobile peut améliorer considérablement la visibilité sur les moteurs de recherche. Par exemple, Google donnera un rang à ton site web en vérifiant si celui-ci est mobile-friendly et lui attribuant si c'est le cas une meilleure visibilité sur le moteur de recherche.
Un bel article de MDN sur l'adaptabilité des sites aux téléphones portables
Comment coder une page web responsive
La balise meta viewport
Pour indiquer au navigateur que ta page s'adapte Ă tous les appareils, tu dois ajouter une balise meta dans le <head> de ton document :
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
Ici, nous indiquons au navigateur d'utiliser 100% de la largeur disponible de l'écran et d'appliquer un niveau de grossissement à 1 (c'est-à -dire pas de zoom avant ni arriÚre).
Source: https://developers.google.com/search/mobile-sites/mobile-seo/responsive-design
Media queries
Les media queries permettent de modifier la mise en page en fonction de la taille du viewport. Ce que nous appelons viewport est la taille de la fenĂȘtre.
En utilisant les media queries, tu peux dĂ©cider de rĂ©organiser certains Ă©lĂ©ments de ta page web en fonction de la taille de la fenĂȘtre.
Source: https://hackernoon.com/introduction-to-css-media-queries-xu3t3vxc
La syntaxe d'une media query ressemble Ă ceci :
@media <media_type> and (<media_features>) {
/* put your CSS here */
}
Types de media
Le <media_type> décrit la catégorie d'appareil. Voici une liste des différents types de media que tu peux utiliser :
-
all: appliquer la rĂšgle Ă tous les types d'appareils. -
print: utilisĂ© pour un document destinĂ© Ă ĂȘtre imprimĂ© (papier) -
screen: utilisé pour tous les types d'écran. -
speech: pour les synthétiseurs de parole
Le plus utilisé est généralement screen.
Caractéristiques media
Ensuite, à la place de <media_features>, tu peux écrire des rÚgles pour lesquelles la media query sera appliquée.
Les features les plus courantes sont la largeur minimale min-width et la largeur maximale max-width.
Tu peux trouver une liste complĂšte sur le site w3schools :
Tu trouveras ici la définition et les rÚgles d'utilisation des media queries
Voici un exemple de media queries avec toutes les propriétés :
@media screen and (max-width: 600px) {
.menu {
display: none;
}
}
//écriture alternative
@media screen and (width <= 600px) {
.menu {
display: none;
}
}
Cette media query vĂ©rifie si la page web est affichĂ©e sur un Ă©cran, et si la largeur de la fenĂȘtre de visualisation est infĂ©rieure Ă 600px.
Si la condition est vraie, alors la rÚgle CSS est appliquée et l'élément .menu change en display : none.
Ouvre la démo sur Codesandbox et déplace la taille de l'écran ; le menu devrait disparaßtre lorsque la taille de l'écran est inférieure à 600px.
https://codesandbox.io/s/restless-waterfall-do0wo?file=/style.css:192-195
Il existe plein d'autres options possibles pour spécifier certaines situations telles que l'orientation portrait ou paysage du média (orientation), la résolution, si le type d'affichage est monochrome, etc. Consulte la page suivante pour des explications détaillées.
đŹ ExpĂ©rience
Maintenant, essaye de rĂ©arranger ces trois blocs en utilisant les media queries. Lorsque la taille de l'Ă©cran est infĂ©rieure Ă 600px, les blocs doivent ĂȘtre en display:block et prendre toute la largeur (100%).
https://codesandbox.io/s/zen-keldysh-ol0g9?file=/style.css
Voir la solution|||css|||Des difficultés pour trouver la solution? PersévÚre, tu vas y arriver|||0|||Cacher
@media screen and (max-width: 600px) {
.boxes {
display: block;
width: 100%;
}
}
Points de rupture
Dans la responsive design, un point de rupture (ou breakpoint) est un point auquel la media query se déclenche (et la mise en page s'adapte). Dans l'exemple précédent, tu as utilisé 600px comme point de rupture.
Nous ne voulons pas que les Ă©lĂ©ments changent tout le temps pour un grand nombre d'Ă©crans diffĂ©rents. Ton site web ne devrait changer que sur les points d'arrĂȘt principaux (ex : lorsque le site passe d'un Ă©cran de bureau Ă la tablette, etc.)
Voici les tailles d'écran les plus utilisées :
- Mobile en portrait (320px à 414px) - Pour les appareils avec des écrans de 4" à 6,9".
- Mobile en paysage (568px Ă 812px) - Idem, mais en paysage.
- Tablette en portrait (768px Ă 834px) - Pour les appareils de 7" Ă 10".
- Tablette en paysage (1024px Ă 1112px) - Idem, mais aussi tablettes 12" en portrait.
- Ecrans d'ordinateurs portables et de bureau (>1200px) - Varie beaucoup, mais généralement de 1200px et plus.
Source : Pinterest https://in.pinterest.com/pin/370421138093022328/
Images
Un autre concept important en responsive design est celui des images. Nous voulons aussi que les images s'adaptent à la taille de l'écran.
Nous pouvons utiliser ce code pour nous assurer que l'élément image ne prend pas plus de 100% de la taille du parent :
img {
max-width: 100%;
height: auto;
}
đŹ ExpĂ©rience
Cette image de chat est trop grande : utilise la technique que nous venons d'apprendre pour l'adapter Ă la taille de la fenĂȘtre de visualisation.
https://codesandbox.io/s/agitated-vaughan-75xsr
Voir le code|||javascript|||Des problĂšmes pour trouver la solution ?|||0|||Cacher
.img-cat {
max-width: 100%;
height: auto;
}
false|||true|||true
# Qu'est-ce que le responsive design ?
[] Un site web qui se charge rapidement
[] Une technologie pour créer de beaux designs pour tes sites web
[x] Un ensemble d'outils pour créer des mises en page qui répondent à tous les types d'appareils
# Qu'est ce que le concept de mobile-first ?
[x] Créer la version mobile avant la version de bureau
[] Créer la version de bureau avant la version mobile
[] Créer un site web qui ne fonctionne qu'en mobile
# Ă quoi servent les media queries ?
[x] Modifier certaines rĂšgles CSS en fonction de l'appareil
[] Créer une grille
[] Modifier la taille du *viewport*
# Quelle est la bonne syntaxe pour les *media queries* ?
[x] @media screen and (max-width : 500px) { ... }
[] @media query screen and (max-width:500px){ ... }
[] @query screen and (max-width : 500px) { ... }
[] @mediaQuery screen and (max-width : 500px) { ... }
Résumé
- Le responsive design est un ensemble de pratiques utilisées pour créer une mise en page qui "répond" (s'adapte) aux contraintes de l'appareil
- Le principe du mobile-first est un principe important lié au responsive design. Ce principe signifie que tu dois toujours démarrer la construction de la version mobile de ton site web avant la version pour bureau
- Tu peux écrire des media queries pour appliquer des rÚgles CSS spécifiques à certaines tailles d'écran
Ressources
Un bel article sur les meilleures pratiques en matiĂšre de responsive design.
Challenge
En utilisant les media queries, essaie de reproduire l'intégration de la barre de navigation représentée ci-dessous.

Consignes
- L'intĂ©gration doit ĂȘtre faite pour trois tailles d'Ă©cran, soit deux points de ruptures (1024 et 1200px), comme suit :
- Mobile portrait ou paysage pour une largeur inférieure à 1024px. Servira aussi pour les tablettes en orientation portrait.
- Tablette en orientation paysage et une largeur d'écran supérieure à 1024px
- Ordinateur et une largeur supérieure à 1200px
- Pour les trois versions, la barre de navigation est fixe.
- Version mobile : seules les icĂŽnes sont visibles. La barre est fixĂ©e en pied de fenĂȘtre
- Version tablette : les icÎnes ainsi que les textes des liens sont visibles. La barre est fixée à droite de l'écran
- Version ordinateur : les icĂŽnes sont cachĂ©es mais les textes des liens sont visibles ainsi que le logo. La barre de navigation est fixĂ©e en haut de la fenĂȘtre.
Tips
- Essaie de réaliser ton CSS dans une approche mobile first
- Code pour le violet : #A306B6.
- IcĂŽnes : tu peux utiliser la bibliothĂšque d'icĂŽnes Bootstrap Icons qui s'intĂšgre en ajoutant ce code dans la partie
<head>de la page :
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
Solution pas Ă pas
- 1
Démarrage
Je crée les fichiers
index.htmletstyle.cssdans un dossier approprié. - 2
HTML
Je pose l'ensemble des éléments HTML dont je vais avoir besoin pour les trois versions.
html<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Exercise | Responsive</title> <link rel="stylesheet" href="style.css"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css"> </head> <body> <nav> <a href="#" class="logo">Logo</a> <ul> <li> <a href="#"> <i class="bi bi-house-fill"></i> <span>Home</span> </a> </li> <li> <a href="#"> <i class="bi bi-images"></i> <span>Gallery</span> </a> </li> <li> <a href="#"> <i class="bi bi-envelope-fill"></i> <span>Contact</span> </a> </li> </ul> </nav> </body> </html>Ă noter : l'utilisation des icĂŽnes bootstrap grĂące aux tags
<i>. Les textes des liens sont placĂ©s Ă l'intĂ©rieur de<span>pour pouvoir ĂȘtre manipulĂ©s via le CSS. - 3
Mobile first
Je réalise l'intégration de la vue mobile.
css* { box-sizing: border-box; } body { margin: 0; line-height: 1.5; background-color: grey; font-family: Verdana, Geneva, Tahoma, sans-serif; } nav { position: fixed; inset: auto 0 0 0; display: flex; justify-content: center; align-items: center; padding: 1rem; background-color: #A306B6; color: #fff; } nav>a.logo { display: none; color: inherit; text-decoration: none; } nav>ul { display: flex; list-style: none; padding: 0; } nav>ul>li>a { color: inherit; text-decoration: none; padding: 1rem; } nav>ul>li>a>i { font-size: 1.5em; } nav>ul>li>a>span { display: none; }Ă noter :
- La propriété
inset(ligne 14) sert à définir en une seule ligne les valeurs des propriétéstop,right,bottometleft. - On utilise la propriété
display: none;pour cacher le logo (ligne 24) et les textes des liens (ligne 46).
- La propriété
- 4
Tablet
J'ajoute les media queries pour la vue tablette en mode paysage.
css* { box-sizing: border-box; } body { margin: 0; line-height: 1.5; background-color: grey; font-family: Verdana, Geneva, Tahoma, sans-serif; } nav { position: fixed; inset: auto 0 0 0; display: flex; justify-content: center; align-items: center; padding: 1rem; background-color: #A306B6; color: #fff; } @media screen and (width >= 1024px) and (orientation: landscape) { nav { inset: 0 0 0 auto; } } nav>a.logo { display: none; color: inherit; text-decoration: none; } nav>ul { display: flex; list-style: none; padding: 0; } @media screen and (width >= 1024px) and (orientation: landscape) { nav>ul { flex-direction: column; } } nav>ul>li>a { color: inherit; text-decoration: none; padding: 1rem; } nav>ul>li>a>i { font-size: 1.5em; } nav>ul>li>a>span { display: none; } @media screen and (width >= 1024px) and (orientation: landscape) { nav>ul>li>a>span { display: initial; } }Ă noter :
- L'ajout de media query n'ayant pas d'impact sur les spécificités, je prends soin de redéfinir les éléments en-dessous de leur définition initiale pour que les nouvelles valeurs soient correctement prises en compte par le navigateur.
- J'ai choisi ici de répéter plusieurs fois, aux endroits les plus pertinents, la déclaration
@media screen and (min-width: 1024px) and (orientation: landscape)pour faciliter la lecture du code et les mises à jour futures lorsque mon CSS aura beaucoup évolué.
J'aurais pu déclarer une seule fois le
@media screen âŠpour l'ensemble des Ă©lĂ©ments, en fin de fichier par exemple. Mais ce type de placement est difficilement maintenable lorsque mes fichiers CSS contiennent beaucoup de lignes. Le risque Ă©tant de passer Ă cĂŽtĂ© de certaines spĂ©cificitĂ©s. Voici ce que j'aurais alors obtenu :css/* ... */ nav>ul>li>a>i { font-size: 1.5em; } nav>ul>li>a>span { display: none; } @media screen and (width >= 1024px) and (orientation: landscape) { nav { inset: 0 0 0 auto; } nav>ul { flex-direction: column; } nav>ul>li>a>span { display: initial; } } - 5
Desktop
Enfin, j'ajoute les media queries nécessaires à la vue ordinateur en continuant d'écrire en-dessous des points de rupture précédents.
css* { box-sizing: border-box; } body { margin: 0; line-height: 1.5; background-color: grey; font-family: Verdana, Geneva, Tahoma, sans-serif; } nav { position: fixed; inset: auto 0 0 0; display: flex; justify-content: center; align-items: center; padding: 1rem; background-color: #A306B6; color: #fff; } @media screen and (width >= 1024px) and (orientation: landscape) { nav { inset: 0 0 0 auto; } } @media screen and (width >= 1200px) { nav { inset: 0 0 auto 0; justify-content: space-between; } } nav>a.logo { display: none; color: inherit; text-decoration: none; } @media screen and (width >= 1200px) { nav>a.logo { display: initial; } } nav>ul { display: flex; list-style: none; padding: 0; } @media screen and (width >= 1024px) and (orientation: landscape) { nav>ul { flex-direction: column; } } @media screen and (width >= 1200px) { nav>ul { flex-direction: row; } } nav>ul>li>a { color: inherit; text-decoration: none; padding: 1rem; } nav>ul>li>a>i { font-size: 1.5em; } @media screen and (width >= 1200px) { nav>ul>li>a>i { display: none; } } nav>ul>li>a>span { display: none; } @media screen and (width >= 1024px) and (orientation: landscape) { nav>ul>li>a>span { display: initial; } }Conclusion
L'approche mobile first permet de concevoir et d'organiser son CSS de maniÚre itérative et structurée. Elle permet aussi de limiter le nombre de lignes nécessaires à l'intégration tout en garantissant le résultat final attendu.
Ressources partagĂ©es sur cette quĂȘte
- vidéo trÚs claire et complÚte expliquant en détail le responsive et les média queries :Dhttps://www.youtube.com/watch?v=wu1Sk8iOPnE&list=PLjwdMgw5TTLVjTZQocrMwKicV5wsZlRpj&index=20
- soooooooo good one-liners css for alignment :Dhttps://1linelayouts.glitch.me
- Apprendre les commandes shell en s'amusant (aurait sa place dans une quete ici)https://linuxfr.org/news/gameshell-apprendre-les-rudiments-du-shell-en-s-amusant
- Vidéo de 20 minutes en anglais qui explique pas à pas comment rendre une page responsive :)https://www.youtube.com/watch?v=x4u1yp3Msao
Source: