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-wrapalign-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
flexflex (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)
flexflex 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) !