Alexandre CANTIN - Blog personnel

01 avr. 2020

display-grid: une nouvelle maniere d'organiser vos pages web (1/2)

Les CSS grid ont été implémentés dans les principaux navigateurs Internet en 2017 (même Edge !). Cette nouvelle spécification simplifie grandement la mise en place du design de nos pages Web et s’inspire des design avec <table>, si populaires dans le passé :)

Un premier exemple

Pour utiliser les CSS grid, le point de départ est l’utilisation de l’attribut CSS display: grid dans la div contenant les éléments à organiser. Nous obtenons ainsi l’accès à de nouvelles propriétés CSS.

Les deux principales sont grid-template-columns et grid-template-rows. Ces dernières permettent d’organiser notre grille : nombre de colonnes et lignes, ainsi que l’espace qu’elles prendront. La propriété grid-gap nous permet aussi d’espacer, entre eux, les éléments de notre grille.

Par exemple, pour créer une grille de 3 colonnes et 2 lignes, nous procéderons de la manière suivante :

<div class="parent">
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
</div>

<style>
  .parent {
    display: grid;
    grid-template-rows: 1fr 1fr;
    grid-template-columns: 1fr 1fr 1fr;
    grid-gap: 20px;

    height: 100px;
  }
  .parent div {
    background-color: lightgray;
  }
</style>

Avant de montrer le résultat du code ci-dessus, il est d’abord nécessaire d’expliquer la notion de fr : il s’agit en réalité d’une ‘fraction’ de l’espace disponible.

Cette unité laisse au navigateur le soin de gérer les arrondis, souvent problématiques en CSS… Qui n’a pas rencontré des soucis avec des div de 33% ou 33.33% ? Avec fr, le navigateur s’occupe de tout !

De plus, nous pouvons modifier gérer plus finement la répartition des largeurs. Par exemple, pour une répartition 2/3 et 1/3, nous pouvons faire grid-template-columns: 2fr 1fr;. Cette notion est équivalente à celle existante dans flex.

Bien sûr, il est aussi possible de préciser des dimensions en pixels ou pourcentage.

Pour revenir à notre exemple, nous obtenons donc une grille de 3x2 élements donc chaque bloc est séparé de 20px :

Simple non ? On peut ainsi facilement créer le système de 12 colonnes de Boostrap avec le code suivant grid-template-columns: repeat(12, 1fr) qui nous permet de découvrir repeat, une instruction pratique pour moins utiliser son clavier :-)

Les propriétés CSS : grid-column & grid-row

Dans certains cas, nous souhaitons que nos éléments prennent plus d’une case dans notre grille. Pour cela, le module grid propose deux propriétés : grid-column et grid-row avec l’attribut span X, x étant le nombre de cases à fusionner.
Au niveau de leur fonctionnement, il est similaire à celui des rowspan et colspan dans les balises td de nos table.

<div class="parent">
  <div class="two-columns"></div>
  <div class="two-rows"></div>
  <div></div>
  <div></div>
</div>

<style>
  .parent {
    display: grid;
    grid-template-rows: 1fr 1fr;
    grid-template-columns: 1fr 1fr 1fr;
    grid-gap: 20px;

    height: 100px;
  }
  .parent div {
    background-color: lightgray;
  }

  .two-columns {
    grid-column: span 2;
  }
  .two-rows {
    grid-row: span 2;
  }
</style>

Résultat :

Responsive

L’avantage des grid-template-columns est aussi de faciliter la mise en place d’un comportement responsive sur notre site. En effet, si on souhaite basculer sur une colonne sur mobile, il suffit de spécifier :

<style>
  @media (max-width: 760px) {
    .parent {
      grid-template-columns: 1fr;
      grid-template-rows: 1fr 1fr 1fr 1fr;
      grid-gap: 5px;
    }
    .two-columns {
      grid-column: span 1;
    }
    .two-rows {
      grid-row: span 1;
    }
  }
</style>

Résultat :