Séance 6 - DSP - USAL33
Flexbox
display: flex
flex-direction
justify-content
align-items
flex-wrap
Aujourd'hui :
Flexbox : unidimensionnel
Grid : bidimensionnel
Ils sont complémentaires, pas concurrents
.container { display: grid; }
Effet immédiat :
Pour créer plusieurs colonnes, il faut définir la grille
.container { display: grid; grid-template-columns: 200px 200px 200px; }
Résultat : 3 colonnes de 200px chacune
Syntaxe : Chaque valeur = une colonne
/* 2 colonnes */ grid-template-columns: 300px 500px; /* 4 colonnes égales */ grid-template-columns: 200px 200px 200px 200px;
fr
fr = fraction de l'espace disponible
.container { display: grid; grid-template-columns: 1fr 1fr 1fr; }
Résultat : 3 colonnes égales qui se partagent l'espace
Avantage : S'adapte automatiquement à la largeur du container
.container { display: grid; grid-template-columns: 250px 1fr; }
Résultat :
Usage : Sidebar fixe + contenu flexible
repeat()
Éviter la répétition avec repeat()
/* Au lieu de */ grid-template-columns: 1fr 1fr 1fr 1fr; /* On écrit */ grid-template-columns: repeat(4, 1fr);
Syntaxe : repeat(nombre, taille)
repeat(nombre, taille)
/* 3 colonnes de 200px */ grid-template-columns: repeat(3, 200px);
.container { display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: 100px 200px; }
En pratique : On définit rarement les lignes explicitement
gap
.container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
Effet : 20px d'espace entre chaque cellule
Variantes :
/* Espacement différent vertical/horizontal */ gap: 30px 20px; /* vertical horizontal */ /* Ou séparément */ row-gap: 30px; column-gap: 20px;
auto-fit
.container { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 20px; }
Usage : Galeries d'images, grilles de cartes
minmax()
minmax(min, max) = taille entre min et max
minmax(min, max)
grid-template-columns: repeat(3, minmax(200px, 1fr));
Signification :
Résultat : Colonnes flexibles avec taille minimale garantie
.item { grid-column: span 2; }
Effet : L'item occupe 2 colonnes
Exemple :
.header { grid-column: span 3; /* Occupe 3 colonnes */ }
Usage : Headers, footers, éléments mis en avant
.item { grid-column: 1 / 3; /* De la ligne 1 à la ligne 3 */ grid-row: 1 / 2; /* De la ligne 1 à la ligne 2 */ }
Les lignes de la grille sont numérotées
1 2 3 4 1 | A | B | C | 2 | D | E | F | 3 | G | H | I |
.container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; } .header { grid-column: span 3; /* Toute la largeur */ } .sidebar { grid-column: 1; grid-row: 2 / 4; /* 2 lignes de hauteur */ } .footer { grid-column: span 3; }
Responsive = qui s'adapte à la taille de l'écran
Un site responsive fonctionne sur :
Objectif : Une seule version du site pour tous les appareils
En 2026 :
Sans responsive :
Media queries = règles CSS selon la taille d'écran
/* Par défaut : mobile */ .container { padding: 10px; } /* À partir de 768px : tablette/desktop */ @media (min-width: 768px) { .container { padding: 40px; } }
Le CSS dans la media query s'applique SEULEMENT si la condition est vraie
@media (min-width: 768px) { /* CSS pour écrans de 768px et plus */ } @media (max-width: 767px) { /* CSS pour écrans de 767px et moins */ } @media (min-width: 768px) and (max-width: 1024px) { /* CSS pour écrans entre 768px et 1024px */ }
Mobile-first = on commence par le mobile
/* Mobile par défaut */ .container { padding: 10px; font-size: 14px; } /* Tablette */ @media (min-width: 768px) { .container { padding: 20px; font-size: 16px; } }
/* Desktop */ @media (min-width: 1024px) { .container { padding: 40px; font-size: 18px; } }
Breakpoints = points de rupture où le design change
@media (min-width: 768px)
@media (min-width: 1024px)
Ces valeurs ne sont pas fixes, adaptez-les à votre design
/* Mobile : menu vertical */ .nav { display: flex; flex-direction: column; } /* Desktop : menu horizontal */ @media (min-width: 768px) { .nav { flex-direction: row; } }
/* Mobile : 1 colonne */ .grid { display: grid; grid-template-columns: 1fr; gap: 15px; } /* Tablette : 2 colonnes */ @media (min-width: 768px) { .grid { grid-template-columns: repeat(2, 1fr); } } /* Desktop : 3 colonnes */ @media (min-width: 1024px) { .grid { grid-template-columns: repeat(3, 1fr); gap: 30px; } }
/* Mobile : pas de sidebar */ .layout { display: flex; flex-direction: column; } /* Desktop : sidebar + contenu */ @media (min-width: 1024px) { .layout { flex-direction: row; } .sidebar { flex: 0 0 250px; } .content { flex: 1; } }
Unités fixes :
px
Unités relatives (meilleures pour le responsive) :
%
em
rem
vw
vh
/* Largeur en pourcentage */ .container { width: 90%; /* 90% de la largeur du parent */ max-width: 1200px; /* Maximum 1200px */ } /* Taille de police relative */ body { font-size: 16px; } h1 { font-size: 2rem; /* 2 × 16px = 32px */ } /* Hauteur viewport */ .hero { height: 100vh; /* Hauteur de l'écran */ }
Obligatoire dans le <head> pour le responsive
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
Effet :
width=device-width
initial-scale=1.0
Sans cette balise, le responsive ne fonctionne pas sur mobile
img { max-width: 100%; height: auto; }
Bonne pratique : Appliquer sur toutes les images
/* Masquer sur mobile */ .desktop-only { display: none; } @media (min-width: 768px) { .desktop-only { display: block; } } /* Masquer sur desktop */ .mobile-only { display: block; } @media (min-width: 768px) { .mobile-only { display: none; } }
Objectif : Galerie de 6 images qui s'adapte
Mobile : 1 colonne Tablette : 2 colonnes Desktop : 3 colonnes
<div class="gallery"> <img src="img1.jpg" alt="Photo 1"> <img src="img2.jpg" alt="Photo 2"> <!-- ... 6 images au total --> </div>
Créez le CSS pour obtenir ce comportement
.gallery { display: grid; grid-template-columns: 1fr; gap: 15px; } .gallery img { width: 100%; height: 250px; object-fit: cover; } @media (min-width: 768px) { .gallery { grid-template-columns: repeat(2, 1fr); } } @media (min-width: 1024px) { .gallery { grid-template-columns: repeat(3, 1fr); gap: 20px; } }
Pour créer une grille :
display: grid;
grid-template-columns
Unité fr : Fraction de l'espace disponible
repeat() : Éviter la répétition
auto-fit + minmax() : Grille responsive automatique
Positionnement : grid-column: span X pour occuper plusieurs colonnes
grid-column: span X
Media queries : Appliquer du CSS selon la taille d'écran
Approche mobile-first : Commencer par le mobile, ajouter pour desktop
Breakpoints courants :
Balise viewport : Obligatoire dans le <head>
Images : max-width: 100%; pour qu'elles s'adaptent
max-width: 100%;
Utilisez Grid pour :
Utilisez Flexbox pour :
Souvent, on combine les deux