Quand on crée une grille de cartes ou d’éléments avec Flexbox, on veut souvent répartir 3 éléments par ligne, avec des espaces constants entre eux. Mais un problème classique se pose :
👉 Comment gérer la dernière ligne si elle ne contient que 1 ou 2 éléments ?
🧨 Le problème classique
Prenons un container avec 3 cartes par ligne. Quand on en a un multiple de 3 (3, 6, 9…), tout va bien.
Mais si on en a 4, 5, 7… la dernière ligne est incomplète, et les éléments peuvent :
- Être mal alignés (pas de centrage)
- Avoir une largeur déformée
- Être trop petits à cause des flex: 1 ou d’un width: 33.33% qui n’intègre pas les marges
✅ La solution : width: calc(...)
Plutôt que de laisser le navigateur faire ses calculs, on reprend la main avec calc() :
width: calc((100% - 80px) / 3);
100%
: largeur totale disponible80px
: total des espaces entre les 3 éléments (par exemple 2 × gap: 40px)/ 3
: nombre d’éléments souhaité par ligne
Même si une ligne n’a que 1 ou 2 éléments, leur largeur restera la même, et ils ne s’étireront pas.
💻 Exemple concret
HTML
1
2
3
4
5
CSS
.container {
display: flex;
flex-wrap: wrap;
gap: 40px;
}
.item {
width: calc((100% - 80px) / 3);
background: #eee;
padding: 20px;
box-sizing: border-box;
}
💡 Ici, flex-wrap: wrap
permet aux items d’aller à la ligne quand il n’y a plus de place, tout en gardant exactement la même largeur sur toutes les lignes, même s’il n’y a qu’un ou deux items à la fin.
📱 Ajout du responsive
Combine avec des media queries pour adapter dynamiquement le nombre de colonnes :
@media (min-width: 1024px) {
.item {
width: calc((100% - 80px) / 3);
}
}
@media (min-width: 768px) and (max-width: 1023px) {
.item {
width: calc((100% - 40px) / 2);
}
}
@media (max-width: 767px) {
.item {
width: 100%;
}
}
🎯 Conclusion
width: calc(...)
avec Flexbox permet de :
- Garder des espacements constants entre les éléments
- Aligner parfaitement les éléments sur toutes les lignes
- Éviter les pièges des grilles incomplètes
- Construire des grilles responsives simples et efficaces