Menu

Centrer une div en CSS : toutes les méthodes, mesurées

Toutes les façons de centrer une div horizontalement, verticalement ou les deux : flexbox, grid, margin auto, position absolue avec transform, inset avec margin auto, et align-content. Chaque méthode tourne en direct et mesure son propre centrage, avec un tableau pour savoir laquelle choisir.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

La réponse courte

Pour centrer une div horizontalement et verticalement dans son parent, faites du parent une grille et centrez son contenu :

.parent {
  display: grid;
  place-items: center;
  min-height: 200px; /* the parent needs room to center in */
}

Cela fonctionne pour un enfant de n'importe quelle taille et ne demande rien sur l'enfant lui-même. Voici six méthodes côte à côte. Chaque boîte se mesure après son affichage et indique l'écart entre son centre et celui de son parent :

Les six indiquent 0px sur les deux axes (la bordure de 1px de la scène est identique de chaque côté, elle ne décale donc pas le centre). Changez la largeur ou le texte d'une boîte et relancez : les méthodes qui ne dépendent pas d'une taille fixe restent à 0.

Quelle méthode utiliser

MéthodeCentreL'enfant a-t-il besoin d'une taille fixe ?Idéal pour
Grid place-items: centerLes deux axesNonLe choix par défaut : un enfant dans une boîte
Flexbox justify-content + align-itemsLes deux axesNonUne ligne ou une colonne d'éléments, centrés en groupe
margin: auto dans un parent flex ou gridLes deux axesNonCentrer un élément pendant que ses frères sont disposés autrement
margin: 0 autoHorizontal seulementUne width ou max-widthConteneurs de page, articles, formulaires dans le flux normal
Absolute + translate(-50%, -50%)Les deux axesNonSurcouches, badges et modales au-dessus d'un autre contenu
Absolute + inset: 0; margin: autoLes deux axesOui, largeur et hauteurBoîtes de dialogue de taille fixe
align-content: center sur un blocVerticalNonCentrer verticalement sans changer le display du parent

Méthode 1 : flexbox

Flexbox centre sur deux axes avec deux propriétés. justify-content gère l'axe principal (horizontal sur une ligne), et align-items l'axe secondaire :

Avec plusieurs enfants, flexbox les centre en groupe en les gardant sur une ligne. C'est là qu'il l'emporte sur grid, qui empilerait les trois éléments dans une colonne centrée. La page justify-content présente toutes les valeurs d'alignement.

Méthode 2 : grid

place-items: center est le raccourci de align-items: center plus justify-items: center. Sur un conteneur grid avec un seul enfant, il centre cet enfant dans les deux directions :

min-height plutôt que height permet au parent de grandir si la carte dépasse 180px de haut, au lieu que la carte déborde.

Méthode 3 : margin: 0 auto (horizontal)

Un élément de type bloc dont la largeur est inférieure à celle de son conteneur peut être centré horizontalement avec des marges latérales automatiques. Le navigateur partage l'espace libre à parts égales entre les deux côtés :

La deuxième boîte remplit toute la largeur : il n'y a pas d'espace libre et rien ne bouge. C'est la raison habituelle pour laquelle margin: 0 auto « ne fonctionne pas ». Il ne centre aussi qu'horizontalement dans le flux normal ; les marges auto verticales y valent 0. Dans un parent flex ou grid, en revanche, margin: auto centre dans les deux directions : c'est la troisième boîte de la comparaison ci-dessus.

Méthode 4 : position absolue et transform

Quand l'élément doit se placer au-dessus d'un autre contenu (un badge sur une photo, une modale sur la page), positionnez-le en absolu à 50 % et reculez-le de la moitié de sa propre taille :

top: 50%; left: 50% place le coin supérieur gauche de l'élément au centre. Les pourcentages de translate() se rapportent à la taille de l'élément lui-même : -50% le recule donc de la moitié de sa largeur et de sa hauteur, quelles qu'elles soient. Le parent doit être positionné (position: relative), sinon l'élément se centre sur la page. Le positionnement est traité sur la page position.

Une variante pour les éléments de taille connue : position: absolute; inset: 0; margin: auto; plus une width et une height. Les marges automatiques partagent l'espace sur les quatre côtés.

Méthode 5 : align-content sur un bloc normal

align-content: center fonctionne désormais aussi sur les conteneurs de type bloc ordinaires, pas seulement flex et grid. Il centre le contenu verticalement sans changer la disposition des enfants :

.parent {
  min-height: 200px;
  align-content: center;   /* vertical centering, still display: block */
}
.child {
  max-width: 300px;
  margin-inline: auto;     /* horizontal centering */
}

Il est pris en charge par les versions actuelles de Chrome, Firefox et Safari. Les anciens navigateurs l'ignorent, utilisez donc grid si vous devez les prendre en charge.

Centrer sur tout l'écran

Pour centrer une boîte de dialogue dans le viewport quel que soit le défilement, combinez une couche plein écran fixed avec grid :

.overlay {
  position: fixed;
  inset: 0;                     /* covers the viewport */
  display: grid;
  place-items: center;
  background: rgb(0 0 0 / 50%);
}

Pour centrer verticalement le contenu de toute une page, utilisez min-height: 100dvh sur le parent plutôt que 100vh : sur téléphone, 100vh inclut la zone située derrière les barres d'outils du navigateur, et le « centre » se retrouve trop bas.

Centrer du texte est une autre tâche

Tout ce qui précède centre une boîte. Pour centrer le texte à l'intérieur d'une boîte, utilisez text-align: center sur celle-ci, comme le montre la page centrer du texte en HTML. Il faut souvent les deux : grid pour centrer la carte, et text-align pour centrer les lignes qu'elle contient.

Erreurs courantes

  • Un parent sans hauteur. Le centrage vertical a besoin d'espace libre ; un parent qui se réduit à son contenu n'en a pas.
  • margin: 0 auto sur un bloc pleine largeur. Donnez-lui d'abord une width ou une max-width.
  • margin: auto pour centrer verticalement dans le flux normal. Les marges auto verticales y valent 0 ; utilisez flex ou grid.
  • Un centrage absolu sans parent positionné. L'élément se centre dans la page, pas dans la boîte.
  • align-items: center sur l'enfant. Les propriétés d'alignement se placent sur le parent (le conteneur flex ou grid), sauf margin: auto et align-self.
  • text-align: center pour centrer un bloc. Il centre le contenu inline (texte, images, enfants inline-block), pas un enfant de type bloc.

Questions fréquentes

Comment centrer une div horizontalement et verticalement ?

Faites du parent une grille et centrez son contenu : .parent { display: grid; place-items: center; }. La version flexbox est display: flex; justify-content: center; align-items: center;. Dans les deux cas, le parent doit être plus haut que la div.

Comment centrer une div seulement horizontalement ?

Donnez-lui une largeur et des marges latérales automatiques : .box { width: 300px; margin: 0 auto; } (ou max-width pour un bloc responsive). margin-inline: auto est la même chose en propriétés logiques.

Pourquoi margin: 0 auto ne centre-t-il pas ma div ?

La div n'a pas de largeur inférieure à celle de son conteneur, il n'y a donc pas d'espace libre à partager (un bloc remplit toute la largeur par défaut). Définissez width ou max-width. Cela ne fait rien non plus sur les éléments inline et ne centre jamais verticalement dans le flux normal.

Pourquoi ma div ne se centre-t-elle pas verticalement ?

Le parent n'est pas plus haut que son contenu, il n'y a donc pas d'espace supplémentaire où centrer. Donnez une hauteur (ou une min-height) au parent, puis utilisez le centrage grid ou flexbox.

Quelle est la façon la plus simple de centrer une div ?

display: grid; place-items: center; sur le parent : deux déclarations, les deux axes, un enfant de n'importe quelle taille. Utilisez flexbox quand le parent dispose aussi d'autres éléments en ligne.

Comment centrer du texte dans une div ?

Utilisez text-align: center sur la div pour le texte et le contenu inline. Centrer la div elle-même et centrer le texte qu'elle contient sont deux tâches distinctes.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER