Fonctionnement : comme pour Grid, un conteneur en display: flex
contrôle
la façon dont ses enfants vont se comporter (position, alignement, largeur…)
.container { display: flex; }
inline-block
(démo).container { display: flex; flex-direction: column; /* ou row, row-reverse, column-reverse */ }
row
align-items
gère leur alignement sur cet axe
(démo)
align-self
(démo)
.container { display: flex; align-items: flex-start; } .mon-item { align-self: stretch; }
justify-content
gère la répartition de cet espace (démo)
space-evenly
, plus récent (voir démo)
justify-items
et donc justify-self
,
qui existent pour les grilles, n'ont aucun sens pour flexbox)margin:auto
: dans une flexbox, une marge auto
absorbe tout l'espace disponible (démo)stretch
fonctionne, pour que les items prennent tout l'espace disponible,
mais ça n'existe pas pour flexbox : justify-content
ne modifie jamais la taille des itemsflex-wrap
contrôle le retour à la lignenowrap
: on reste sur une seule ligne.container { display: flex; flex-wrap: wrap; /* ou wrap-reverse */ }
flex-flow
est un raccourci pour
flex-direction
et flex-wrap
align-content
gère la répartition de cet espacejustify-content
, mais sur l'axe secondaire (démo)On a vu toutes les propriétés qu'on peut appliquer au conteneur pour contrôler le positionnement de ses enfants (appelés flex items)
L'autre aspect fondamental de flexbox est qu'il y a aussi des propriétés pour les flex items, qui permettent de contrôler leur taille et leur ordre
flex
flex
(attention : porte sur les items et pas sur le conteneur !).container { display: flex; } #mon-item { flex: 1; }
mon-item
va grossir autant que possible pour que tout l'espace
soit occupé sur l'axe principal (démo)
flex
flex
est un raccourci de trois propriétés de base :
flex-grow
, qui gère comment l'item doit grossir s'il y a trop d'espace (0 pour qu'il ne grossisse pas)flex-shrink
, qui gère comment l'item doit rétrécir s'il n'y a pas assez d'espace (0 pour qu'il ne rétrécisse pas)flex-basis
, qui indique la taille de base (« préférée ») de l'item0 1 auto
: l'item utilise
sa taille naturelle, ou celle donnée par width
/height
, mais rétrécit si besoinflex:1
, c'est comme si on mettait 1 1 0%
: l'item a une taille de base nulle, va grossir si besoin, et rétrécir
si besoinflex:1
(démo, et précisions sur les aspects piégeux)
.container { display: flex; } .item { flex: 1; }
.container { display: flex; } .item { flex: 1; } #mon_item_favori { flex: 3; }
.container { display: flex; } .item { flex: 1; } #mon_item_favori { flex: 3 200px; }Il fera 200px de largeur par défaut, et grossira 3 fois plus vite que les autres lors de la distribution d'espace supplémentaire
.container { display: flex; } .item { flex: 1; } #mon_item_favori { flex: 3 0 200px; }
order
sur un item
permet de changer son ordre d'affichage
<ul style="display: flex; list-style: none"> <li style="order: 2">Premier</li> <li style="order: 1">Deuxième</li> <li style="order: 3">Troisième</li> </ul>
div
, ou utiliser Grid et flex ensembleSi vous avez envie d'utiliser justify-content:stretch
, rappelez-vous bien
que ça ne marche pas avec flexbox
Pour obtenir cet effet il est nécessaire de modifier les flex items, pas le conteneur
.conteneur { display: flex; } .conteneur > * { flex: 1; }En fonction de ce que vous voulez exprimer dans le CSS, ça peut être plus clair.
NB: justify-content:stretch
a été introduit pour Grid, mais ne fait rien pour les boîtes flexibles,
qui ont un mécanisme spécifique bien plus fin pour gérer leur étirement (la propriété flex
)
N'oubliez pas que seuls les fils directs d'un conteneur en
display:flex
sont des flex items, pas tous les descendants !
nav
en display:flex
<nav style="display:flex; background:gold;">
<ul>
<li>toto</li>
<li>titi</li>
<li>tata</li>
</ul>
</nav>
ul
est un flex item
(ce qui ne se voit pas puisque c'est le seul fils de son parent) !