← Retour à la liste

CSS Grid et Flexbox : La mise en page moderne

Table des matières


Créez des layouts flexibles et responsives en combinant intelligemment CSS Grid et Flexbox. Ces deux systèmes de mise en page révolutionnent notre approche du design web et offrent des possibilités infinies.

Comprendre la différence fondamentale

Flexbox : Alignement unidimensionnel

Flexbox excelle pour l'alignement et la distribution d'éléments dans une seule direction :

.flex-container {
  display: flex;
  justify-content: space-between; /* axe principal */
  align-items: center; /* axe transversal */
  gap: 1rem;
}

Grid : Contrôle bidimensionnel

Grid permet de créer des layouts complexes en deux dimensions simultanément :

.grid-container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: auto 1fr auto;
  gap: 1rem;
}

Retour au sommaire

Patterns modernes avec CSS Grid

Layout Application complète

.app-layout {
  display: grid;
  grid-template-areas:
    "header header header"
    "sidebar main aside"
    "footer footer footer";
  grid-template-columns: 250px 1fr 200px;
  grid-template-rows: auto 1fr auto;
  min-height: 100vh;
  gap: 1rem;
}

.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) {
  .app-layout {
    grid-template-areas:
      "header"
      "main"
      "sidebar"
      "footer";
    grid-template-columns: 1fr;
  }
}

Grid Cards responsives

.cards-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: 2rem;
  padding: 2rem;
}

.card {
  background: white;
  border-radius: 12px;
  padding: 1.5rem;
  box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
  transition: transform 0.2s ease, box-shadow 0.2s ease;
}

.card:hover {
  transform: translateY(-4px);
  box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
}

Magazine Layout avec Grid

.magazine-layout {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  grid-template-rows: repeat(4, 200px);
  gap: 1rem;
  max-width: 1200px;
  margin: 0 auto;
}

.featured-article {
  grid-column: 1 / 4;
  grid-row: 1 / 3;
}

.secondary-article {
  grid-column: 4 / 7;
  grid-row: 1 / 2;
}

.trending {
  grid-column: 4 / 7;
  grid-row: 2 / 3;
}

.news-grid {
  grid-column: 1 / 7;
  grid-row: 3 / 5;

  /* Grid imbriqué */
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 1rem;
}

Retour au sommaire

Patterns avancés avec Flexbox

.navbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 1rem 2rem;
  background: white;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}

.nav-brand {
  font-size: 1.5rem;
  font-weight: bold;
}

.nav-menu {
  display: flex;
  list-style: none;
  gap: 2rem;
  margin: 0;
}

.nav-actions {
  display: flex;
  gap: 1rem;
  align-items: center;
}

/* Navigation mobile */
@media (max-width: 768px) {
  .navbar {
    flex-wrap: wrap;
  }

  .nav-menu {
    flex-basis: 100%;
    flex-direction: column;
    padding-top: 1rem;
  }
}

Système de cartes flexibles

.card-container {
  display: flex;
  flex-direction: column;
  height: 400px;
  border-radius: 12px;
  overflow: hidden;
  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
}

.card-image {
  flex: 0 0 200px; /* hauteur fixe */
  background: cover center;
}

.card-content {
  flex: 1; /* prend l'espace restant */
  padding: 1.5rem;
  display: flex;
  flex-direction: column;
}

.card-title {
  font-size: 1.25rem;
  font-weight: 600;
  margin-bottom: 0.5rem;
}

.card-description {
  flex: 1; /* pousse les actions vers le bas */
  color: #666;
  line-height: 1.6;
}

.card-actions {
  display: flex;
  gap: 1rem;
  margin-top: 1rem;
  padding-top: 1rem;
  border-top: 1px solid #eee;
}

Retour au sommaire

Combinaison Grid + Flexbox

Dashboard complexe

.dashboard {
  display: grid;
  grid-template-areas:
    "header header"
    "sidebar main"
    "sidebar footer";
  grid-template-columns: 280px 1fr;
  grid-template-rows: auto 1fr auto;
  min-height: 100vh;
  gap: 1rem;
}

/* Header avec navigation flexible */
.dashboard-header {
  grid-area: header;
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 1rem 2rem;
  background: #1a1a1a;
  color: white;
}

.header-nav {
  display: flex;
  gap: 2rem;
}

/* Sidebar avec flexbox pour l'organisation verticale */
.dashboard-sidebar {
  grid-area: sidebar;
  display: flex;
  flex-direction: column;
  padding: 1rem;
  background: #f8f9fa;
}

.sidebar-menu {
  flex: 1;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}

.sidebar-footer {
  margin-top: auto;
  padding-top: 1rem;
  border-top: 1px solid #dee2e6;
}

/* Zone principale avec grid pour les widgets */
.dashboard-main {
  grid-area: main;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
  gap: 1.5rem;
  padding: 1.5rem;
}

.widget {
  background: white;
  border-radius: 8px;
  padding: 1.5rem;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);

  /* Flexbox pour l'organisation interne */
  display: flex;
  flex-direction: column;
}

.widget-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 1rem;
}

.widget-content {
  flex: 1;
}

Galerie d'images avec Masonry

.masonry-gallery {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  grid-gap: 1rem;
  grid-auto-rows: 10px; /* Petites rangées pour l'effet masonry */
}

.gallery-item {
  display: flex;
  flex-direction: column;
  border-radius: 8px;
  overflow: hidden;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}

.gallery-image {
  width: 100%;
  height: auto;
  object-fit: cover;
}

.gallery-caption {
  padding: 1rem;
  background: white;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}

Retour au sommaire

Techniques responsives modernes

Container Queries (2024)

.component {
  container-type: inline-size;
}

@container (min-width: 400px) {
  .component-content {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 1rem;
  }
}

@container (min-width: 600px) {
  .component-content {
    grid-template-columns: repeat(3, 1fr);
  }
}

Breakpoints modernes avec Grid

.responsive-grid {
  display: grid;
  gap: 1rem;

  /* Mobile first */
  grid-template-columns: 1fr;

  /* Tablet */
  @media (min-width: 768px) {
    grid-template-columns: repeat(2, 1fr);
  }

  /* Desktop */
  @media (min-width: 1024px) {
    grid-template-columns: repeat(3, 1fr);
  }

  /* Large screens */
  @media (min-width: 1440px) {
    grid-template-columns: repeat(4, 1fr);
  }
}

Auto-fit vs Auto-fill

/* Auto-fit : colonnes s'étendent pour remplir l'espace */
.auto-fit-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: 1rem;
}

/* Auto-fill : garde les colonnes vides */
.auto-fill-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
  gap: 1rem;
}

Retour au sommaire

Animations et transitions

Smooth layout transitions

.animated-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 1rem;
  transition: all 0.3s ease;
}

.grid-item {
  background: white;
  border-radius: 8px;
  padding: 1rem;
  transition: transform 0.2s ease, box-shadow 0.2s ease;
}

.grid-item:hover {
  transform: scale(1.02);
  box-shadow: 0 8px 30px rgba(0, 0, 0, 0.15);
}

/* Animation d'apparition */
@keyframes fadeInUp {
  from {
    opacity: 0;
    transform: translateY(20px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.grid-item {
  animation: fadeInUp 0.6s ease forwards;
}

.grid-item:nth-child(2) {
  animation-delay: 0.1s;
}
.grid-item:nth-child(3) {
  animation-delay: 0.2s;
}
.grid-item:nth-child(4) {
  animation-delay: 0.3s;
}

Flexbox avec animations

.flex-menu {
  display: flex;
  gap: 0;
  overflow: hidden;
  border-radius: 12px;
  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
}

.menu-item {
  flex: 1;
  padding: 1rem;
  background: #f8f9fa;
  text-align: center;
  cursor: pointer;
  transition: flex 0.4s ease, background-color 0.3s ease;
  position: relative;
}

.menu-item:hover {
  flex: 2; /* S'étend au hover */
  background: #007bff;
  color: white;
}

.menu-item::after {
  content: "";
  position: absolute;
  bottom: 0;
  left: 0;
  width: 0;
  height: 3px;
  background: #007bff;
  transition: width 0.3s ease;
}

.menu-item:hover::after {
  width: 100%;
}

Retour au sommaire

Patterns utilitaires

Centre parfait (Grid)

.perfect-center {
  display: grid;
  place-items: center;
  min-height: 100vh;
}

/* Alternative avec Flexbox */
.flex-center {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
}

Layout Holy Grail moderne

.holy-grail {
  display: grid;
  grid-template:
    "header header header" auto
    "nav main aside" 1fr
    "footer footer footer" auto
    / 200px 1fr 150px;
  min-height: 100vh;
  gap: 1rem;
}

@media (max-width: 768px) {
  .holy-grail {
    grid-template:
      "header" auto
      "nav" auto
      "main" 1fr
      "aside" auto
      "footer" auto
      / 1fr;
  }
}

Retour au sommaire

Bonnes pratiques et accessibilité

.interactive-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: 1rem;
}

.grid-card {
  cursor: pointer;
  border-radius: 8px;
  transition: all 0.2s ease;
}

.grid-card:focus {
  outline: 3px solid #007bff;
  outline-offset: 2px;
  transform: scale(1.02);
}

/* Navigation avec les flèches */
.grid-card:focus-visible {
  box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.25);
}

Responsive text scaling

.responsive-text {
  /* Texte qui s'adapte à la largeur du conteneur */
  font-size: clamp(1rem, 2.5vw, 2rem);
  line-height: 1.4;
}

.container {
  /* Largeur fluide avec limites */
  width: min(90%, 1200px);
  margin: 0 auto;
}

Retour au sommaire

Performance et optimisation

CSS Containment

.independent-component {
  contain: layout style paint;
  /* Isole le composant pour les optimisations du navigateur */
}

.list-item {
  contain: layout;
  /* Optimise les recalculs lors d'ajouts/suppressions */
}

Lazy loading avec CSS

.lazy-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 2rem;
}

.lazy-item {
  opacity: 0;
  transform: translateY(50px);
  transition: opacity 0.6s ease, transform 0.6s ease;
}

.lazy-item.loaded {
  opacity: 1;
  transform: translateY(0);
}

/* Avec Intersection Observer en JavaScript */

Retour au sommaire

Conclusion

CSS Grid et Flexbox forment ensemble la base du design web moderne. Leur combinaison intelligente permet de créer des interfaces à la fois performantes, accessibles et visuellement attrayantes.

Règles d'or pour 2025

  • Grid pour les layouts bidimensionnels (pages, sections)
  • Flexbox pour les composants unidimensionnels (barres de navigation, cartes)
  • Container Queries pour une responsivité basée sur le composant
  • Animations CSS pour améliorer l'expérience utilisateur
  • Performance : utilisez contain pour optimiser les rendus

Ressources essentielles

  • Firefox DevTools : Grid Inspector incontournable
  • Chrome DevTools : Flexbox debugging
  • Can I Use : Support des nouvelles fonctionnalités
  • CSS Grid Garden : Apprendre Grid de façon ludique

L'avenir du CSS est déjà là, et ces techniques vous permettront de créer des expériences web exceptionnelles ! 🚀

Retour au sommaire