Flexbox vs CSS Grid : Quand utiliser quoi ?
Flexbox : Pour les layouts 1D
- Navigation horizontale/verticale
- Centrage d'éléments
- Distribution d'espace entre éléments
- Alignement d'éléments dans un container
CSS Grid : Pour les layouts 2D
- Grilles complexes
- Layouts de page entière
- Positionnement précis dans un tableau
- Superposition d'éléments
Flexbox en pratique
Centrage parfait
.center {
display: flex;
justify-content: center; /* Horizontalement */
align-items: center; /* Verticalement */
min-height: 100vh;
}
/* Centrage avec auto margins */
.center-alternative {
display: flex;
}
.center-alternative > * {
margin: auto;
}
Navigation responsive
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem;
gap: 1rem;
}
.nav-links {
display: flex;
gap: 1rem;
list-style: none;
margin: 0;
padding: 0;
}
@media (max-width: 768px) {
.navbar {
flex-direction: column;
gap: 0.5rem;
}
.nav-links {
flex-wrap: wrap;
justify-content: center;
}
}
Cards responsive
.card-container {
display: flex;
flex-wrap: wrap;
gap: 1rem;
padding: 1rem;
}
.card {
flex: 1 1 300px; /* grow shrink basis */
min-width: 0; /* Permet le shrinking */
padding: 1rem;
border: 1px solid #ddd;
border-radius: 8px;
}
/* Alternative avec flex-basis pour contrôler la taille */
.card-fixed {
flex: 0 0 calc(33.333% - 1rem);
}
@media (max-width: 768px) {
.card-fixed {
flex: 0 0 calc(50% - 1rem);
}
}
@media (max-width: 480px) {
.card-fixed {
flex: 0 0 100%;
}
}
CSS Grid avancé
Layout de magazine
.magazine-layout {
display: grid;
grid-template-columns: 200px 1fr 200px;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header header"
"sidebar main aside"
"footer footer footer";
gap: 1rem;
min-height: 100vh;
max-width: 1200px;
margin: 0 auto;
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.aside { grid-area: aside; }
.footer { grid-area: footer; }
/* Version responsive */
@media (max-width: 768px) {
.magazine-layout {
grid-template-columns: 1fr;
grid-template-areas:
"header"
"main"
"sidebar"
"aside"
"footer";
}
}
Grille responsive automatique
.auto-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 1rem;
padding: 1rem;
}
/* Avec auto-fill pour garder les colonnes même vides */
.auto-grid-fill {
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
}
/* Grille responsive avec CSS custom properties */
.dynamic-grid {
--min-column-width: 300px;
display: grid;
grid-template-columns: repeat(
auto-fit,
minmax(var(--min-column-width), 1fr)
);
gap: 1rem;
}
@media (max-width: 768px) {
.dynamic-grid {
--min-column-width: 250px;
}
}
Grid avec placement explicite
.complex-grid {
display: grid;
grid-template-columns: repeat(6, 1fr);
grid-template-rows: repeat(4, 100px);
gap: 10px;
}
.item-1 {
grid-column: 1 / 3; /* Colonnes 1 et 2 */
grid-row: 1 / 3; /* Lignes 1 et 2 */
}
.item-2 {
grid-column: 3 / -1; /* Colonne 3 jusqu'à la fin */
grid-row: 1;
}
.item-3 {
grid-column: 3 / 5;
grid-row: 2 / 4;
}
/* Alternative avec grid-area */
.item-4 {
grid-area: 3 / 1 / 5 / 3; /* row-start / col-start / row-end / col-end */
}
Techniques modernes CSS 2025
Subgrid (support croissant)
.parent {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1rem;
}
.child {
display: grid;
grid-column: span 2;
grid-template-columns: subgrid; /* Hérite des colonnes du parent */
gap: inherit; /* Hérite du gap aussi */
}
.grandchild {
/* S'aligne automatiquement avec la grille du grand-parent */
}
Container Queries
.card {
container-type: inline-size;
padding: 1rem;
border: 1px solid #ddd;
}
.card-content {
display: block;
}
/* Le layout change selon la taille du container, pas de la viewport */
@container (min-width: 400px) {
.card-content {
display: grid;
grid-template-columns: auto 1fr;
gap: 1rem;
}
}
@container (min-width: 600px) {
.card-content {
grid-template-columns: 200px 1fr auto;
}
}
Logical Properties
/* Au lieu de margin-left/right */
.element {
margin-inline: 1rem; /* margin-left + margin-right */
margin-block: 0.5rem; /* margin-top + margin-bottom */
padding-inline-start: 1rem; /* padding-left en LTR, padding-right en RTL */
border-inline-end: 1px solid #ddd; /* border-right en LTR */
}
/* Tailles logiques */
.box {
inline-size: 300px; /* width */
block-size: 200px; /* height */
max-inline-size: 100%; /* max-width */
}
CSS Grid avec aspect-ratio
.image-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 1rem;
}
.image-item {
aspect-ratio: 16 / 9;
overflow: hidden;
border-radius: 8px;
}
.image-item img {
width: 100%;
height: 100%;
object-fit: cover;
}
/* Cards avec ratio fixe */
.card-square {
aspect-ratio: 1;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
Combinaisons Grid + Flexbox
/* Layout principal en Grid */
.app-layout {
display: grid;
grid-template-rows: auto 1fr auto;
min-height: 100vh;
}
/* Navigation en Flexbox */
.header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem;
}
.nav-menu {
display: flex;
gap: 1rem;
list-style: none;
}
/* Contenu principal avec Grid pour les sections */
.main-content {
display: grid;
grid-template-columns: 250px 1fr;
gap: 2rem;
padding: 2rem;
}
/* Sidebar avec Flexbox pour les éléments */
.sidebar {
display: flex;
flex-direction: column;
gap: 1rem;
}
/* Articles en Grid */
.articles-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
}
/* Chaque article en Flexbox */
.article-card {
display: flex;
flex-direction: column;
border: 1px solid #ddd;
border-radius: 8px;
overflow: hidden;
}
.article-content {
flex: 1;
padding: 1rem;
display: flex;
flex-direction: column;
}
.article-title {
margin: 0 0 0.5rem 0;
}
.article-excerpt {
flex: 1;
margin: 0 0 1rem 0;
}
.article-meta {
margin-top: auto;
display: flex;
justify-content: space-between;
align-items: center;
font-size: 0.875rem;
color: #666;
}
Bonnes pratiques 2025
1. Mobile-first avec CSS Grid
/* Base mobile */
.responsive-grid {
display: grid;
grid-template-columns: 1fr;
gap: 1rem;
}
/* Tablet */
@media (min-width: 768px) {
.responsive-grid {
grid-template-columns: repeat(2, 1fr);
}
}
/* Desktop */
@media (min-width: 1024px) {
.responsive-grid {
grid-template-columns: repeat(3, 1fr);
}
}
/* Large desktop */
@media (min-width: 1200px) {
.responsive-grid {
grid-template-columns: repeat(4, 1fr);
}
}
2. CSS Custom Properties pour la flexibilité
:root {
--grid-columns: 1;
--grid-gap: 1rem;
--card-min-width: 250px;
}
.adaptive-grid {
display: grid;
grid-template-columns: repeat(var(--grid-columns), 1fr);
gap: var(--grid-gap);
}
@media (min-width: 768px) {
:root {
--grid-columns: 2;
--grid-gap: 1.5rem;
--card-min-width: 300px;
}
}
@media (min-width: 1024px) {
:root {
--grid-columns: 3;
--grid-gap: 2rem;
}
}
3. Accessibilité et performance
/* Respecter les préférences de mouvement */
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
/* Focus visible pour l'accessibilité */
.card {
outline: 2px solid transparent;
transition: outline-color 0.2s;
}
.card:focus-visible {
outline-color: #4f46e5;
}
/* Optimisation des performances */
.grid-container {
contain: layout style;
will-change: auto;
}
Ces techniques modernes vous permettront de créer des layouts robustes, accessibles et performants en 2025 !
