Skip to content

Layout et Responsive Design

Créer une mise en page responsive, c’est s’assurer que votre contenu reste lisible, clair et esthétique sur tous les écrans — du smartphone à l’écran géant.

Dans ce cours, vous allez apprendre à :

  • Approfondir Flexbox pour des layouts complexes
  • Découvrir CSS Grid pour des compositions avancées
  • Créer des sites responsive avec les media queries
  • Rendre les images et media fluides

Durée : 4 heures (1h théorie + 2h30 pratique + 30min Q&A)


Avant d’aborder les layouts, un rappel sur le box model CSS :

.box {
width: 300px;
height: 200px;
padding: 20px; /* Espace interne */
border: 2px solid #000;
margin: 10px; /* Espace externe */
}

Taille totale = width + padding + border + margin

Par défaut, width ne compte pas le padding et border. C’est souvent déroutant !

/* Mieux : inclure padding et border dans width */
* {
box-sizing: border-box;
}
.box {
width: 300px; /* Largeur TOTALE incluant padding et border */
padding: 20px;
border: 2px solid #000;
}

box-model

Démonstration interactive :

Box sizing

Contenu
Largeur du contenu :
Largeur totale (avec margin) :
⚠️ Attention : la largeur totale dépasse la valeur de width !
✅ La largeur de l'élément = width (plus prévisible)

Code CSS généré :

.box {
box-sizing: ;
width: ;
padding: ;
border: solid #E74C3C;
margin: ;
}

Vous connaissez déjà les bases de Flexbox. Allons plus loin.

Flexbox

Propriétés de l'item sélectionné

Code CSS généré :

.container {
display: flex;
flex-direction: ;
justify-content: ;
align-items: ;
flex-wrap: ;
gap: ;
}
.item- {
flex: ;
}
.container {
display: flex;
flex-direction: row; /* Horizontal (défaut) */
justify-content: flex-start; /* Alignement horizontal */
align-items: stretch; /* Alignement vertical */
gap: 1rem; /* Espacement entre éléments */
}
.container {
display: flex;
flex-wrap: wrap; /* Les items passent à la ligne si pas assez de place */
gap: 1rem;
}

Exemple pratique : Grille de cartes responsive

.chapters-grid {
display: flex;
flex-wrap: wrap;
gap: 2rem;
}
.chapter-card {
flex: 1 1 300px; /* grow, shrink, basis */
/* Chaque carte fait minimum 300px, et grandit pour remplir l'espace */
}

Propriété flex : Contrôler la taille des items

Section titled “Propriété flex : Contrôler la taille des items”
.item {
flex: 1 1 200px;
}
/*
flex-grow: 1 → peut grandir
flex-shrink: 1 → peut rétrécir
flex-basis: 200px → taille de base
*/

Exemples pratiques :

/* Sidebar + Contenu principal */
.container {
display: flex;
gap: 2rem;
}
.sidebar {
flex: 0 0 250px; /* Largeur fixe de 250px */
}
.main-content {
flex: 1; /* Prend tout l'espace restant */
}
/* 3 colonnes égales */
.three-columns {
display: flex;
gap: 1rem;
}
.column {
flex: 1; /* Chaque colonne prend 1/3 de l'espace */
}

Quand flex-wrap: wrap créé plusieurs lignes :

.container {
display: flex;
flex-wrap: wrap;
align-content: space-between; /* Espace entre les lignes */
height: 600px; /* Nécessite une hauteur définie */
}
.item-1 { order: 2; }
.item-2 { order: 1; }
.item-3 { order: 3; }

Utile pour réorganiser visuellement sans toucher au HTML (par exemple en responsive).

/* Layout global de la page */
body {
display: flex;
flex-direction: column;
min-height: 100vh; /* Toute la hauteur de la fenêtre */
}
header {
flex: 0 0 auto; /* Ne grandit ni rétrécit */
}
main {
flex: 1; /* Prend tout l'espace disponible */
}
footer {
flex: 0 0 auto;
}

Pour vous entraîner avec Flexbox de manière ludique, essayez Flexbox Froggy. Ce jeu vous permet de pratiquer les propriétés Flexbox en aidant une grenouille à atteindre son nénuphar.


CSS Grid excelle pour créer des layouts en deux dimensions (lignes ET colonnes).

.container {
display: grid;
grid-template-columns: 1fr 1fr 1fr; /* 3 colonnes égales */
grid-template-rows: auto; /* Hauteur automatique */
gap: 1rem; /* Espacement */
}

Unité fr : Fraction de l’espace disponible

Section titled “Unité fr : Fraction de l’espace disponible”
/* 3 colonnes égales */
.grid {
grid-template-columns: 1fr 1fr 1fr;
}
/* Colonne 1 = 2x plus large que colonnes 2 et 3 */
.grid {
grid-template-columns: 2fr 1fr 1fr;
}
/* Mix de colonnes fixes et flexibles */
.grid {
grid-template-columns: 250px 1fr 1fr; /* Sidebar fixe + 2 colonnes flexibles */
}
/* Au lieu de : 1fr 1fr 1fr 1fr */
.grid {
grid-template-columns: repeat(4, 1fr); /* 4 colonnes égales */
}
/* Colonnes de minimum 250px, autant que possible */
.grid {
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
}

auto-fit et auto-fill : Grilles responsive

Section titled “auto-fit et auto-fill : Grilles responsive”
.chapters-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
}

Cette grille crée automatiquement autant de colonnes que possible, chaque colonne faisant minimum 300px. Magique pour le responsive !

Placer les items avec grid-column et grid-row

Section titled “Placer les items avec grid-column et grid-row”
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1rem;
}
/* Cet item occupe 2 colonnes */
.item-1 {
grid-column: span 2; /* Étend sur 2 colonnes */
}
/* Cet item occupe la largeur complète */
.item-featured {
grid-column: 1 / -1; /* De la ligne 1 à la dernière ligne */
}
/* Cet item occupe 2 lignes */
.item-tall {
grid-row: span 2;
}
<div class="gallery">
<div class="item featured">Image 1</div>
<div class="item">Image 2</div>
<div class="item">Image 3</div>
<div class="item tall">Image 4</div>
<div class="item">Image 5</div>
<div class="item">Image 6</div>
</div>
.gallery {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 1rem;
}
.item {
background: #f0f0f0;
padding: 1rem;
}
.featured {
grid-column: span 2; /* Occupe 2 colonnes */
grid-row: span 2; /* Occupe 2 lignes */
}
.tall {
grid-row: span 2;
}

Pour des layouts complexes :

.page-layout {
display: grid;
grid-template-areas:
"header header header"
"sidebar main main"
"footer footer footer";
grid-template-columns: 250px 1fr 1fr;
gap: 1rem;
}
header { grid-area: header; }
.sidebar { grid-area: sidebar; }
main { grid-area: main; }
footer { grid-area: footer; }

Le responsive design consiste à adapter votre site à toutes les tailles d’écran.

Commencez par designer pour mobile, puis ajoutez des styles pour écrans plus grands.

/* Styles de base (mobile) */
.container {
padding: 1rem;
}
.columns {
display: flex;
flex-direction: column; /* Colonnes empilées sur mobile */
gap: 1rem;
}
/* Tablettes et plus */
@media (min-width: 768px) {
.container {
padding: 2rem;
}
.columns {
flex-direction: row; /* Colonnes côte à côte sur tablette+ */
}
}
/* Desktop et plus */
@media (min-width: 1024px) {
.container {
max-width: 1200px;
margin: 0 auto;
}
}
AppareilMin-widthExemple
Mobile< 768 pxiPhone, Android
Tablette≥ 768 pxiPad, Galaxy Tab
Desktop≥ 1024 pxLaptop
Large desktop≥ 1440 pxÉcran large
/* Mobile par défaut (< 768px) */
/* Tablette */
@media (min-width: 768px) {
/* Styles pour tablette */
}
/* Desktop */
@media (min-width: 1024px) {
/* Styles pour desktop */
}
/* Large desktop */
@media (min-width: 1440px) {
/* Styles pour grands écrans */
}

Exemple interactif : Navigation responsive avec Flexbox

Section titled “Exemple interactif : Navigation responsive avec Flexbox”
▶ Résultat
/* Mobile : 1 colonne */
.chapters-grid {
display: grid;
grid-template-columns: 1fr;
gap: 1.5rem;
}
/* Tablette : 2 colonnes */
@media (min-width: 768px) {
.chapters-grid {
grid-template-columns: repeat(2, 1fr);
gap: 2rem;
}
}
/* Desktop : 3 colonnes */
@media (min-width: 1024px) {
.chapters-grid {
grid-template-columns: repeat(3, 1fr);
}
}

Exemple interactif : Grille CSS Grid automatiquement responsive

Section titled “Exemple interactif : Grille CSS Grid automatiquement responsive”
▶ Résultat

/* Rendre toutes les images fluides */
img {
max-width: 100%;
height: auto;
display: block;
}

object-fit : Contrôler le ratio d’aspect

Section titled “object-fit : Contrôler le ratio d’aspect”
.chapter-thumbnail {
width: 100%;
height: 250px;
object-fit: cover; /* Couvre la zone sans déformation */
border-radius: 1rem;
}

Valeurs de object-fit :

  • cover : couvre la zone (peut rogner)
  • contain : contient l’image entière (peut laisser des espaces)
  • fill : étire l’image (peut déformer)

Démonstration interactive :

Aperçu avec

Démonstration object-fit

L'image couvre tout le conteneur. Peut rogner l'image si les proportions diffèrent.

L'image entière est visible. Peut laisser des espaces vides si les proportions diffèrent.

L'image remplit le conteneur. Peut déformer l'image si les proportions diffèrent.

L'image garde sa taille originale. Peut déborder ou laisser des espaces.

L'image utilise la plus petite taille entre "contain" et "none".

Comparaison de toutes les valeurs

cover
cover
contain
contain
fill
fill
none
none
scale-down
scale-down

Code CSS généré :

.image-container {
width: ;
height: ;
}
.image-container img {
width: 100%;
height: 100%;
object-fit: ;
}
video {
max-width: 100%;
height: auto;
}
<div class="video-container">
<iframe src="https://www.youtube.com/embed/VIDEO_ID"></iframe>
</div>
.video-container {
position: relative;
aspect-ratio: 16 / 9; /* Ratio 16:9 */
background: black;
}
.video-container iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border: none;
}

💡 Exemple complet : Layout responsive de site d’histoire

Section titled “💡 Exemple complet : Layout responsive de site d’histoire”

Voici un exemple complet combinant Flexbox, CSS Grid et responsive design :

▶ Résultat

Créez une grille qui affiche :

  • 1 colonne sur mobile
  • 2 colonnes sur tablette
  • 4 colonnes sur desktop
Voir la solution
.grid {
display: grid;
grid-template-columns: 1fr;
gap: 1rem;
}
@media (min-width: 768px) {
.grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (min-width: 1024px) {
.grid {
grid-template-columns: repeat(4, 1fr);
}
}

Ou version automatique :

.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 1rem;
}

Créez un layout avec :

  • Sur mobile : sidebar en haut, puis contenu
  • Sur desktop : sidebar à gauche (250px fixe), contenu flexible
Voir la solution
/* Mobile */
.page-layout {
display: flex;
flex-direction: column;
gap: 2rem;
}
.sidebar {
/* Prend toute la largeur sur mobile */
}
.content {
/* Prend toute la largeur sur mobile */
}
/* Desktop */
@media (min-width: 1024px) {
.page-layout {
flex-direction: row;
}
.sidebar {
flex: 0 0 250px; /* Largeur fixe */
}
.content {
flex: 1; /* Prend l'espace restant */
}
}

Pendant la phase pratique, vous allez :

  • Identifiez les sections qui nécessitent un layout (grille, flex, etc.)
  • Dessinez un schéma de layout mobile vs desktop
  • Planifiez vos breakpoints

2. Créer un layout responsive avec Flexbox et/ou Grid (1h30)

Section titled “2. Créer un layout responsive avec Flexbox et/ou Grid (1h30)”
  • Layout global (header, main, footer)
  • Navigation responsive
  • Grille de contenu (chapitres, personnages, etc.)
  • Sidebar si nécessaire
  • Appliquer max-width: 100% aux images
  • Utiliser object-fit pour les thumbnails
  • Gérer les vidéos/iframes responsive

4. Tester sur différentes tailles d’écran (1h)

Section titled “4. Tester sur différentes tailles d’écran (1h)”
  • Utilisez les DevTools (F12 → mode responsive)
  • Testez mobile (375px), tablette (768px), desktop (1024px+)
  • Ajustez les breakpoints si nécessaire
  • Vérifiez que tout est lisible et cliquable

  • Responsively App : tester sur plusieurs tailles simultanément
  • Chrome DevTools : mode responsive (F12 → icône mobile)

Avant le prochain cours, assurez-vous que :

  • Votre site utilise Flexbox ou Grid pour le layout
  • La navigation est responsive (verticale mobile, horizontale desktop)
  • Les grilles de contenu s’adaptent aux différentes tailles
  • Toutes les images sont fluides (max-width: 100%)
  • Le site est fonctionnel sur mobile (375px), tablette (768px) et desktop (1024px+)
  • Pas de scroll horizontal sur mobile
  • Les textes sont lisibles sur toutes les tailles d’écran

  • Flexbox : pour des layouts en une dimension (ligne OU colonne), navigation, alignements
  • Grid : pour des layouts en deux dimensions (lignes ET colonnes), grilles de cartes
  • Les deux : souvent combinés dans un même projet !

Mes media queries ne fonctionnent pas, pourquoi ?

Section titled “Mes media queries ne fonctionnent pas, pourquoi ?”

Vérifiez que vous avez le meta viewport dans votre <head> :

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

Les valeurs courantes :

  • Mobile : < 768px (par défaut)
  • Tablette : 768px
  • Desktop : 1024px
  • Large desktop : 1440px

Mais adaptez selon votre contenu !

Non, mais c’est recommandé car :

  • Vous forcez à prioriser le contenu essentiel
  • C’est plus facile d’ajouter que de retirer
  • Meilleure performance mobile