justify-content et align-items en une phrase chacun
Dans un conteneur flex, justify-content répartit les éléments le long de l'axe principal (le long de la ligne) et align-items les aligne sur l'axe secondaire (de haut en bas de la ligne). Les deux se placent sur le conteneur :
La boîte est centrée dans les deux sens : à la même distance des bords de début et de fin, et du haut et du bas. Retirez height: 140px et align-items: center n'a plus rien à faire, car le conteneur se réduit à la hauteur de l'élément.
Toutes les valeurs de justify-content, mesurées
Chaque rangée ci-dessous contient les trois mêmes éléments avec un justify-content différent. Les nombres de l'étiquette au-dessus de chaque rangée sont les espaces laissés par le navigateur : avant le premier élément, entre les éléments, et après le dernier.
Le conteneur fait 420px et les éléments en occupent 180, il reste donc 240px d'espace libre. Où il va :
| Valeur | L'espace libre va | Espaces dans la démo |
|---|---|---|
flex-start (et start) | entièrement après les éléments | 0 / 0 / 0 / 240 |
center | moitié avant, moitié après | 120 / 0 / 0 / 120 |
flex-end (et end) | entièrement avant les éléments | 240 / 0 / 0 / 0 |
space-between | seulement entre les éléments | 0 / 120 / 120 / 0 |
space-around | égal des deux côtés de chaque élément, les bords en reçoivent la moitié | 40 / 80 / 80 / 40 |
space-evenly | tous les espaces égaux, bords compris | 60 / 60 / 60 / 60 |
flex-start suit la direction flex et start suit le sens d'écriture. Ils ne diffèrent qu'avec row-reverse ou column-reverse, où flex-start se trouve à l'extrémité inversée.
Toutes les valeurs de align-items
align-items agit en travers de la ligne. Les éléments ci-dessous ont des hauteurs différentes pour que vous voyiez ce que chaque valeur en fait :
| Valeur | Ce qui se passe sur l'axe secondaire |
|---|---|
stretch (par défaut) | Les éléments sans hauteur définie grandissent pour remplir le conteneur |
flex-start (et start) | Les éléments sont en haut, à leur propre hauteur |
center | Les éléments sont centrés, à leur propre hauteur |
flex-end (et end) | Les éléments sont en bas |
baseline | Les éléments se déplacent pour que leurs premières lignes de texte partagent une même ligne de base |
Dans la boîte baseline, les trois étiquettes « Ag » sont sur une même ligne alors que la première est plus grande et que la deuxième a du padding au-dessus. C'est la valeur pour une rangée qui mélange un grand titre et un petit texte, ou une étiquette et un champ.
Cliquez pour aligner
Cliquez sur n'importe quelle case de la grille 3 × 3. La boîte s'y déplace, et le CSS qui l'y place s'affiche en dessous :
Les lignes du sélecteur changent align-items et les colonnes changent justify-content. La case du milieu, c'est le classique « centrer une div ».
En colonne, les deux s'inversent
justify-content suit toujours l'axe principal. Avec flex-direction: column, l'axe principal est vertical : justify-content déplace alors les éléments de haut en bas et align-items les déplace en travers :
Si vous les confondez, échangez les deux propriétés plutôt que de réécrire la mise en page.
align-self et marges auto : un seul élément
align-self sur un élément remplace align-items pour cet élément. Il n'existe pas de justify-self en flexbox ; pour déplacer un élément le long de l'axe principal, donnez-lui une marge auto, qui prend tout l'espace libre de ce côté :
L'élément vert descend seul en bas, et l'élément ambre est poussé à l'autre bout de la rangée pendant que les autres restent au début.
Quand il y a plusieurs lignes : align-content
align-items aligne les éléments dans leur ligne. Quand un conteneur passe sur plusieurs lignes, align-content espace les lignes elles-mêmes, et accepte les mêmes valeurs que justify-content. Il ne fait rien dans un conteneur nowrap, dont l'unique ligne remplit toujours la hauteur du conteneur. La page flex-wrap le montre.
Erreurs courantes
- Confondre les axes.
justify-contentsuit le sens d'écoulement,align-itemsle traverse. En colonne, le centrage vertical, c'estjustify-content: center. - Pas d'espace libre. Un élément avec
flex: 1prend tout l'espace, etjustify-contentn'a rien à répartir. C'est aussi le cas quand le conteneur estinline-flexet exactement aussi large que ses éléments. - Pas de hauteur pour
align-items. Un conteneur aussi haut que son contenu ne laisse rien à aligner. Définissez uneheightou unemin-height. - Chercher
justify-selfen flexbox. Il y est ignoré. Utilisezmargin-inline-start: auto(oumargin-left: auto) sur l'élément. - Un
align-items: stretchqui n'étire pas. Un élément qui a sa propreheightla garde. Retirez la hauteur (utilisezmin-heights'il lui faut un minimum). - Placer les propriétés sur les éléments. Les deux vont sur le conteneur flex. Seul
align-selfse place sur un élément.
Questions fréquentes
Quelle est la différence entre justify-content et align-items ?
justify-content répartit les éléments le long de l'axe principal, la direction dans laquelle ils s'écoulent (horizontale pour flex-direction: row). align-items les positionne le long de l'axe secondaire (vertical pour une ligne). En colonne, les deux s'inversent : justify-content devient vertical.
Quelle est la différence entre space-between, space-around et space-evenly ?
space-between ne met aucun espace avant le premier élément ni après le dernier et répartit le reste entre les éléments. space-around donne à chaque élément le même espace des deux côtés, donc les bords reçoivent un demi-espace. space-evenly rend tous les espaces égaux, bords compris.
Pourquoi justify-content ne fonctionne-t-il pas ?
En général, il n'y a pas d'espace libre à répartir : un élément a flex-grow ou flex: 1, ou le conteneur n'est pas plus large que ses éléments (par exemple display: inline-flex ou un conteneur flottant). Vérifiez aussi que display: flex est sur le parent, pas sur les éléments.
Pourquoi align-items center ne centre-t-il pas verticalement ?
Le conteneur a probablement exactement la hauteur de son contenu, il n'y a donc rien dans quoi centrer. Donnez au conteneur flex une hauteur ou une min-height, et les éléments se placeront en son milieu.
Que fait align-self ?
align-self remplace le align-items du conteneur pour un seul élément. Par exemple, align-self: flex-end sur un enfant ne déplace que cet enfant à la fin de l'axe secondaire, tandis que les autres restent là où align-items les a placés.
Existe-t-il un justify-self en flexbox ?
Non. Flexbox ignore justify-self, car l'axe principal est partagé par tous les éléments. Pour pousser un élément le long de l'axe principal, utilisez une marge auto, comme margin-inline-start: auto. justify-self fonctionne en grid.