Formation DWWM - Les fondamentaux du layout moderne
2025 - 2026
Adapter votre site à tous les écrans
3 types d'écrans :
/* 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; }
}
/* Explication détaillée */
@media (min-width: 768px) {
/* Styles ici */
}
/* Traduction : "À partir de 768px de large" */
@media (min-width: 768px) signifie :| 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 name="viewport" content="width=device-width, initial-scale=1.0">
/* 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;
}
}
Les layouts en une dimension
/* Avant */
.container { /* Rien */ }
/* Après : activation ! */
.container { display: flex; }
/* Horizontal (défaut) */
.container { flex-direction: row; } /* ➡️ */
/* Vertical */
.container { flex-direction: column; } /* ⬇️ */
row = Livres côte à côte →column = Livres empilés ↓
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 */
}
flex-start : [🟦🟦🟦___________]center : [______🟦🟦🟦______]space-between : [🟦____🟦____🟦]
flex-start = Toutes à gauchecenter = Au centre (dîner romantique)space-between = Face à facespace-evenly = Équidistantes
/* Menu de navigation */
.nav {
display: flex;
justify-content: space-between;
}
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 */
}
justify-content = Axe PRINCIPALalign-items = Axe SECONDAIRE
/* LA technique de centrage ultime */
.container {
display: flex;
justify-content: center; /* Centre horizontalement */
align-items: center; /* Centre verticalement */
height: 100vh;
}
justify-content = Gauche-droitealign-items = Haut-bas.container {
display: flex;
gap: 20px; /* 20px entre CHAQUE item */
}
/* Ou séparé : */
.container {
row-gap: 20px;
column-gap: 30px;
}
/* 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;
}
nowrap = Écrire jusqu'au bordwrap = Passer à la ligne
/* 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 */
}
.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: [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 */
flex: 1 ou flex: 0 0 XXXpx
.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; }
}
Les layouts en deux dimensions
.container {
display: grid;
grid-template-columns: 200px 200px 200px;
grid-template-rows: 100px 100px;
gap: 20px;
}
/* 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);
1fr 1fr 1fr = 3 parts égales2fr 1fr 1fr = Premier a 2 parts250px 1fr 1fr = Part fixe + reste
.layout {
display: grid;
grid-template-columns: 250px 1fr;
}
/* Pixels */
grid-template-rows: 100px 200px 100px;
/* Auto (selon contenu) */
grid-template-rows: auto auto auto;
/* fr */
grid-template-rows: 1fr 2fr 1fr;
/* Même espace partout */
.grid { gap: 20px; }
/* Espaces différents */
.grid {
row-gap: 30px;
column-gap: 20px;
}
/* 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: 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;
}
.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:
"header header"
"sidebar main"
"footer footer";
/* Formule magique responsive */
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
}
/* Aucune media query nécessaire ! */
/* 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));
auto-fit
.grid {
grid-template-columns: repeat(3, minmax(200px, 1fr));
}
/* minmax(minimum, maximum) */
minmax(200px, 1fr) = min 200px, max flexible
.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; }
.gallery {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
}
.gallery img {
width: 100%;
height: 250px;
object-fit: cover;
}
.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 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; }
/* 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)); }
/* 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"; }
N'oubliez pas : la pratique est la clé de la maîtrise !