Comment centrer une div en CSS
(joshwcomeau.com)- Le centrage en CSS n’est plus une astuce unique : selon que l’élément est dans le flux du document, flottant ou multiple, il faut choisir entre Flow, Flexbox, Positioned layout, CSS Grid et text-align.
- Pour centrer horizontalement un seul élément, l’approche Flow layout, qui limite la largeur avec
max-width: fit-contentpuis appliquemargin-inline: auto, affecte moins les éléments frères. - Avec Flexbox,
justify-content: centeretalign-items: centersuffisent pour centrer horizontalement/verticalement un ou plusieurs enfants, et même si un enfant déborde, le débordement reste symétrique. - Pour les UI flottantes comme les modales et bannières, la bonne combinaison est
position: fixed,inset: 0, des contraintes de taille etmargin: auto; CSS Grid, lui, est efficace pour une syntaxe courte et la superposition. - Le texte lui-même ne se centre pas via l’alignement de mise en page : il faut
text-align: center. Et si la prise en charge dealign-contentdans le Flow layout s’élargit, on aura moins besoin de passer à Flexbox ou Grid pour un simple centrage vertical.
Centrage horizontal avec des marges auto en Flow layout
- L’une des anciennes stratégies consiste à limiter la largeur de l’élément, puis à mettre les marges gauche et droite à
auto.
.element {
max-width: fit-content;
margin-left: auto;
margin-right: auto;
}
- En Flow layout, les éléments remplissent par défaut l’espace horizontal ; pour les centrer, il faut donc d’abord limiter leur largeur.
fit-contentfait en sorte que l’élément épouse son contenu, de sorte quewidthsoit déterminée par la taille du contenu, commeheight.- Utiliser
max-widthau lieu dewidthne fixe que la taille maximale : lorsque le conteneur se rétrécit, l’élément peut donc se réduire avec lui. - Avec seulement
margin-left: auto, l’espace restant va dans la marge gauche ; avec les deux marges àauto, l’espace restant est réparti équitablement et l’élément se retrouve centré.
.element {
max-width: fit-content;
margin-inline: auto;
}
margin-inlineest une façon moderne de donner la même valeur àmargin-leftetmargin-right, avec une bonne prise en charge navigateur.margin-inlinefait partie des propriétés logiques (logical properties) : elle agit non pas selon gauche/droite, mais selon l’axe inline de la direction d’écriture.- Elle permet d’appliquer la marge du bon côté aussi bien dans les langues écrites de gauche à droite que dans celles écrites de droite à gauche.
- Cette approche est utile quand on veut centrer un seul enfant sans affecter ses éléments frères, par exemple une image au milieu d’un article de blog.
Centrer un ou plusieurs enfants avec Flexbox
- Flexbox est un mode de mise en page puissant pour disposer plusieurs éléments le long de l’axe principal, et il est aussi souvent utilisé pour le centrage.
.container {
display: flex;
justify-content: center;
align-items: center;
}
- En combinant
justify-content: centeretalign-items: center, on peut centrer les enfants horizontalement et verticalement. - Même si un enfant ne tient pas dans le conteneur, l’alignement est conservé et, en cas de dépassement, le débordement reste symétrique.
- On peut aussi centrer plusieurs enfants, et contrôler leur direction d’empilement avec
flex-direction.
.container {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
gap: 4px;
}
- C’est un choix par défaut pratique, applicable largement à un ou plusieurs enfants.
Centrer une UI flottante avec Positioned layout
- Les éléments qui doivent sortir du flux normal du document et flotter au-dessus, comme les modales, prompts ou bannières, peuvent être gérés avec Positioned layout.
.element {
position: fixed;
inset: 0px;
width: 12rem;
height: 5rem;
max-width: 100vw;
max-height: 100dvh;
margin: auto;
}
position: fixedfixe l’élément au viewport, etinset: 0pxdéfinittop,left,rightetbottomà0px.- Avec seulement
inset: 0px, l’élément tente de remplir tout le viewport ; il faut donc limiter sa taille avecwidth,height,max-widthetmax-height. - Cette combinaison crée volontairement des contraintes impossibles.
- Un élément ne peut pas être à la fois à
0pxde la gauche et de la droite tout en ayant une largeur de12rem. - Le moteur de rendu CSS donne la priorité à la contrainte
width, puis résout la tension en l’attachant à un côté selon la direction de la langue.
- Un élément ne peut pas être à la fois à
- En ajoutant
margin: auto, le navigateur change sa façon de résoudre ces contraintes et l’élément est placé au centre horizontalement et verticalement. - Les quatre conditions nécessaires sont
position: fixed,inset: 0px, une largeur et une hauteur limitées, etmargin: auto. -
Centrer sur un seul axe, comme pour une bannière en bas
.element { position: fixed; left: 0px; right: 0px; bottom: 8px; width: 12rem; max-width: calc( 100vw - 8px * 2 ); margin-inline: auto; }- En omettant
top: 0px, la contrainte impossible sur l’axe vertical disparaît et l’élément reste fixé en bas. calc(100vw - 8px * 2)limite la largeur maximale pour laisser une marge de sécurité des deux côtés du viewport.margin-inline: autoexprime plus précisément l’intention de centrage horizontal.
- En omettant
-
Éléments de taille inconnue
.element { position: fixed; inset: 0; width: fit-content; height: fit-content; margin: auto; }- Quand on ne connaît pas la taille de l’élément à l’avance,
width: fit-contentetheight: fit-contentpermettent de l’ajuster à son contenu. - On peut ajouter une contrainte comme
max-width: 60vw, mais ce n’est pas obligatoire : l’élément reste inclus dans le viewport.
- Quand on ne connaît pas la taille de l’élément à l’avance,
-
Un centre volontairement légèrement décalé
- En ajustant une valeur
insetd’un seul côté, commebottom: 48px, l’élément se déplace de la moitié de cette valeur. - Avec
bottom: 48px, l’élément remonte de24px. - C’est parce qu’il est centré à l’intérieur d’une boîte virtuelle située entre les limites haute et basse.
- Avec
transform: translateY(-48px), on peut déplacer l’élément exactement de48pxvers le haut. - La méthode par décalage
bottompermet de réserver la propriététransformpour une animation ou un effet d’entrée ultérieur.
- En ajustant une valeur
Centrage court et superposition avec CSS Grid
- Dans CSS Grid, le code de centrage le plus court combine
display: gridetplace-content: center.
.container {
display: grid;
place-content: center;
}
-
place-contentest un raccourci pourjustify-contentetalign-content, qui applique la même valeur aux lignes et aux colonnes. -
Avec ce réglage, une cellule Grid 1×1 est créée au centre du conteneur parent.
-
Différences avec Flexbox
- Cela ressemble à Flexbox, mais CSS Grid utilise un algorithme de mise en page complètement différent.
- La différence apparaît si l’on donne aux enfants
width: 50%etheight: 50%. - Dans Flexbox, les pourcentages sont calculés par rapport au parent
.container. - Dans CSS Grid, les pourcentages sont calculés par rapport à la cellule Grid.
- Si
grid-template-columnsougrid-template-rowsne sont pas définis, les pistes Grid calculent leur taille en fonction du contenu, ce qui peut rendre l’élément plus petit que prévu. - Dans ce cas, on peut ajouter du CSS pour corriger la Grid, mais pour un simple centrage, Flexbox peut être plus simple.
-
Superposer plusieurs éléments au même endroit
.container { display: grid; place-content: center; } .element { grid-row: 1; grid-column: 1; }- CSS Grid permet de placer plusieurs enfants dans la même cellule.
- En donnant
grid-row: 1etgrid-column: 1à tous les.element, les éléments partagent le même espace Grid et se superposent les uns devant/derrière les autres. - Cela fonctionne même si les enfants ont des tailles différentes.
.container { display: grid; place-content: center; place-items: center; } .element { grid-row: 1; grid-column: 1; }- Pour superposer au centre des enfants de tailles différentes, il faut ajouter
place-items: center. place-itemsest un raccourci pourjustify-itemsetalign-items, et contrôle l’alignement des images à l’intérieur de la cellule Grid.- Sans cette propriété, la cellule Grid elle-même est centrée, mais les images à l’intérieur de la cellule s’empilent en haut à gauche.
- Pour approfondir CSS Grid, vous pouvez consulter An Interactive Guide to CSS Grid.
Le texte se centre séparément avec text-align
- Le texte doit être traité séparément en CSS : les techniques de mise en page comme Flexbox n’alignent pas les lettres individuellement.
- Si l’on centre un paragraphe avec Flexbox, le bloc de paragraphe arrive bien au centre, mais les caractères à l’intérieur restent alignés à gauche.
- Pour centrer le texte lui-même, il faut utiliser
text-align: center.
.container {
display: flex;
justify-content: center;
align-items: center;
text-align: center;
}
L’avenir du Flow layout : align-content
- En Flow layout, le centrage horizontal est possible avec les marges auto, mais le centrage vertical nécessitait jusqu’ici un autre mode de mise en page comme Flexbox ou Grid.
- Début 2024, les éditeurs de navigateurs étaient en train d’implémenter
align-contentdans le Flow layout. - Ce nouveau comportement contrôle l’alignement dans la direction block du contenu ; à l’époque, il n’était disponible que derrière un flag dans Chrome Canary et dans Safari Technical Preview.
- La démo d’exemple ne montre pas le comportement réel du Flow layout : elle le reproduit avec Flexbox après avoir vérifié le comportement dans Chrome Canary et Safari TP.
- Cette fonctionnalité ne créera pas de nouvelles UI, mais elle pourra réduire le besoin de passer à un mode de mise en page distinct pour de simples centrages.
Critères de choix selon la situation
- Pour centrer horizontalement un seul élément sans affecter ses frères, utilisez la stratégie marges auto en Flow layout.
- Pour les UI flottantes comme les modales ou bannières, placez-les au centre avec Positioned layout et des marges auto.
- Pour superposer plusieurs éléments au même emplacement en les centrant, CSS Grid est adapté.
- Pour centrer du texte, utilisez
text-align, éventuellement combiné à d’autres méthodes de centrage. - Dans la plupart des autres cas, Flexbox est le choix le plus polyvalent.
- Il peut gérer un ou plusieurs enfants.
- Il permet le centrage horizontal comme vertical.
- Il fonctionne que les enfants tiennent dans le conteneur ou qu’ils débordent.
3 commentaires
Maintenant que j’y pense, ça me gêne soudain aussi que, sur GeekNews, les articles ne soient pas centrés, ouin, haha
J’utilise souvent
place-items: center;, mais il y a visiblement plusieurs autres méthodes.Avis de Hacker News
Puisque les autres commentaires commentent les commentaires eux-mêmes, je vais m’y mettre aussi : je pense que le mème du centrage en CSS désigne surtout « comment placer un élément exactement au centre d’un autre »
Du point de vue de l’implémentation, il est vrai que le centrage est difficile et peut avoir plusieurs significations, mais pour la génération GeoCities ou AngelFire, c’était difficile à accepter, parce qu’en HTML, même dans les années 90, on pouvait mettre
hellosans problème au milieu d’une boîte jaune de 600x600C’était frustrant que le nouvel outil présenté comme meilleur ne sache pas faire une tâche standard qu’on faisait déjà, et c’est pour ça qu’on a continué à utiliser les mises en page en tableaux jusqu’à la fin des années 2000. J’aime CSS, mais c’est peut-être une forme de syndrome de Stockholm
J’ai été surpris que
valignfonctionne dans Chromium même sans être présent, et je ne sais pas si c’est un changement récenthelloau milieu d’une boîte jaune de 600x600 était possible dès la première version de CSS. Par exemple, l’attribut HTMLvaligncorrespond à la propriété CSSvertical-aligndes boîtesinline,inline-blockettable-cellCela dit, d’expérience, parmi les gens qui parlent avec nostalgie de n’utiliser que des tableaux ou qui se plaignent que CSS est limité et déroutant, beaucoup n’ont pas vraiment fait l’effort d’apprendre comment CSS fonctionne réellement. L’auteur, lui, en est au moins conscient
"valign". Cela dit, quand on utilise des tableaux sans mise en page fixe, j’ai toujours observé de subtiles différences entre les trois principaux navigateurs ; donc, en général, je ne m’appuierais pas sur le comportement de mise en page automatiqueBon article, et les réactions ici sont assez surprenantes pour un lectorat supposément technique. La mise en page automatique et la composition sont vraiment difficiles, au point d’être effectivement des sujets de thèse[1]
Il n’est pas réaliste de s’attendre à ce que cette complexité soit abstraite par une formule simple du genre « fais ce que je veux »
Si l’on regarde le site de Gwern Branwen[2], cela tient presque de l’art, mais l’idée centrale est d’abord de définir l’apparence voulue, puis de contraindre le texte pour qu’il puisse s’exprimer dans ce style
Je m’intéresse à la mise en page Web depuis que j’ai rejoint, en 1995, une startup se présentant comme « le premier magazine de golf du Web »[3], et Zen Garden ainsi que la liste de diffusion/le site
A List Apart[4] m’ont fait comprendre à quel point il est difficile de produire du contenu Web qui rende bien dans des environnements de sortie variésTransposer du contenu sémantique vers un écran, du papier ou un plan fini est, au fond, une application ou projection depuis l’espace d’origine vers un ensemble de règles de l’espace de destination ; et ces règles incluent les contraintes physiques, les contraintes logicielles des navigateurs, ainsi que les comportements propres à chaque navigateur
C’est pourquoi CSS peut sembler être un bazar pour quelqu’un qui veut « créer une page Web à partir de zéro », alors qu’en réalité il s’agit moins de contraintes qui empêchent de faire des choses que d’un excès de choix possibles
[1] https://scholar.google.com/scholar?hl=en&as_sdt=0%2C5&q=thes...
[2] https://gwern.net/
[3] Il s’appelait Golfweb et semble avoir fini par faire partie de CBS Sports
[4] https://www.alistapart.com
[1] https://every-layout.dev/rudiments/boxes/
Il y a en particulier cet objectif sisyphéen de viser un seul grand modèle adapté à toutes les pages, puis de recalculer automatiquement la mise en page pour chaque page. Si l’on ajoute à cela l’objectif de couvrir toutes les tailles de fenêtre, je ne comprends pas pourquoi on a pensé que ce serait possible
https://css-art.com/the-girl-with-a-p-e-a-r-l-css-earring/
Je ne sais pas combien de
divcentrés il contientEn particulier, dans un tableau contenant du texte et des objets de tailles différentes selon les colonnes, déterminer quand et comment faire passer les éléments à la page suivante est un travail délicat de choix de bonnes heuristiques
Dans custom appkit, des contrôles GTK ou des toolkits internes basés sur Lua, centrer du contenu ou gérer le retour à la ligne et l’alignement des éléments n’avait rien de particulier ; je me demande donc ce qui m’échappe sur le Web
Dire que ce n’est qu’une « richesse de choix » me rappelle aussi le TMTOWTDI, enterré depuis longtemps
Excellent article, et les éléments interactifs sont particulièrement réussis. Ce qui m’a beaucoup aidé, il y a quelques années, à comprendre le positionnement et le centrage en CSS, c’est la lecture du modèle de boîte
Comprendre le modèle de boîte aide à raisonner sur le flux dans le DOM, et les propriétés CSS
displayetpositionsont également fondamentales pour apprendre le positionnement. La documentation MDN est bien faitehttps://developer.mozilla.org/en-US/docs/Learn/CSS/Building_...
https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layou...
« Comment centrer » est une question classique en CSS, et le simple fait que ce ne soit pas évident au premier coup d’œil en dit long. CSS ressemble plutôt à un fourre-tout confus, un assemblage façon évier de cuisine conçu simultanément par plusieurs comités plutôt que par un seul
La notion de véritable release a été abandonnée depuis longtemps, et l’état actuel de CSS ressemble davantage à l’agrégation de l’état de modules indépendants qui évoluent en permanence. Ce n’est pas une façon de développer du logiciel, et à vrai dire ce n’est pas une bonne façon de fabriquer quoi que ce soit
Le Web et ses technologies n’ont pas non plus de direction collective clairement définie, donc il y a forcément beaucoup d’expériences ratées et d’incohérences. C’est un périmètre bien plus vaste qu’un projet d’ingénierie soigneusement planifié, avec un objectif et une trajectoire clairs
Quand on commence à apprendre à donner à une page Web l’apparence souhaitée, on découvre généralement la taille du texte, la couleur, la couleur de fond et l’alignement ; et, à part l’alignement, le reste correspond presque 1:1 aux méthodes d’avant CSS
Avant CSS, si l’on voulait placer du contenu au centre, il suffisait de le mettre dans une balise, que ce soit du texte ou un objet HTML comme un
div, un tableau ou un bouton. Beaucoup de gens s’attendaient à ce que CSS fonctionne comme avant, sans distinction entre objets inline et block ; quand CSS n’a pas correspondu à cette idée reçue, ce genre de question est apparuCet article est vraiment excellent, en particulier son mode d’interaction. Il existe aussi depuis longtemps un outil qui donne presque toujours le résultat voulu
http://howtocenterincss.com
Il a fallu des décennies à CSS pour proposer une solution aussi utilisable qu’un tableau avec du contenu centré, tandis que pendant tout ce temps, utiliser des tableaux pour la mise en page était critiqué
Pour l’accessibilité, les tableaux HTML nécessitent au minimum un traitement du type ``
https://developer.mozilla.org/en-US/docs/Learn/HTML/Tables/A...
Les ressources sur CSS Grid Layout valent aussi le détour
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_la...
Firefox DevTools > INTRODUCTION TO CSS GRID LAYOUT: https://mozilladevelopers.github.io/playground/css-grid/
CSS Grid Garden: https://cssgridgarden.com/
MDN > "Relationship of grid layout to other layout methods": https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_la...
MDN: "Box alignment in grid layout": https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_la...
Le développement Web comporte bien plus d’éléments que l’emplacement du contenu sur la page, et c’est pour cela qu’un bon développement Web est difficile
divet de CSS, c’était leur réputation hipster ; l’inconvénient, c’était la soupe de DIVÀ l’époque, CSS était incroyablement inadapté à ce que les gens essayaient de faire, à mon avis parce qu’il avait été conçu pour la mise en forme de documents, pas pour les applications Web ni les mises en page d’écran
À l’inverse, l’avantage de
table, c’est que ça fonctionnait réellementComme beaucoup ici, je pense que CSS est une catastrophe totale. Le problème central, c’est que les directives de style ne cessent de s’écraser les unes les autres, ou échouent silencieusement sans aucun effet
J’ai aimé la brutalité honnête de l’une des bannières de cookies dans les exemples
« Nous attachons de l’importance à vos données personnelles. Pour améliorer votre expérience de navigation, nous utilisons des cookies qui vendent ces données à des annonceurs. Elles ont beaucoup de valeur »
Ce que l’on peut apprendre de l’histoire de l’utilisation des tableaux pour la mise en page est intéressant. Les tableaux ont des bordures, du padding, une mise en page à base de cellules organisées en colonnes, et, par extension, il faut aussi des espaces autour des tableaux et des cellules, c’est-à-dire des marges
Les tableaux sont un élément établi depuis longtemps dans la mise en page et portaient en fait cette idée judicieuse que tous les éléments devraient, dans une certaine mesure, se comporter comme des cellules de tableau
Les éléments doivent suivre le modèle de boîte, ce qui est assez évident pour quelqu’un qui travaille la typographie ; en revanche, le fait qu’ils doivent aussi être organisés en colonnes l’est moins, et c’est la base de Grid layout et de Bootstrap
Quand on rencontre un problème de mise en page, qu’on le résout avec des tableaux, puis qu’on se rend compte qu’il faut une nouvelle fonctionnalité ayant certaines propriétés des tableaux mais pas toutes, c’est une évolution naturelle
CSS l’a découvert, mais curieusement certains systèmes comme les traitements de texte n’ont pas réussi à unifier les éléments sous le modèle de boîte
Les plaintes du type « pourquoi est-ce encore aussi difficile ? » me semblent assez à côté de la plaque. Comme le dit l’article, Flexbox règle de façon intuitive tous les cas simples de centrage
Si Flexbox ne suffit pas, c’est qu’on ne fait pas simplement du centrage, mais quelque chose de plus complexe, et il n’est pas raisonnable d’attendre une implémentation ultra simple
Aujourd’hui, il y a tellement de méthodes que la complexité est écrasante. On corrige plus souvent du vieux code qu’on n’en écrit du neuf, et il faut se demander pourquoi le CSS a été écrit d’une certaine manière, quels cas limites risquent de casser, si on peut le modifier, et quelle solution choisir parmi plusieurs quand ce n’est pas simple
Même en parcourant l’article, ce n’est pas intuitif. Avec Flexbox aussi, le réglage horizontal se fait avec
justify-contentet le réglage vertical avecalign-items, mais les noms de propriétés CSS sont si nombreux et arbitraires qu’on ne les retient plus vraimentAu final, la différence est entre construire des solutions complexes à partir de briques simples, intuitives et fiables, ou construire des solutions complexes à partir de briques elles-mêmes complexes, qui se recoupent partiellement et qu’il faut sans cesse rechercher
Go ou Python sont plutôt du premier type, CSS plutôt du second
Il y avait une raison pour laquelle les gens aimaient le système de grille de Bootstrap, et Flexbox fait tout cela, et plus encore, directement dans le navigateur. Difficile d’exagérer à quel point je l’apprécie
diven CSS comme si c’était quelque part entre l’alchimie et la science des fuséesCela montre qu’ils ne suivent pas l’évolution de CSS autant que les autres aspects du développement web, tout en se permettant ce genre d’affirmations
En allant de l’extérieur vers l’intérieur, de l’élément parent vers les éléments enfants, cela devient nettement plus facile. Il faut un peu de technique, mais fondamentalement, cela ressemble surtout à de l’algèbre élastique