Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Responsive Web Design, mises en page et grilles
  3. La mise en page flexible en CSS3
Extrait - Responsive Web Design, mises en page et grilles Les techniques modernes de conception web (2e édition)
Extraits du livre
Responsive Web Design, mises en page et grilles Les techniques modernes de conception web (2e édition) Revenir à la page d'achat du livre

La mise en page flexible en CSS3

Le module Flexible Box Layout du W3C

Le module CSS Flexible Box Layout Module Level 1, de son nom complet, est presque finalisé au W3C. En effet, il était en Candidate Recommendation le 26 mai 2016 : https://www.w3.org/TR/css-flexbox-1/.

Ce module est souvent présenté comme le Graal de la mise en page pour les intégrateurs web. Il va nous permettre de créer des mises en page avec des colonnes de manière très simple. Le principe d’utilisation des boîtes flexibles est le suivant : il suffit de définir un conteneur parent en tant que boîte flexible pour que tous ses éléments, enfants inclus, adoptent son comportement. Ensuite, pour chaque boîte enfant, nous pourrons déterminer les propriétés d’affichage voulues.

La compatibilité des navigateurs

Sur le site Can I Use, nous pouvons voir que ce module est reconnu par tous les navigateurs modernes, mis à part Microsoft Internet Explorer v11. De ce fait, de nombreux sites web l’utilisent déjà en production.

images/C07-001.png

La conception de mise en page flexible

Le Flexible Box Layout, que nous pouvons traduire par "modèle de boîte flexible", nous propose un tout nouveau concept de mise en page des boîtes. L’élément de structure de base est un conteneur qui donne le contexte de boîte flexible (flex-container en anglais). Tous les éléments enfants de ce conteneur parent hériteront de ce contexte et seront des items flexibles (flex-items en anglais).

Nous aurons donc :

  • un conteneur parent flexible donné par la propriété display: flex.

  • tous les éléments enfants directs qui seront des items flexibles.

Nous pourrons ensuite gérer la distribution des éléments enfants, gérer les alignements et les centrages, choisir de réorganiser l’affichage des items et gérer les espaces.

Le conteneur flexible

1. La définition du contexte flexible

C’est avec la propriété display: flex que nous allons définir le contexte de boîte flexible pour un conteneur donné.

Nous créons une boîte <div> flexible, avec trois paragraphes enfants.

Voici les règles CSS :


<style>  
    #boite-flexible {  
    display: flex;  
    border: solid 1px #000;  
    }  
</style>
 

La bordure du conteneur flexible est définie pour bien matérialiser la boîte <div>.

Voici la structure HTML :


<div id="boite-flexible">  
    <p>Vivamus sagittis lacus...</p>  
    <p>Integer posuere...</p>  
    <p>Donec sed odio dui...</p>  
</div>
 

Voici l’affichage obtenu :

images/C07-002.png

Nous pouvons tester immédiatement l’aspect flexible de cette mise en page en redimensionnant la fenêtre du navigateur.

Affichage sur un écran large :

images/C07-003.png

Affichage sur un écran étroit :

images/C07-004.png

Les paragraphes enfants, donc les items flexibles, s’adaptent automatiquement à la largeur de la fenêtre du navigateur. Nous avons bien une mise en page flexible.

Le fichier d’exemple à télécharger est Chapitre-07/C07-D1.html.

La propriété display: flex agit sur le conteneur comme un affichage block, comme avec les techniques de mise en page "traditionnelles". La propriété display: inline-flex agit sur le conteneur comme un affichage inline.

2. La distribution des items flexibles

Dans l’exemple précédent, les items flexibles sont distribués horizontalement dans le conteneur ; les paragraphes s’affichent les uns à côté des autres. Nous pouvons modifier cet affichage avec la propriété flex-direction.

Cette propriété peut recevoir ces valeurs :

  • row : les items sont distribués en ligne, c’est la valeur par défaut.

images/C07-045.png
  • row-reverse : même distribution, mais les items sont affichés dans le sens inverse de leur déclaration dans le code.

images/C07-046.png
  • column : les items sont distribués en colonnes, les uns sous les autres.

images/C07-047.png
  • column-reverse : même distribution en colonnes, mais les items...

Les items flexibles

1. Le contexte des items flexibles

Nous l’avons vu précédemment, dès qu’un conteneur utilise la propriété display: flex, il définit un contexte flexible. Cela veut dire que tous les enfants directs de ce conteneur, les items flexibles, seront dans un contexte flexible. Dans ce titre nous allons étudier les propriétés que nous pouvons appliquer aux items flexibles.

2. Modifier l’ordre d’affichage des items

La propriété order nous permet de modifier l’ordre d’affichage des items flexibles, quel que soit leur ordre de déclaration dans le code. Par défaut, la valeur de la propriété order est 0. Nous pouvons donc attribuer une valeur à n’importe quel item flexible. L’item ayant la valeur la plus grande sera affiché en dernier et inversement l’item ayant la valeur la plus petite sera affiché en premier.

Voici un conteneur ayant cinq items flexibles, cinq paragraphes. Le conteneur et les paragraphes possèdent des bordures et des arrière-plans colorés afin de mieux les visualiser.

Voici les règles CSS utilisées :


<style>  
    #boite-flexible {  
        display: flex;  
        flex-direction: row;  
        justify-content: flex-start;  
        border: solid 1px #000;  
    }  
    p {  
        margin: 0;  
        background-color: #eee;  
        border: solid 1px #000;  
        padding: 10px;  
    }  
</style>
 

La structure HTML comporte un conteneur, #boite-flexible, avec cinq paragraphes identifiés comme items enfants.


<div id="boite-flexible">  
    <p id="p1"><strong>Premier</strong>. Vivamus sagittis...</p>  
    <p id="p2"><strong>Deuxième</strong>. Integer posuere...</p>  
    <p id="p3"><strong>Troisième</strong>....

Des exemples de mises en page

1. Une mise en page très simple

Pour ce premier exemple de mise en page avec le module Flexbox, nous allons concevoir une structure très simple.

Nous avons un conteneur, dans une boîte <div>, qui a une largeur maximale flexible de 900 pixels. Il est centré dans la fenêtre du navigateur.

Ensuite, nous souhaitons avoir deux blocs l’un à côté de l’autre. Le deuxième bloc à droite, avec un élément <aside>, a une largeur fixe de 150 pixels. Le premier bloc à gauche, avec un élément <article>, va occuper la place restante.

Voici le schéma de la structure :

images/C07-049.png

Voici la structure HTML :


<div id="conteneur">  
    <article>  
        <h2>Dolor Ultricies Fringilla</h2>  
        <p>Pellentesque habitant morbi...</p>  
        <h2>Consectetur Porta Tortor</h2>  
        <p>Donec ullamcorper nulla non...</p>  
        <h2>Pharetra Mattis</h2>  
        <p>Lorem ipsum dolor sit amet...</p>  
    </article>  
    <aside>  
        <h3>Les liens</h3>  
        <ul>  
            <li><a href="#">Lien 1</a></li>  
            <li><a href="#">Lien 2</a></li>  
            <li><a href="#">Lien 3</a></li>  
            <li><a href="#">Lien 4</a></li>  
            <li><a href="#">Lien 5</a></li>  
        </ul>  
    </aside>  
</div>
 

Voyons maintenant les CSS utilisés...

La mise en page flexible et le Responsive Web Design

Nous pouvons bien sûr avoir une mise en page flexible et responsive. Nous allons repartir de l’exemple du titre Une mise en page plus élaborée.

Pour les écrans ayant une largeur maximale de 480 pixels, nous modifions simplement l’affichage des blocs afin qu’ils soient positionnés les uns sous les autres.

Nous devons dans un premier temps changer la distribution des blocs dans le conteneur général et dans la boîte <div id="main">. Dans ces deux éléments, les éléments enfants doivent s’afficher les uns sous les autres.

Voici la requête de média correspondante :


@media screen and (max-width: 480px) {  
    #conteneur {  
        display: flex;  
        flex-direction: column;  
    }  
    #main {  
        display: flex;  
        flex-direction: column;  
    }  
}
 

Voici l’affichage obtenu sur un petit écran :

images/C07-061.png

Vous visualisez à quel point la mise en page flexible est performante : deux règles CSS modifiées et l’affichage est optimisé pour les petits écrans.

Maintenant...