CSS Grid et Design Responsive¶
Grilles et adaptation aux écrans¶
Séance 6 - DSP - USAL33
Rappel séance 5¶
Ce que nous avons vu¶
Flexbox
display: flexpour activer Flexboxflex-directionpour la directionjustify-contentpour l’axe principalalign-itemspour l’axe perpendiculaireflex-wrappour passer à la ligne
Aujourd’hui :
CSS Grid pour des layouts en 2D
Créer des grilles complexes
Design responsive avec media queries
1. CSS Grid¶
Flexbox vs Grid¶
Flexbox : unidimensionnel
Une direction à la fois (ligne OU colonne)
Idéal pour les composants
Grid : bidimensionnel
Lignes ET colonnes en même temps
Idéal pour les layouts de page
Ils sont complémentaires, pas concurrents
Activer CSS Grid¶
.container {
display: grid;
}
Effet immédiat :
Les enfants deviennent des grid items
Par défaut, ils s’empilent verticalement (1 colonne)
Pour créer plusieurs colonnes, il faut définir la grille
Définir les colonnes¶
.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;
L’unité fr (fraction)¶
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
Mélanger fr et pixels¶
.container {
display: grid;
grid-template-columns: 250px 1fr;
}
Résultat :
Colonne 1 : 250px fixe
Colonne 2 : prend le reste de l’espace
Usage : Sidebar fixe + contenu flexible
Fonction 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)
/* 3 colonnes de 200px */
grid-template-columns: repeat(3, 200px);
Définir les lignes¶
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: 100px 200px;
}
Résultat :
3 colonnes égales
2 lignes : première de 100px, deuxième de 200px
En pratique : On définit rarement les lignes explicitement
Espacement avec 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;
Grille responsive avec auto-fit¶
.container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
}
Résultat :
Crée autant de colonnes que possible
Chaque colonne fait au minimum 250px
S’adapte automatiquement à la largeur
Usage : Galeries d’images, grilles de cartes
Explication minmax()¶
minmax(min, max) = taille entre min et max
grid-template-columns: repeat(3, minmax(200px, 1fr));
Signification :
Minimum : 200px
Maximum : 1fr (s’étire si espace disponible)
Résultat : Colonnes flexibles avec taille minimale garantie
Positionner un item sur plusieurs colonnes¶
.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
Positionner un item précisément¶
.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 |
Exemple de grille complète¶
.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;
}
2. Design Responsive¶
Qu’est-ce que le responsive ?¶
Responsive = qui s’adapte à la taille de l’écran
Un site responsive fonctionne sur :
Ordinateur (1920px et plus)
Tablette (768px à 1024px)
Mobile (320px à 768px)
Objectif : Une seule version du site pour tous les appareils
Pourquoi c’est important ?¶
En 2026 :
Plus de 60% du trafic web vient du mobile
Google favorise les sites responsives dans les résultats
Sans responsive :
Texte illisible sur mobile
Utilisateurs qui zooment et scrollent horizontalement
Mauvaise expérience utilisateur
Les media queries¶
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
Syntaxe des media queries¶
@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 */
}
Approche mobile-first¶
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 courants¶
Breakpoints = points de rupture où le design change
Taille |
Device |
Breakpoint |
|---|---|---|
Mobile |
< 768px |
Par défaut |
Tablette |
768px - 1024px |
|
Desktop |
> 1024px |
|
Ces valeurs ne sont pas fixes, adaptez-les à votre design
Exemple : grille responsive¶
/* 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;
}
}
Unités relatives¶
Unités fixes :
px: pixels, taille fixe
Unités relatives (meilleures pour le responsive) :
%: pourcentage du parentem: relatif à la taille de police du parentrem: relatif à la taille de police racinevw: pourcentage de la largeur du viewportvh: pourcentage de la hauteur du viewport
Exemples d’unités relatives¶
/* 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 */
}
Balise meta viewport¶
Obligatoire dans le <head> pour le responsive
<meta name="viewport" content="width=device-width, initial-scale=1.0">
Effet :
width=device-width: largeur = largeur de l’écraninitial-scale=1.0: pas de zoom par défaut
Sans cette balise, le responsive ne fonctionne pas sur mobile
Images responsives¶
img {
max-width: 100%;
height: auto;
}
Effet :
L’image ne dépasse jamais son container
Elle garde ses proportions
Bonne pratique : Appliquer sur toutes les images
Masquer des éléments selon l’écran¶
/* 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;
}
}
Exercice pratique¶
Créer une grille responsive¶
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">
</div>
Créez le CSS pour obtenir ce comportement
Solution¶
.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;
}
}
Résumé¶
Points clés CSS Grid¶
Pour créer une grille :
display: grid;sur le containergrid-template-columnspour définir les colonnesgappour espacer les cellules
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
Points clés Responsive¶
Media queries : Appliquer du CSS selon la taille d’écran
Approche mobile-first : Commencer par le mobile, ajouter pour desktop
Breakpoints courants :
Mobile : < 768px
Tablette : 768px - 1024px
Desktop : > 1024px
Balise viewport : Obligatoire dans le <head>
Images : max-width: 100%; pour qu’elles s’adaptent
Grid vs Flexbox : quand utiliser quoi ?¶
Utilisez Grid pour :
Layouts de page complets
Grilles régulières (galeries, catalogues)
Positionnement en 2D (lignes ET colonnes)
Utilisez Flexbox pour :
Composants (navbars, cartes)
Alignement en 1D (ligne OU colonne)
Distribution d’espace flexible
Souvent, on combine les deux