Avec le modèle des boites flexibles, nous allons pouvoir définir des conteneurs flexibles. Ces conteneurs sont dits « flexibles » car leurs enfants directs vont être des éléments flexibles qui vont pouvoir se réarranger (se redimensionner, se réaligner, etc.) automatiquement dans leur conteneur lorsque celui-ci change de dimension.
Le modèle des boites flexibles fait la distinction entre deux types de boites auxquelles on va pouvoir appliquer différentes propriétés : des conteneurs flexibles d’un côté et des éléments flexibles ou « flex items » de l’autre.
Le principe du modèle flexible
Il est assez simple, nous allons définir un conteneur flexible (l’élément parent) en attribuant la propriété css display : flex . Tous les éléments directement contenus dans ce conteneur (c’est-à-dire tous les enfants directs) vont alors automatiquement devenir des éléments flexibles.
Sur le code HTML suivant, nous définissons un élément <div>, auquel nous attribuons l’attribut class ="le_parent", comme étant le conteneur parent des éléments <section> :
<div class="le_parent">
<section>
<h2>Première section</h2>
<p>Texte de ma première section</p>
</section>
<section>
<h2>Deuxième section</h2>
<p>Texte de ma deuxième section, ce texte est plus long, la section s'adapte. </p>
</section>
<section>
<h2>Troisième section</h2>
<p>Texte de ma troisième section</p>
</section>
</div>
Nous venons ensuite lui appliquer les règles CSS suivantes :
.le_parent {
display:flex;
background:#a1a6ab;
}
.le_parent section {
color:#000000;
background:#ffffff;
padding:20px;
margin:20px;
}
Et nous obtiendrons ce qui suit, l’élément <div> (en gris clair) est le conteneur flexible, les <section> (en blanc) sont les éléments flexibles, leur largeur s’adapte à leur contenu tant que l’élément parent le permet. Ces derniers viennent naturellement se mettre les uns à côté des autres à l’intérieur de l’élément parent :

Il nous est désormais possible de positionner des éléments de type block les uns à côtés des autres. Nous pouvons donc envisager de disposer ces éléments dans la page les uns par rapport aux autres, en un mot, faire de la mise en page. Mais pour cela, nous aurons besoins de pouvoir affiner et comprendre les propriétés des conteneurs parents et de leurs enfants flexibles.
Pour manipuler plus finement nos éléments, la propriété CSS flex embarque tout un chapelet de propriétés dédiées. Certaines vont être appliquables au container parent d’autre aux enfants :
Les propriétés du container parent
flex-direction :
Valeurs possibles : row | row-reverse | column | column-reverse
Direction dans laquelle les éléments flexibles sont placés au sein le conteneur. Par défaut ils seront affichés en ligne (row), mais il sera possible d’inverser le sens de la ligne ou définir un affichage en colonne.

flex-wrap :
Valeurs possibles : nowrap | wrap | wrap-reverse
Par défaut, les éléments flexibles essaieront tous de tenir sur une seule ligne. Vous pouvez modifier cela et autoriser les éléments à passer à la ligne si l’élément parent ne leur laisse pas assez de place pour s’étendre.

justify-content :
Valeurs possibles : flex-start | flex-end | center | space-between | space-around | space-evenly | start | end | left
Aide à répartir l’espace libre supplémentaire restant entre les éléments enfants lorsqu’ils ont atteint leur taille maximale

align-items :
Valeurs possibles : stretch | flex-start | flex-end | center | baseline
Définit l’alignement et le comportement vertical des éléments enfants. Cette propriété nous permettra par exemple de centrer verticalement les enfants au sein de l’élément parent.

align-content :
Valeurs possibles : flex-start | flex-end | center | space-between | space-around | stretch
Cela aligne les lignes d’un conteneur flexible à l’intérieur lorsqu’il y a un espace supplémentaire dans l’axe vertical, de la même manière que justify-content aligne des éléments individuels dans l’axe horizontal.

Les propriétés de l’élément enfant
Dans les exemples suivants, l’élément enfant ciblé par les règles est l’élément 2, affiché en jaune
order :
Valeurs possibles : [valeur numérique]
Par défaut, les éléments flexibles sont disposés dans l’ordre du flux (l’ordre dans lequel ils ont étés écrits). Cependant, la propriété order contrôle l’ordre dans lequel ils apparaissent dans le conteneur flex.

flex-grow :
Valeurs possibles : [valeur numérique]
Cela définit la capacité d’un élément flexible à s’étirer si nécessaire. Il indique la proportion d’espace disponible à l’intérieur du conteneur flexible que l’élément doit occuper. Si tous les éléments ont le flex-grow définis sur 1, l’espace restant dans le conteneur sera distribué de manière égale à tous les enfants. Si l’un des enfants a une valeur de 2, l’espace restant prendrait deux fois plus d’espace que les autres (ou il essaiera de le faire).

align-self :
Valeurs possibles : auto | flex-start | flex-end | center | baseline | stretch
Permet de remplacer l’alignement par défaut (ou celui spécifié par align-items) pour les éléments flex individuels..
