Les flexbox¶
Le flexbox est une méthode qui consiste à créer une disposition à l'aide de boîtes flexibles... d'où flexbox. On crée une boîte parent, dans laquelle on place des boîtes enfants. Ensuite, on indique comment la flexibilité des boîtes doit réagir lors d'un redimensionnement de l'écran.
Flexbox simple sur une ligne¶
Le flexbox le plus simple est de créer le contenant (boîte parent) flexible, dans lequelle on crée des enfants.
HTML
<div class="div-flex-contenant">
<div class="div-flex-item-small">Flex item un</div>
<div class="div-flex-item-large">Flex item deux</div>
<div class="div-flex-item-small">Flex item trois</div>
<div class="div-flex-item-large">Flex item quatre</div>
<div class="div-flex-item-small">Flex item cinq</div>
<div class="div-flex-item-large">Flex item six</div>
</div>
CSS
.div-flex-contenant{
background-color: plum;
width: 100%;
display: flex;
}
.div-flex-item-small {
background-color: lightgray;
margin: 0.8rem;
min-height: 12em;
flex-basis: 6em;
}
.div-flex-item-large {
background-color: lightgray;
margin: 0.8rem;
min-height: 12em;
flex-basis: 12em;
}
En donnant ainsi la propriété display:flex au contenant parent, on crée un flexbox avec des éléments flexibles!
Par contre, avez-vous remarqué que lorsque la fenêtre est à sa taille minimale, les éléments débordent ?
Pour régler ce problème, on doit indiquer au parent si les enfants ont le droit de d'effectuer un retour à la ligne lorsqu'ils atteignent la limite possible d'affichage à l'intérieur du parent.
Empêcher le débordement des enfants¶
Pour permettre aux enfant d'effectuer un retour à la ligne, on doit utiliser la propriété flex-wrap dans la définition du parent.
On reprend donc notre exemple précédent, en ajoutant cette simple propriété au bloc parent :
CSS
.div-flex-contenant{
background-color: plum;
width: 100%;
display: flex; /*crée un flexbox*/
flex-wrap: wrap; /*permet aux items de changer de ligne lorsqu'il manque de place*/
}
Résultat:
Taille des enfants: flex-basis VS width¶
Par défaut, une boîte enfant aura une taille égale à son contenu. Mais on peut évidemment modifier cela.
Avec les options de largeur (width), on gère uniquement la largeur spécifiquement (axe horizontal).
Avec flex-basis, on donne une taille de base sur l'axe de direction du flexbox.
Pour indiquer la taille associée aux boîtes enfant, nous avons les possibilités suivantes :
Propriété | Effet |
---|---|
aucune | La boîte tentera de prendre toute la largeur nécessaire pour afficher son contenu, tant que l'espace est disponible. Sinon, s'ajuste à l'espace disponible. |
width | Indique une largeur fixe, peu importe l'espace disponible ou le contenu interne. |
min-width | Indique une largeur minimale fixe. La boîte s'agrandie selon les besoins de son contenu et l'espace disponible. |
max-width | Indique une largeur maximale fixe. La boîte ne prendra jamais plus large, mais pourra rapetisser selon son contenu. |
flex-basis | Indique une taille de base sur l'axe de direction (largeur ou hauteur selon l'axe). Si l'espace est insuffisant et qu'il est imposible de décaler les autres boîtes sur une nouvelle ligne, alors la boîte rétrécira. Si l'espace est suffisant, la boîte prendra la largeur donnée. Cette propriété prend tout son sens avec l'une ou les deux propriétés : (1) flex-grow qui indique un facteur d'agrandissement (2) flex-shrink qui indique un facteur de rétrécissement. |
Des combinaisons possibles :
/*les trois valeurs suivantes, utilisées ensemble,
donnent le même résultat que
width: 20em **/
flex-basis: 20em;
flex-grow: 0;
flex-shrink: 0;
/*autre façon d'écrire cette combinaison :*/
flex: 0 0 20em;
/*les valeurs suivantes, utilisées ensemble,
indiquent que la taille minimale ne peut être
plus basse que 20em, mais que la boîte peut
s'agrandir s'il y a de la place*/
flex-basis: 20em;
flex-grow: 1;
flex-shrink: 0;
/*autre façon d'écrire cette combinaison :*/
flex: 1 0 20em;
/*les valeurs suivantes, utilisées ensemble,
indiquent que la taille de base est 20em, mais :
1- s'il y a de la place, la boîte peut s'agrandir par un facteur de 2
(le facteur de séparation de l'espace disponible attribuée à chaque boîte)
2- s'il manque de place, la boîte rétrécie d'abord à sa taille de base, puis s'il manque toujours de place,
les autres boîtes sont renvoyées à la ligne suivante. Si cela n'est pas possible, la boîte rétrécie à une taille plus petite que sa base.*/
flex-basis: 20em;
flex-grow: 2;
flex-shrink: 1;
/*autre façon d'écrire cette combinaison :*/
flex: 2 1 20em;
Pour indiquer la hauteur dans un flexbox horizontal, on peut utiliser height, min-height, max-height. Cela leur impose une limite d'une façon ou d'une autre. Si on ne donne aucune valeur en hauteur, alors :
- la hauteur de la boîte s'ajuste aux besoins du contenu et s'ajuste lorsque la boîte se redimensionne
- toutes les boîtes prendront automatiquement la même hauteur que la boîte la plus haute, s'il y a plus d'une boîte par ligne
- lorsque les boîtes sont affichées en une colonne, chaque boîte prend la hauteur nécessaire pour afficher son contenu
Donc, compte-tenu de ce comportement, on peut définir un min-height, à l'aide d'une unité relative, puis laisser la hauteur s'ajuster au contenu.
Exemple
En reprenant l'exemple plus haut, soit nos deux classes de boîtes :
.div-flex-item-small {
background-color: lightgray;
margin: 0.8rem;
min-height: 12em;
flex-basis: 10em;
flex-grow: 2; /*peut s'agrandir 2 fois plus rapidement que l'autre classe*/
}
.div-flex-item-large {
background-color: lightgray;
margin: 0.8rem;
min-height: 12em;
flex-basis: 20em;
flex-grow: 1;
flex-shrink:0;
}
Media query et flexbox¶
Évidemment, on peut utiliser les media query avec les flexbox pour couvrir le comportement que ces derniers doivent prendre pour différentes tailles d'écrans.
CSS
.div-flex-contenant {
display: flex;
flex-wrap: wrap;
flex-direction: column;
}
@media screen and (min-width:600px) {
.div-flex-contenant{
flex-direction: row;
}
}
Menu flex avec media query¶
HTML
<div class="div-flex-contenant">
<div><a href="#">Accueil</a> </div>
<div><a href="#">Produits</a></div>
<div><a href="#">Nous contacter</a></div>
<div><a href="#">À propos</a></div>
</div>
CSS
.div-flex-contenant{
margin: 0;
background: deepskyblue;
display: flex;
flex-flow: column wrap;
}
.div-flex-contenant a {
text-decoration: none;
display: block;
padding: 1em;
color: white;
text-align: center;
border-top: 0.1rem solid rgba(255,255,255,0.3);
border-bottom: 0.1rem solid rgba(0,0,0,0.1);
}
@media screen and (min-width: 600px) {
.div-flex-contenant {
justify-content: space-around;
flex-flow: row wrap;
padding: 0;
}
}
@media screen and (min-width: 900px) {
.div-flex-contenant {
justify-content: flex-end;
}
}
Pour en connaître d'avantage sur les flexbox¶
https://css-tricks.com/snippets/css/a-guide-to-flexbox/
https://developer.mozilla.org/fr/docs/Web/CSS/CSS_Flexible_Box_Layout