<style>
img {
filter: hue-rotate(200deg);
}
</style>
# Flex-Box - Créer une grille
## Layout De 12 Colonnes Avec Flex-Box
Allons-y. Admettons que vous vouliez que chacune des `<div>` du HTML suivant occupe un tiers de la `<section>`.
```html
<section>
<div class="column">First</div>
<div class="column">Second</div>
<div class="column">Third</div>
</section>
```
Pour que ce soit un peu plus facile, j’ai ajouté quelques styles de base.

Par défaut, l’élément HTML ``<section>`` prend 100% de la largeur de l’écran. Limitons sa largeur à 740px et pendant que nous y sommes, ajoutons un peu d’espace autour des colonnes.
```css
section {
max-width: 740px;
margin: 0 auto;
}
.column {
margin: 10px;
}
```

Essayez de réduire la fenêtre de votre navigateur jusqu’à ce que la largeur devienne inférieure à 740px et remarquez que `<section>` devient plus petit à mesure que l’écran se réduit, mais qu’il garde une largeur fixe lorsque la largeur de l’écran est supérieure à 740px.
## Ajouter de la flexibilité
Transformons notre `<section>` en container flex comme nous l’avons appris .
```css
section {
max-width: 740px;
margin: 0 auto;
display: flex;
}
```

Par défaut, flex-box règle la largeur des colonnes sur la taille de leur contenu.
Nous pouvons modifier ce comportement en utilisant les propriétés `flex-grow` et `flex-shrink`.
La propriété `flex-grow` indique à flexbox la façon dont il doit augmenter la taille de l’item pour occuper plus d’espace si nécessaire.
La propriété `flex-shrink` indique à flexbox comment réduire cette taille si nécessaire.
:::info
Pour en savoir plus, voir les articles suivants :
- [Article 1 EN](https://medium.com/@tiffnogueira/understanding-flex-shrink-flex-grow-and-flex-basis-and-using-these-properties-to-their-full-e4b4afd2c930)
- [Article 2 FR](https://la-cascade.io/flex-shrink/)
:::
Comme nous voulons que nos colonnes se comportent de la même façon lorsqu’elles s’agrandissent ou se rapetissent, donnons à nos deux propriétés la valeur 1.
```css
.column {
margin: 10px;
flex-grow: 1;
flex-shrink: 1;
}
```

Notre conteneur flex-box contient maintenant 3 colonnes.
Les valeurs de `flex-grow` et de `flex-shrink` sont proportionnelles, ce qui signifie qu’elles changent en fonction des valeurs des autres items.
Flexbox fait la somme des valeurs données à chaque item, puis divise chaque valeur par cette somme.
Chaque colonne occupe donc ==1 ÷ (1 + 1 + 1)== soit ==1/3== de l’espace total.
Que se passe-t-il si l’une des colonnes a une valeur différente ?
```css
.column:first-of-type {
flex-grow: 2;
flex-shrink: 2;
}
```

La première colonne prend la même quantité d’espace que les deux autres réunies.
La raison en est que la somme des valeurs est égale à 4, donc la première colonne occupe ==2 ÷ (2 + 1 + 1)==, c’est à dire ==1/2==, et les deux autres occupent ==1 ÷ (2 + 1 + 1)==, c’est à dire ==1/4== de l’espace.
## C’est une question de flex-basis
Si vous regardez attentivement le dernier exemple, vous verrez que la première colonne n’occupe pas tout à fait la moitié du container.
Si nous ajoutons plus de contenu à la troisième colonne, nous allons voir clairement le problème.
```html
<section>
<div class="column">First</div>
<div class="column">Second</div>
<div class="column">
The third column, with more content than before!
</div>
</section>
```
Que se passe-t-il ?? Pourquoi flexbox n’est-il pas flexible ?
Eh bien en fait, il se trouve que flexbox ne répartit pas l’espace de manière égale entre les colonnes.
Il cherche d’abord à savoir de combien d’espace chaque colonne a besoin, puis répartit l’espace qui reste via les propriétés `flex-grow` et `flex-shrink`.
**C’est la propriété `flex-basis` qui a la responsabilité de déterminer l’espace de départ dont dispose un item avant que l’espace résiduel soit réparti.**
Dans la mesure où nous ne nous soucions pas de l’espace d’origine, tout ce que nous avons à faire est de régler flex-basis sur la valeur 0 pour indiquer à flexbox qu’il doit ignorer la taille par défaut du container.
```css
.column {
margin: 10px;
flex-grow: 1;
flex-shrink: 1;
flex-basis: 0;
}
.column:first-of-type {
flex-grow: 2;
flex-shrink: 2;
flex-basis: 0;
}
```

## Encore plus de flex-basis
Si nous ajoutons une autre section sous la première, nous voyons tout de suite le problème :
```html
<section>
<div class="column">First</div>
<div class="column">Second</div>
<div class="column">Third</div>
</section>
<section>
<div class="column">First</div>
<div class="column">Second</div>
<div class="column">Third</div>
<div class="column">Fourth</div>
</section>
```
```css
.column {
margin: 10px;
flex-grow: 1;
flex-shrink: 1;
flex-basis: 0;
}
section:first-of-type .column:first-of-type {
flex-grow: 2;
flex-shrink: 2;
flex-basis: 0;
}
```

Vous avez remarqué que les colonnes ne s’alignent pas ?
C’est parce que flexbox inclut le padding, les bordures et les marges dans le basis lorsqu’il calcule la taille que devrait faire l’item.
La première et la deuxième colonne de la deuxième rangée sont séparées par 22 pixels (20px pour la gouttière et 2px pour les bordures).
Nous pouvons ajouter cet espace manquant dans la première colonne de la première rangée en fixant flex-basis à 22px.
```css
section:first-of-type .column:first-of-type {
flex-grow: 2;
flex-shrink: 2;
flex-basis: 22px;
}
```

Ensemble, flex-grow, flex-shrink et flex-basis forment la pierre angulaire de la flexibilité de flexbox.
Comme ces propriétés sont très liées, flex propose une propriété raccourcie qui vous permet de régler les trois. Vous pouvez l’utiliser ainsi :
flex: <flex-grow> <flex-shrink> <flex-basis>;
Nous pouvons réécrire notre CSS :
```css
.column {
flex: 1 1 0;
}
section:first-of-type .column:first-of-type {
flex: 2 2 22px;
}
```
{%hackmd @alternative-rvb/contact %}