Ce que fait display: flex
Placez display: flex sur un parent et ses enfants directs s'alignent sur une ligne, côte à côte, étirés à la même hauteur. Cette seule déclaration remplace les flottants, inline-block et la plupart des astuces de positionnement pour disposer une rangée d'éléments.
Dans la première boîte, chaque div occupe une ligne entière. Dans la seconde, les trois éléments tiennent sur une ligne, chacun aussi large que son contenu, et One et Three s'étirent à la hauteur de Two. Seul le parent a changé : display: flex se place sur le conteneur, jamais sur les éléments.
Bac à sable flexbox
Choisissez des valeurs et regardez les éléments bouger. La ligne de code sous la boîte est le CSS de ce que vous voyez, et la liste en dessous indique où le navigateur a réellement placé chaque élément, mesuré avec getBoundingClientRect().
À essayer :
justify-content: space-between: l'élément 1 se place à x 0 et l'élément 3 touche le bord opposé.align-items: center: les trois éléments gardent leur propre hauteur et leurs centres s'alignent. Avec la valeur par défautstretch, l'élément 1 n'a pas de hauteur propre et remplit les 170px du conteneur.flex-direction: column:justify-contentdéplace maintenant les éléments verticalement etalign-itemshorizontalement. Les deux propriétés suivent les axes, pas l'écran.
Axe principal et axe secondaire
Tout conteneur flex a deux axes. L'axe principal est la direction dans laquelle les éléments s'écoulent, définie par flex-direction. L'axe secondaire le traverse.
flex-direction | Axe principal | Axe secondaire | justify-content déplace les éléments | align-items déplace les éléments |
|---|---|---|---|---|
row (par défaut) | horizontal, dans le sens de lecture | vertical | horizontalement | verticalement |
row-reverse | horizontal, inversé | vertical | horizontalement | verticalement |
column | vertical, de haut en bas | horizontal | verticalement | horizontalement |
column-reverse | vertical, de bas en haut | horizontal | verticalement | horizontalement |
Sur une page de droite à gauche (dir="rtl"), row commence au bord droit, car l'axe principal suit le sens d'écriture.
Les propriétés du conteneur
Elles se placent sur l'élément qui a display: flex :
| Propriété | Rôle | Par défaut |
|---|---|---|
flex-direction | Ligne ou colonne, et dans quel sens | row |
flex-wrap | Si les éléments passent à la ligne quand la place manque | nowrap |
flex-flow | Raccourci de flex-direction et flex-wrap | row nowrap |
justify-content | Placement et espacement le long de l'axe principal | normal (se comporte comme flex-start) |
align-items | Placement des éléments le long de l'axe secondaire | normal (se comporte comme stretch) |
align-content | Espacement entre les lignes quand les éléments passent à la ligne | normal |
gap | Espace entre les éléments (row-gap, column-gap) | 0 |
justify-content et align-items ont chacun leur page avec toutes les valeurs : justify-content et align-items. Le retour à la ligne et la direction sont sur la page flex-wrap.
Les propriétés des éléments : flex-grow, flex-shrink, flex-basis
Elles se placent sur les enfants et décident comment ils se partagent la largeur du conteneur :
flex-basis: la taille de départ d'un élément avant le partage de l'espace libre (autosignifie « utiliser ma largeur ou mon contenu »).flex-grow: combien de parts de l'espace restant l'élément prend.0signifie qu'il ne grandit jamais.flex-shrink: combien l'élément cède quand la place manque.0signifie qu'il ne rétrécit jamais.
Le raccourci flex définit les trois :
| Vous écrivez | Ce qui signifie | Comportement |
|---|---|---|
flex: initial (par défaut) | 0 1 auto | Taille du contenu, peut rétrécir, ne grandit jamais |
flex: 1 | 1 1 0% | Part de zéro et prend une part égale de l'espace |
flex: auto | 1 1 auto | Taille du contenu plus une part de l'espace restant |
flex: none | 0 0 auto | Exactement son contenu ou sa largeur, ne grandit ni ne rétrécit |
flex: 2 | 2 1 0% | Deux fois la part d'un élément avec flex: 1 |
Chaque rangée fait 480px de large à l'intérieur de son padding, et les deux espaces de 8px laissent 464px aux éléments. Les largeurs affichées montrent le partage : environ 155px chacun dans la première rangée, 116 + 232 + 116 dans la deuxième (l'élément flex: 2 reçoit deux fois la part de chacun de ses voisins), et 100 + 372 dans la troisième, où l'élément flex: none garde sa largeur et l'autre prend tout le reste.
De vraies mises en page avec flexbox
Un en-tête avec un logo au début et des liens à la fin est la mise en page flex la plus courante. margin-inline-start: auto sur un élément absorbe tout l'espace libre avant lui et le pousse, avec tout ce qui suit, jusqu'à la fin :
align-items: center aligne le texte plus grand du logo avec les liens, et gap espace les liens sans marges à annuler sur le dernier.
Un deuxième schéma courant est la rangée média : une icône de taille fixe et un texte qui prend le reste et passe à la ligne dans sa propre colonne.
flex: none est la garantie. Les éléments flex rétrécissent par défaut : si vous le retirez du cercle et retirez aussi flex: 1 du texte, le paragraphe comprime le cercle jusqu'à environ 23px de large, ce qui donne un ovale. Pour centrer un élément dans une boîte, flexbox tient en deux lignes (justify-content: center; align-items: center) ; la page pour centrer une div le compare aux autres méthodes.
order et accessibilité
La propriété order et les directions -reverse changent l'endroit où les éléments apparaissent, pas leur place dans le HTML. Les lecteurs d'écran et la touche Tab suivent toujours l'ordre du HTML, si bien qu'un utilisateur du clavier peut sauter du premier lien affiché au dernier. Ne les utilisez que pour la décoration ; quand l'ordre a un sens, modifiez le HTML.
Flexbox ou grid
Flexbox travaille dans une seule direction à la fois : les éléments d'une ligne se dimensionnent selon leur contenu, et une seconde ligne (avec retour à la ligne) ne s'aligne pas sur la première. Grid travaille dans les deux : vous définissez des colonnes et des lignes, et les éléments s'y calent. Une barre de navigation, une barre d'outils ou une ligne de formulaire relèvent de flexbox ; une galerie ou une page avec une barre latérale relèvent de grid.
Erreurs courantes
display: flexsur l'élément au lieu du parent. C'est le conteneur qui reçoitdisplay: flex; ses enfants sont les éléments.- Attendre de
align-itemsqu'il déplace les éléments verticalement sans hauteur. Si le conteneur n'est pas plus haut que son élément le plus haut, il n'y a pas de place pour bouger. Donnez une hauteur au conteneur ; sinon, la propriété fonctionne mais n'a simplement rien à faire. - Un texte qui déborde au lieu de rétrécir. Les éléments flex ont
min-width: auto. Ajoutezmin-width: 0à l'élément qui doit rétrécir. - Utiliser
flex: 1et s'étonner que les largeurs diffèrent. Les élémentsflex: 1se partagent l'espace à parts égales, mais un élément dont le contenu ne peut pas tenir (une longue URL, une image) ne rétrécit pas en dessous.min-width: 0règle aussi ce cas. - Des marges entre les éléments. Utilisez
gapsur le conteneur ; il ne se place qu'entre les éléments. - Imbriquer du flex inutilement. Seuls les enfants directs sont des éléments flex. Les petits-enfants suivent la mise en page normale, sauf si leur propre parent a aussi
display: flex.
Questions fréquentes
Que fait display: flex ?
Il transforme un élément en conteneur flex. Ses enfants directs deviennent des éléments flex, placés par défaut en ligne, côte à côte et étirés à la même hauteur, et des propriétés comme justify-content, align-items et gap contrôlent la façon dont ils se partagent l'espace.
Que signifie flex: 1 ?
flex: 1 est le raccourci de flex: 1 1 0% : l'élément peut grandir (flex-grow: 1), peut rétrécir (flex-shrink: 1) et part d'une taille nulle (flex-basis: 0%). Des éléments qui ont tous flex: 1 se partagent l'espace libre à parts égales et finissent donc avec la même largeur, sauf si leur contenu ne peut pas tenir.
Quelle est la différence entre justify-content et align-items ?
justify-content place les éléments le long de l'axe principal (horizontalement sur une ligne), et align-items le long de l'axe secondaire (verticalement sur une ligne). Avec flex-direction: column, les deux axes s'inversent, et justify-content devient vertical.
Faut-il utiliser flexbox ou grid ?
Utilisez flexbox pour une seule ligne ou colonne dont les éléments se dimensionnent selon leur contenu : barres de navigation, groupes de boutons, étiquette à côté d'un champ. Utilisez grid quand vous voulez des lignes et des colonnes alignées entre elles, comme une grille de cartes ou la mise en page d'une page.
Pourquoi mon élément flex déborde-t-il de son conteneur ?
Un élément flex a min-width: auto par défaut : il refuse de rétrécir sous la largeur de son mot le plus long ou de son enfant le plus large. Définissez min-width: 0 (ou overflow: hidden) sur l'élément pour le laisser rétrécir, par exemple pour que text-overflow: ellipsis fonctionne.
Flexbox fonctionne-t-il sur des éléments inline comme span ?
Oui. Tout élément avec display: flex est un conteneur flex, et ses enfants deviennent des éléments flex quelle que soit leur propre valeur de display : des enfants <span> cessent donc d'être inline et acceptent largeur, hauteur et marges comme des blocs.