Responsive Design 📱

Flexbox & Grid 📐

Formation DWWM - Les fondamentaux du layout moderne

2025 - 2026

Au programme aujourd'hui

  • 🎯 Responsive Design & Mobile First
  • 📦 Flexbox pour les layouts 1D
  • 🎨 CSS Grid pour les layouts 2D
💡 Objectif : Maîtriser les 3 piliers du layout moderne en CSS

📱 Partie 1

Responsive Design

Adapter votre site à tous les écrans

Qu'est-ce que le Responsive Design ? 📱

Définition : Un site qui s'adapte à tous les écrans.
🏠 Analogie : Un meuble IKEA modulable qui s'adapte à un studio, un appartement ou une maison.

3 types d'écrans :

  • 📱 Mobile : 0-767px
  • 📲 Tablette : 768-1023px
  • 💻 Desktop : 1024px+

Pourquoi c'est crucial ? 🎯

  • 📊 60%+ du trafic = mobiles
  • 🔍 Google favorise le mobile
  • 😊 Meilleure expérience
🚪 Analogie : Un site non-responsive = un magasin avec une porte trop petite !

L'approche Mobile First 📱

Principe : Coder d'abord pour mobile, puis enrichir.
🏗️ Analogie : Construire une maison :
Mobile = Fondations → Tablette = Pièces → Desktop = Décoration

Les Media Queries 🔍

👔 Analogie : Choisir sa tenue selon la météo :
Mobile = T-shirt → Tablette = Veste → Desktop = Manteau
/* MOBILE : Styles de base */
.header { font-size: 1.5em; padding: 10px; }

/* TABLETTE : 768px+ */
@media (min-width: 768px) {
    .header { font-size: 2em; padding: 20px; }
}

/* DESKTOP : 1024px+ */
@media (min-width: 1024px) {
    .header { font-size: 3em; padding: 40px; }
}

Décrypter une Media Query 🔬

/* Explication détaillée */
@media (min-width: 768px) {
    /* Styles ici */
}

/* Traduction : "À partir de 768px de large" */
📖 Exemple concret :
@media (min-width: 768px) signifie :
"Hey CSS ! Si l'écran fait 768px ou plus, applique ces styles !"

Breakpoints standards 📏

Appareil Taille Media Query
📱 Mobile 0 - 767px Styles par défaut
📲 Tablette 768 - 1023px @media (min-width: 768px)
💻 Desktop 1024px+ @media (min-width: 1024px)

Meta viewport : Ne pas oublier ! ⚠️

<meta name="viewport" content="width=device-width, initial-scale=1.0">
Obligatoire dans le <head> : Cette balise dit au navigateur mobile d'utiliser la vraie largeur de l'écran.
🔍 Analogie : Sans cette balise, c'est comme regarder un site avec des lunettes de grand-père : tout est minuscule !

Exemple pratique : Navigation responsive 📱

/* MOBILE : Navigation verticale (empilée) */
.nav {
    display: flex;
    flex-direction: column;  /* Une colonne = items empilés */
    gap: 10px;
}

.nav a {
    padding: 15px;
    background: #333;
    text-align: center;
}

/* TABLETTE+ : Navigation horizontale */
@media (min-width: 768px) {
    .nav {
        flex-direction: row;  /* Maintenant horizontal ! */
        justify-content: space-around;
    }
}
📖 Ce qui se passe :
• Mobile : Les liens sont empilés verticalement (comme des briques)
• Tablette+ : Les liens s'alignent horizontalement (comme un menu classique)

📦 Partie 2

Flexbox

Les layouts en une dimension

Qu'est-ce que Flexbox ? 🤔

Flexbox = Organiser des éléments dans UNE direction (horizontale OU verticale)
🚂 Analogie : Le train
Container = Rails → Items = Wagons → Direction = Sens du train

Activer Flexbox : display: flex

/* Avant */
.container { /* Rien */ }

/* Après : activation ! */
.container { display: flex; }
📖 Résultat :
✅ Enfants côte à côte
✅ Flexibles (s'étirent/rétrécissent)
✅ Faciles à aligner

flex-direction : Choisir la direction 🧭

/* Horizontal (défaut) */
.container { flex-direction: row; }  /* ➡️ */

/* Vertical */
.container { flex-direction: column; }  /* ⬇️ */
📚 Analogie : Ranger des livres
• row = Livres côte à côte →
• column = Livres empilés ↓

justify-content : Alignement axe principal 🎯

Contrôle la position des items sur l'axe principal

.container {
    display: flex;
    justify-content: flex-start;     /* Au début */
    justify-content: center;         /* Au centre */
    justify-content: space-between;  /* Espace entre */
    justify-content: space-evenly;   /* Espace égal */
}
📖 Exemples visuels :
• flex-start : [🟦🟦🟦___________]
• center : [______🟦🟦🟦______]
• space-between : [🟦____🟦____🟦]

justify-content : Cas d'usage 💡

🍽️ Analogie : Disposer des assiettes

• flex-start = Toutes à gauche
• center = Au centre (dîner romantique)
• space-between = Face à face
• space-evenly = Équidistantes
/* Menu de navigation */
.nav {
    display: flex;
    justify-content: space-between;
}

align-items : Alignement axe secondaire ⬆️

Contrôle sur l'axe perpendiculaire

.container {
    display: flex;
    height: 200px;
    
    align-items: stretch;      /* Défaut: items s'étirent */
    align-items: flex-start;   /* En haut */
    align-items: center;       /* Au milieu */
}
📖 La différence clé :
• justify-content = Axe PRINCIPAL
• align-items = Axe SECONDAIRE

Le centrage parfait ! 🎯

/* LA technique de centrage ultime */
.container {
    display: flex;
    justify-content: center;  /* Centre horizontalement */
    align-items: center;      /* Centre verticalement */
    height: 100vh;
}
🎯 Analogie : Placer une cible au centre
• justify-content = Gauche-droite
• align-items = Haut-bas
= Bullseye ! 🎯

gap : L'espace entre les items 📏

.container {
    display: flex;
    gap: 20px;  /* 20px entre CHAQUE item */
}

/* Ou séparé : */
.container {
    row-gap: 20px;
    column-gap: 30px;
}
🧱 Analogie : Le gap = le joint entre les briques. Ça crée automatiquement le bon espacement !

flex-wrap : Retour à la ligne 🔄

/* Par défaut : tout sur une ligne */
.container {
    display: flex;
    flex-wrap: nowrap;  /* Défaut */
}

/* Permettre le retour à la ligne */
.container {
    display: flex;
    flex-wrap: wrap;  /* Items passent à la ligne */
    gap: 20px;
}
📝 Analogie : Écrire une lettre
• nowrap = Écrire jusqu'au bord
• wrap = Passer à la ligne

Propriétés sur les items : flex 🎚️

/* Contrôler comment UN item spécifique se comporte */

.item {
    flex-grow: 1;    /* Peut grandir (prend l'espace disponible) */
    flex-shrink: 1;  /* Peut rétrécir si besoin */
    flex-basis: 200px;  /* Taille de base (avant grow/shrink) */
}

/* Raccourci : */
.item {
    flex: 1;  /* = flex-grow: 1, flex-shrink: 1, flex-basis: 0 */
}
📖 Exemple pratique :
.container {
    display: flex;
}

.sidebar { flex: 0 0 250px; }  /* Largeur fixe 250px */
.main { flex: 1; }  /* Prend tout l'espace restant */
.aside { flex: 0 0 200px; }  /* Largeur fixe 200px */

flex: décryptage complet 🔬

flex: [grow] [shrink] [basis]
/* Exemples commentés : */

flex: 0 0 200px;
/* grow: 0 = Ne grandit pas
   shrink: 0 = Ne rétrécit pas  
   basis: 200px = Taille fixe de 200px */

flex: 1;
/* grow: 1 = Prend l'espace disponible
   shrink: 1 = Peut rétrécir
   basis: 0 = Part de zéro */

flex: 0 1 auto;
/* grow: 0 = Ne grandit pas
   shrink: 1 = Peut rétrécir
   basis: auto = Taille naturelle du contenu */
💡 Mémo : Dans 90% des cas, utilisez flex: 1 ou flex: 0 0 XXXpx

Exemple : Header responsive 📱

.header {
    display: flex;
    justify-content: space-between;
    align-items: center;
}

.nav {
    display: flex;
    gap: 20px;
}

/* Mobile : vertical */
@media (max-width: 767px) {
    .header { flex-direction: column; }
    .nav { flex-direction: column; }
}

Cas d'usage Flexbox 💼

✅ Utilisez Flexbox pour :
• Navigation (horizontale ou verticale)
• En-têtes et footers
• Listes de cartes qui doivent wrap
• Centrage d'éléments
• Barres d'outils et boutons
• Composants d'interface simples
🎯 En résumé : Flexbox = Votre outil quand vous organisez des choses en LIGNE ou en COLONNE

🎨 Partie 3

CSS Grid

Les layouts en deux dimensions

Qu'est-ce que CSS Grid ? 🤔

CSS Grid = Organiser en DEUX dimensions (lignes ET colonnes)
🔢 Analogie : Mots croisés
Des lignes + colonnes = cases où placer vos éléments

Flexbox vs Grid : La différence clé 🎯

Flexbox = 1D (ligne OU colonne)
Grid = 2D (lignes ET colonnes)
📐 Analogie :
Flexbox : Une étagère →→→
Grid : Un calendrier (lignes + colonnes)

Activer Grid : display: grid

.container {
    display: grid;
    grid-template-columns: 200px 200px 200px;
    grid-template-rows: 100px 100px;
    gap: 20px;
}
📖 Résultat : Grille de 3 colonnes × 2 lignes = 6 cases !

grid-template-columns : Définir colonnes 📏

/* Pixels (fixes) */
grid-template-columns: 200px 300px 200px;

/* fr (parts égales) */
grid-template-columns: 1fr 1fr 1fr;

/* Mixte */
grid-template-columns: 250px 1fr 1fr;

/* Répéter */
grid-template-columns: repeat(3, 1fr);

L'unité fr : Le super-pouvoir de Grid ⚡

fr = "fraction" = une part de l'espace
🍕 Analogie : Partager une pizza
• 1fr 1fr 1fr = 3 parts égales
• 2fr 1fr 1fr = Premier a 2 parts
• 250px 1fr 1fr = Part fixe + reste
.layout {
    display: grid;
    grid-template-columns: 250px 1fr;
}

grid-template-rows : Définir lignes 📐

/* Pixels */
grid-template-rows: 100px 200px 100px;

/* Auto (selon contenu) */
grid-template-rows: auto auto auto;

/* fr */
grid-template-rows: 1fr 2fr 1fr;

gap : L'espacement (gouttières) 📏

/* Même espace partout */
.grid { gap: 20px; }

/* Espaces différents */
.grid {
    row-gap: 30px;
    column-gap: 20px;
}
🧱 Analogie : Le joint entre les carreaux !

Placer les items dans la grille 🎯

/* Placement automatique (défaut) */
.grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
}

/* Placement manuel */
.item1 {
    grid-column: 1 / 3;  /* Colonnes 1 et 2 */
    grid-row: 1 / 3;     /* Lignes 1 et 2 */
}
grid-column: 1 / 3 = de ligne 1 à ligne 3

grid-column et grid-row expliqués 🔬

🗺️ Analogie : Coordonnées GPS
• grid-column: 1 / 3 = "Colonne 1 → 3"
• grid-row: 2 / 4 = "Ligne 2 → 4"
/* Image en vedette (2x2) */
.featured {
    grid-column: 1 / 3;  /* 2 colonnes */
    grid-row: 1 / 3;     /* 2 lignes */
}

/* Alternative avec span */
.featured {
    grid-column: span 2;
    grid-row: span 2;
}

grid-template-areas : Nommer les zones 🏷️

.page {
    display: grid;
    grid-template-columns: 250px 1fr;
    grid-template-rows: auto 1fr auto;
    grid-template-areas:
        "header  header"
        "sidebar main"
        "footer  footer";
}

.header  { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main    { grid-area: main; }
.footer  { grid-area: footer; }

grid-template-areas : Exemple visuel 👁️

grid-template-areas:
    "header  header"
    "sidebar main"
    "footer  footer";
📖 Structure créée :
Header en haut (pleine largeur)
Sidebar à gauche, Main à droite
Footer en bas (pleine largeur)
💡 Avantage : Vous VOYEZ votre layout dans le code !

Grilles responsives automatiques ✨

/* Formule magique responsive */
.grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
    gap: 20px;
}

/* Aucune media query nécessaire ! */
🧩 Analogie : Tetris automatique
Les items s'arrangent automatiquement :
• Écran large → 4 colonnes
• Mobile → 1 colonne

auto-fit vs auto-fill : La nuance 🤓

/* auto-fit : Étire les items */
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));

/* auto-fill : Garde colonnes vides */
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
💡 Dans 90% des cas : Utilisez auto-fit

minmax() : Contrôler min et max 📏

.grid {
    grid-template-columns: repeat(3, minmax(200px, 1fr));
}

/* minmax(minimum, maximum) */
🎚️ Analogie : Un élastique
• 200px = Élastique au repos (min)
• 1fr = Élastique étiré (max)
minmax(200px, 1fr) = min 200px, max flexible

Alignement dans Grid 🎯

.container {
    display: grid;
    
    /* Aligner les items dans leurs cellules */
    justify-items: center;
    align-items: center;
    
    /* Aligner la grille dans le container */
    justify-content: center;
    align-content: center;
}

/* Sur un item spécifique : */
.item { justify-self: end; }

Exemple : Galerie responsive 🖼️

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

.gallery img {
    width: 100%;
    height: 250px;
    object-fit: cover;
}
✨ Aucune media query !

Exemple : Layout de page 📄

.page {
    display: grid;
    grid-template-columns: 250px 1fr;
    grid-template-rows: auto 1fr auto;
    grid-template-areas:
        "header  header"
        "sidebar main"
        "footer  footer";
    min-height: 100vh;
}

@media (max-width: 767px) {
    .page {
        grid-template-columns: 1fr;
        grid-template-areas: "header" "main" "sidebar" "footer";
    }
}

Grid : Cas d'usage 💼

✅ Utilisez Grid pour :
• Layouts de page complets (header/main/footer)
• Galeries d'images organisées
• Dashboards et tableaux de bord
• Grilles de produits/cartes
• Designs complexes avec zones définies
• Calendriers et emplois du temps
🎯 En résumé : Grid = Votre outil pour créer des structures complètes en 2D

Flexbox vs Grid : Quand utiliser quoi ? 🤔

La règle d'or :
• Flexbox = Composants et éléments 1D
• Grid = Structure de page et layouts 2D
• Les deux ensemble = La puissance maximale !

Utilisez Flexbox pour : 📦

  • 🧭 Navigation (horizontale ou verticale)
  • 🎯 Centrage d'éléments
  • 📱 Listes de cartes qui wrap
  • ⚖️ Distribution d'espace
  • 🎨 Barres d'outils et boutons
Exemples : Menu, footer, badges, réseaux sociaux

Utilisez Grid pour : 🎨

  • 📐 Layouts de page complets
  • 🖼️ Galeries d'images en grille
  • 📊 Dashboards et tableaux
  • 🎨 Designs complexes avec zones
  • 📱 Grilles responsive auto
Exemples : Page avec sidebar, galerie produits, portfolio

La question à se poser 💭

"Est-ce que je dois contrôler
les lignes ET les colonnes ?"
✅ OUI → Utilisez Grid
(ex: layout de page, galerie structurée)
❌ NON → Utilisez Flexbox
(ex: menu horizontal, liste de boutons)

Combinez les deux ! 🎯

Grid pour la structure + Flexbox pour les composants
/* Grid pour la page */
.page { display: grid; }

/* Flexbox pour la nav */
.nav { display: flex; }

/* Grid pour les cartes */
.cards { display: grid; }

/* Flexbox dans chaque carte */
.card { display: flex; }

Exemple : Blog responsive 📝

🏗️ L'architecture :
• Grid = Structure de page
• Flexbox = Navigation
• Grid = Liste articles
• Flexbox = Contenu articles
/* Structure Grid */
.blog { display: grid; grid-template-areas: "h h" "m s" "f f"; }

/* Nav Flexbox */
.nav { display: flex; gap: 20px; }

/* Articles Grid */
.articles { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }

Récapitulatif 🎯

  • ✅ Responsive : Media queries + Mobile First
  • ✅ Flexbox : Layouts 1D
  • ✅ Grid : Layouts 2D
  • ✅ Combinaison : Grid + Flexbox = 💪

Points clés à retenir 💡

Mobile First : Coder mobile d'abord
Flexbox : 1 dimension (row OU column)
Grid : 2 dimensions (rows ET columns)

Le pense-bête ultime 📋

🚀 Démarrage rapide :
/* Centrage Flexbox */
.container { display: flex; justify-content: center; align-items: center; }

/* Galerie responsive Grid */
.gallery { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 20px; }

/* Layout page Grid */
.page { display: grid; grid-template-areas: "h h" "s m" "f f"; }
💡 Conseil : Gardez ces 3 snippets sous la main, ils couvrent 80% des cas d'usage !

Ressources pour pratiquer 🎮

Flexbox

  • 🐸 Flexbox Froggy : flexboxfroggy.com
  • ⚔️ Flexbox Defense : flexboxdefense.com
  • 📖 CSS Tricks Guide : css-tricks.com/snippets/css/a-guide-to-flexbox/

Ressources pour pratiquer 🎮

CSS Grid

  • 🌱 Grid Garden : cssgridgarden.com
  • 🎨 Grid by Example : gridbyexample.com
  • 📖 CSS Tricks Guide : css-tricks.com/snippets/css/complete-guide-grid/

Ressources pour pratiquer 🎮

Général

  • 📱 MDN Web Docs : developer.mozilla.org
  • 🔧 Can I Use : caniuse.com (compatibilité navigateurs)
  • 🎯 DevTools : F12 dans votre navigateur !
💡 Conseil : Pratiquez sur vos propres projets, c'est le meilleur apprentissage !

Merci ! 👏

Des questions ?

🎯 Dernière analogie :
Apprendre Flexbox et Grid, c'est comme apprendre à conduire :
Au début c'est compliqué, mais après quelques heures de pratique,
ça devient naturel et vous ne pourrez plus vous en passer ! 🚗

N'oubliez pas : la pratique est la clé de la maîtrise !