Flexbox & Grid

Remi Forax

Histoire des Layouts

Différents modèles de placement (layout)

  • pre-CSS: table (avant 1996)
  • CSS1: float (1996+)
  • CSS1/CSS2: position (1996/2011+)
  • CSS3: Flexbox et Grid (2015)

Flexbox

CSS Flexbox ?

“CSS Flexible Box Layout, commonly known as Flexbox, is a CSS 3 web layout model. The flex layout allows responsive elements within a container to be automatically arranged depending upon screen size (or device).”

source: Wikipedia.org - Flexbox

CSS Flexbox ?

“CSS Flexible Box Layout, ou communément FlexBox, est un modèle de layout CSS 3 pour le web. Ce layout flexible permet d'arranger automatiquement les éléments à l'intérieur d'un conteneur de façon responsive en fonction de la taille de l'écran (ou de l'appareil).”

sources : Wikipedia.org - Flexbox

Historique des versions

CC3 Flexbox2009-2012
Support dans Firefox, Chrome, Safari2014, 2015
Flexbox 1.02016+
W3c FlexBox2018

Réponds à deux questions

  • Comment aligner verticalement des boites ?
  • Comment placer des boites de façon responsive ?

Exemple

Modèle d'affichage display: flex

<div class="container">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
</div>
            

Propriétés du conteneur

Direction

  • flex-direction: row | row-reverse | column | column-reverse

Alignement Horizontal

  • justify-content: start | end | center | space-between | space-evenly | space-around

Alignement Vertical

En fait, alignement sur l'axe opposé à flex-direction

  • align-items: start | end | center | baseline | stretch

Multi-lignes

Si il n'y a pas assez de place sur une ligne ...

  • flex-wrap: nowrap | wrap | wrap-reverse
  • align-content: start | end | center | space-between | space-around | space-evenly | stretch

Flex-flow

La propriété flex-flow permet de définir flex-direction et flex-wrap en une seule propriété

  • flex-flow: flex-direction flex-wrap

Espacement ligne/colonne

gap indique un espacement minimal entre les boites

  • row-gap: 10px et column-gap: 20px
  • gap: 10px 20px /* row-gap column-gap */
  • gap: 10px /* 10px 10px */

Propriétés des éléments

Alignement vertical spécifique

Un élément peut indiquer qu'il a un alignement spécifique align-self au lieu d'utiliser align-items du conteneur

  • align-self: auto | flex-start | flex-end | center | baseline | stretch

Taille d'un élément

flex-basis définie la taille

  • flex-basis: auto /* use width/height */
  • flex-basis: 100px
  • flex-basis: 20%

Agrandissement responsive

flex-grow indique qu'un élement participe à l'agrandissement
0= pas d'agrandissement, 1= agrandissement

Agrandissement responsive

si plusieurs flex-grows, alors l'agrandissement est proportionnel aux valeurs

Rétrécissement responsive

flex-shrink indique le facteur de rétrécissement
proportionnel comme flex-grow mais avec 1 comme valeur par défaut

Attribut flex

flex indique les différents facteurs en une seule propriété flex: flex-grow flex-shrink flex-basis

En résumé

Flexbox permet d'avoir un layout adaptatif, mais on a que le choix entre wrap/nowrap, sinon il faut utiliser les media-query

  • Sur le conteneur, display: flexbox + flex-flow
  • Sur les élements, flex

Grid

CSS Grid ?

“CSS grid layout or CSS grid creates complex responsive web design grid layouts more easily and consistently across browsers.”

source: Wikipedia.org - Grid layout

CSS Grid ?

“CSS grid Layout ou CSS grid crée des grilles de placement complexe et responsive plus simplement et de la même façon quel que soit le navigateur.”

sources : Wikipedia.org - Grid layout

Historique des versions

Création2011
Support dans Firefox, Chrome, Safari2017
W3c CSS Grid2020

Exemple

Modèle d'affichage display: grid

<div class="container">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
</div>
            

Propriétés du conteneur

Grid-template-[columns|rows]

Indique les tailles de chaque colonne et de chaque ligne

Grid-template-* Unités

  • en pixels: 100px
  • en %: 20% (pourcentage su conteneur)
  • en fr: 2fr (espace libre/proportionnel)
  • min-content: (texte) taille du plus grand mot
  • max-content: (texte) taille de tous les mots

Grid-template-* repeat

La macro repeat(times, value) permet d'appliquer la même valeur à toute les colonnes (resp. lignes) d'une grille

Alignement Horizontal

  • justify-content: start | end | center

Alignement Vertical

Alignement le long de l'axe des colonnes

  • align-items: start | end | center | baseline | stretch

Espacement ligne/colonne

gap définie l'espacement entre les colonnes ou les lignes
marche comme avec flexbox

  • row-gap: espacement entre lignes
  • column-gap: espacement entre les colonnes
  • gap: row-gap column-gap