logo

Initiation au positionnement CSS :

1.flux et position relative

Par défaut, les navigateurs affichent les boîtes issues du document html dans l’ordre du flux normal. En position relative, un élément peut être décalé verticalement et/ou horizontalement.

Article

Pour représenter le positionnement en flux normal, on peut imaginer le navigateur parcourant (logiquement) la page de code HTML du début à la fin et retranscrivant son contenu au fur et à mesure des balises rencontrées. Comme dans la lecture d'un texte, il procède verticalement, commençant en « haut » de l'écran pour aller jusqu'en « bas », et horizontalement de gauche à droite, sur la totalité de l'espace disponible et nécessaire en largeur comme en hauteur.

Boîte de type bloc en flux normal

Par défaut, les boîtes de type bloc seront affichées dans une succession verticale. Prenons par exemple deux blocs différenciés par leur couleur :

En HTML :

<p class="jaune">Une boîte jaune</p>
<p class="verte">Une boîte verte</p>

En CSS :

.jaune {
  background-color: #ffff00;
}
.verte {
  background-color: #00ff00;
}

Le résultat, illustré par la figure ci-dessous, peut être observé également dans l'exemple 1 :

L'un au dessus de l'autre, la boîte bloc rectangulaire jaune et la boîte rectangulaire verte

Le navigateur traite successivement les deux éléments rencontrés. Comme il s'agit d'éléments de type bloc, il aligne la marge gauche de chaque élément sur la marge gauche de l'élément conteneur, c'est à dire ici le bloc conteneur initial.

Les principaux éléments créant des boîtes bloc sont :

  • l'élément div ;
  • les titres h1, h2, h3, h4, h5, h6 ;
  • le paragraphe p ;
  • Les listes et éléments de liste ul, ol, li, dl, dd ;
  • Le bloc de citation blockquote ;
  • Le texte pré-formaté pre ;
  • L'adresse address.

Boîte de type en-ligne

Par défaut, les boîtes de type en-ligne sont affichées dans une succession horizontale. Prenons par exemple deux portions de texte différenciées par leur couleur :

En HTML :

<p>
  <span class="jaune">Une boîte jaune</span>
  <span class="verte">Une boîte verte</span>
</p>

En CSS :

.jaune {
  background-color: #ffff00;
}
.verte {
  background-color: #00ff00;
}

Le résultat, illustré par la figure ci-dessous, peut être observé également dans l'exemple 2 :

De gauche à droite, la boîte rectangulaire jaune et la boîte rectangulaire verte

Les principaux éléments créant des boîtes en ligne sont :

  • l'élément span ;
  • le lien a ;
  • L'image img ;
  • Les emphases em et strong ;
  • La citation q ;
  • La citation cite ;
  • L'élément code ;
  • Le texte entré par l'utilisateur kbd ;
  • L'exemple samp ;
  • La variable var ;
  • Les abréviations et acronymes abbr, acronym ;
  • Le texte inséré ins ;
  • Le texte supprimé del.

Pour résumer le flux normal : c'est un traitement linéaire du contenu de la page. L'alignement des boîtes bloc est vertical ; l'alignement des éléments en-ligne dans les boîtes bloc est horizontal.

La position relative

Le positionnement relatif permet d'inscrire un contenu en flux normal, puis de le décaler horizontalement et/ou verticalement. Le contenu suivant n'est pas affecté par ce déplacement, qui peut donc entraîner des chevauchements.

Soit par exemple un positionnement relatif indice qui stipule un décalage vers le haut de 5 pixels et un arrière-plan jaune :

En HTML :

<p>
  Lorem
  <span class="jaune">
    boîte en position relative
  </span>
  ipsum dolor.
</p>

En CSS :

.jaune {
  position: relative;
  bottom: 5px;
  background-color: #ffff00;
}

Le résultat, illustré par la figure ci-dessous, peut être observé également dans l'exemple 3 :

Le texte de la boîte jaune se décale de 5 pixels vers le haut par rapport au reste du paragraphe

Pour illustrer le risque de chevauchement, ajoutons un décalage vers la droite :

En CSS :

.jaune {
  position: relative;
  bottom: 5px;
  left: 3em;
  background-color: #ffff00;
}

Le résultat, illustré par la figure ci-dessous, peut être observé également dans l'exemple 4 :

Le texte de la boîte jaune se décale de 5 pixels en haut et de 3em à droite : il déborde sur le texte qui suit

2. position absolue et fixe

La position absolue et la position fixe permettent de placer une boîte par rapport aux limites de la zone d’affichage ou du conteneur. Comment les utiliser dans une mise en page CSS ?

Une boîte en positionnement absolu peut être placée n'importe-où dans le code HTML et s'afficher à l'endroit de votre choix. Ceci s'avère très utile en particulier pour :

Le fonctionnement de la position absolue

Le positionnement absolu « retire » totalement du flux le contenu concerné : sa position est déterminée par référence aux limites du conteneur. Celui-ci peut-être :

Définissons un conteneur verte en position relative :

.verte {
  position: relative;
  background-color: #00ff00;
  width: 15em;
}
    

Et un positionnement absolu jaune :

.jaune {
  position: absolute;
  top: 1em;
  right: 1em;
  background-color: #ffff00;
}
    

Et appliquons ces styles :

<div class="verte">
  <p>
    …
  </p>
  <p class="jaune">
    Boîte jaune en position absolue
  </p>

</div>
    

Le résultat, illustré par la figure ci-dessous, peut être observé également dans l'exemple 1

La boîte jaune recouvre une partie du contenu de la boîte verte

Ménager un espace pour la boîte en position absolue

Inévitablement, la boîte en position absolue recouvre le contenu de notre paragraphe. Pour l'éviter, dotons la boîte conteneur verte d'un remplissage supérieur suffisant :

.verte {
  padding-top: 5em;
}
    

Le résultat, illustré par la figure ci-dessous, peut être observé également dans l'exemple 2

La boîte jaune occupe l'espace libre en haut de la boîte verte

Nous pourrions aussi bien fixer la largeur de la boîte jaune et doter le texte de la boîte verte d'un remplissage à droite :

.verte {
  padding-right: 7em;
}
.jaune {
  width: 4em;
}
    

Le résultat, illustré par la figure ci-dessous, peut être observé également dans l'exemple 3

La boîte jaune occupe l'espace libre à droite de la boîte verte

Utilisation : une mise en page à trois colonnes

La position absolue offre donc une alternative aux flottants pour réaliser des mises en pages à plusieurs colonnes. Le cas typique est celui des trois colonnes dont voici le code :

En CSS :


centre {
  margin: 1em 25%;
}
.gauche {
  position: absolute;
  top: 1em;
  left: 1%;
  width: 18%;
}
.droite {
  position: absolute;
  top: 1em;
  right: 1%;
  width: 18%;
}
    

En HTML :

<body>
  <div class="centre">
    …
  </div>

  <div class="gauche">
    …
  </div>
  <div class="droite">
    …
  </div>
</body>
    

Le résultat, illustré par la figure ci-dessous, peut être observé également dans la page-exemple 1 :

Trois colonnes dans la largeur de la page

La position fixe

Comme dans un positionnement absolu, le contenu concerné est retiré totalement du flux. Mais il est cette fois positionné uniquement par rapport aux limites de la zone de visualisation, autrement dit la fenêtre du navigateur. Le défilement de la page n'a aucun effet sur un contenu en position fixe.

Le positionnement fixe n'étant pas reconnu par Internet Explorer 5 et 6 Windows, un positionnement absolu doit s'y substituer dans ce navigateur. Ce résultat peut être atteint grâce à diverses formulations des styles jouant sur des syntaxes CSS2 ignorées par MSIE. Par exemple :

.fixe {
  position: absolute;
  top: 10px;
  left: 10px;
}
html>body .fixe {
  position: fixed;
}
    

MSIE Windows ne lira que la première définition de .fixe et ignorera la seconde car il ne comprend pas la syntaxe html>body. Les navigateurs supportant la position fixe liront les deux positionnements, mais le second se substituera au premier car il est placé après celui-ci dans la feuille de style.

Tout comme le positionnement absolu, le positionnement fixe est susceptible de provoquer des chevauchements. On employera donc des méthodes similaires pour l'exploiter.

Pour fixer un menu de navigation dans une colonne vide à gauche du contenu, on définira les largeurs du contenu et du menu :

En CSS :

.content {
  width: 65%;
  border: 1px solid #000000;
  padding: 1em 1%;
}
.menu {
  position: absolute;
  top: 1em;
  right: 1%;
  border: 1px solid #000000;
  padding: 1em;
  width: 20%;
}
html>body .menu {
  position: fixed;
}
    

En HTML :

<body>
  <div class="content">
  …
  </div>
  <div class="menu">
  …
  </div>

</body>
    

Le résultat, illustré par la figure ci-dessous, peut être observé également dans la page-exemple 2

Un menu fixe dans la colonne droite flanquant le contenu de la page

Utilisation : une barre de menu fixe

Lorsqu'il s'agit de créer une mise en page avec contenu et menus, la position fixe a l'inconvénient apparent de sacrifier une partie de la largeur d'affichage disponible, pour éviter les chevauchements.

En fait, cet inconvénient disparaît sitôt qu'on tire profit du chevauchement au lieu de chercher à l'éviter. Imaginons une barre de menu horizontale, fixée en permanence en haut de la fenêtre d'affichage :

En CSS :

.menufixe {
  top: 0;
  left: 0;
  width: 100%;
  border: 1px solid #000000;
  position: absolute;
  z-index: 2;
  text-align: center;
  background-color: #ffffff;
  line-height: 2em;
}

html>body .menufixe {
  position: fixed
}
.content {
  z-index: 1;
  padding-top: 3em;
}
    

En HTML :

<body>
  <div class="content">
    …
  </div>
  <p class="menufixe">

    …
  </p>
</body>
    

Le résultat, illustré par la figure ci-dessous, peut être observé également dans la page-exemple 3 :

Une barre de menu fixe en permanence en haut de la fenêtre du navigateur

Combinaisons des positions fixe et absolue

Imaginons à présent deux menus différents, tous deux placés dans la même colonne :

La propriété CSS z-index permet de spécifier le niveau d'empilement de chaque menu : avec un z-index supérieur à celui du menu fixe et un arrière-plan opaque, le menu en position absolue masquera temporairement celui-ci lors du défilement de la page. Le code nécessaire est :

En CSS :

.content {
  width: 65%;
  border: 1px solid #000000;
  padding: 1em 1%;
}
.menufixe {
  position: absolute;
  top: 1em;
  right: 2%;
  border: 1px solid #000000;
  padding: 1em;
  width: 18%;
  z-index: 2;
}
html>body .menufixe {
  position: fixed;
}
.menuabsolu {
  position: absolute;
  top: 15em;
  right: 1%;
  border: 1px solid #000000;
  padding: 1em;
  width: 20%;
  background-color: #ffffff;
  z-index: 3;
}
    

En HTML :

<body>
  <div class="content">

    …
  </div>
  <div class="menu">
    …
  </div>
</body>
    

Le point délicat est, bien-sûr, le choix de la valeur donnée à la propriété top du menu en position absolu, afin d'être sûr qu'il n'empiète pas sur l'espace du menu en position fixe.

Le résultat, illustré par la figure ci-dessous, peut être observé également dans la page-exemple 4 :

Un menu fixe et un menu absolu dans la colonne droite flanquant le contenu de la page

Conclusion

Le positionnement CSS donne donc toute liberté dans la mise en page. Comparée à l'utilisation des tableaux, cette technique offre des avantages essentiels :

3.position float

Une boîte flottante est retirée du flux normal, et placée le plus à droite (float: right) ou le plus à gauche (float: left) possible dans son conteneur. Le contenu suivant cette boîte flottante s'écoule le long de celle-ci, dans l'espace laissé libre.

Le fonctionnement des flottants

Ajoutons aux styles précédents une règle de positionnement flottant à droite et une mesure de largeur (facultative, mais utile pour certains navigateurs) :

En HTML:

<p class="jaune">Une boîte jaune flottant</p>
<p class="verte">Une boîte verte doté d'un contenu plus long…</p>

En CSS:

.jaune {
  background-color: #ffff00;
  float: right;
  width: 100px;
  margin: 0;
}
.verte {
  background-color: #00ff00;
}
    

Le résultat, illustré par la figure ci-dessous, peut être observé également dans l'exemple 1

Le texte de la boîte verte passe à la ligne à hauteur de la boîte jaune

Le navigateur place tout d'abord la boîte jaune, alignée sur le bord droit de cette partie de notre page, puis reprend le cours normal du flux dans l'espace laissé libre à sa gauche pour afficher la boîte verte. Le flux occupe tout l'espace disponible: la boîte verte reprend donc toute la largeur de la page sitôt passée la limite inférieure de la boîte flottante jaune.

Dans les navigateurs n'appliquant pas la feuille de style (navigateurs texte ou non conformes aux standards…), la boîte flottante sera simplement inscrite en flux normal avant la boîte qui la suit.

Première utilisation : une mise en page à deux colonnes

La combinaison de la position flottante et du flux permet de réaliser aisément une mise en page à deux colonnes (un contenu et un menu) :

En CSS :

.content {
  float: left;
  width: 70%;
}
.menu {
  margin-left: 80%;
  border: 1px solid #000000;
  padding: 1em;
}
    

Et en HTML :

…
<body>
  <div class="content">
    …
  </div>

  <div class="menu">
    <ul>
      <li>lien_1</li>
      <li>lien_2</li>
      <li>lien_3</li>

    </ul>
  </div>
</body>
    

Le résultat, illustré par la figure ci-dessous, peut être observé également dans la page-exemple 1

Un menu dans la colonne droite flanquant le contenu de la page

Seconde utilisation : une mise en page à trois colonnes et plus

Mais on peut tout aussi bien multiplier les flottants pour créer autant de colonnes que voulu :

En CSS :


body {
  margin: 0;
  padding: 0;
}
.float {
  float: left;
  width: 25%;
  margin: 1em 0;
}
p,h1,h2 {
  margin: 1em;
}
    

Et en HTML :

…
<body>
  …
  <div class="float">
    …
  </div>

  <div class="float">
    …
  </div>
  <div class="float">
    …
  </div>
  <div class="float">

    …
  </div>
</body>
    

Le résultat, illustré par la figure ci-dessous, peut être observé également dans la page-exemple 2 :

Sous le titre, 4 colonnes d'égale largeur.

Débordement et spacer

Le problème du débordement

Reprenons notre exemple, mais inversons les contenus: celui de la boîte flottante jaune est à présent plus long que celui de la boîte verte :

En HTML :

<p class="jaune">
  Une boîte jaune flottant doté d'un contenu plus long…
</p>
<p class="verte">
  Une boîte verte
</p>
      

Le résultat, illustré par la figure ci-dessous, peut être observé également dans l'exemple 2 :

La boîte jaune déborde vers le bas au-delà de la boîte verte

La boîte flottante, plus longue que la boîte verte, déborde verticalement plus bas que celle-ci.

La solution : le spacer

Pour éviter cet effet parfois disgracieux, la solution la plus répandue est le spacer de Mark Newhouse : elle consiste à inclure dans la boîte verte un élément bloc au contenu fictif (l'espace insécable  ), doté de la propriété clear qui lui interdit d'être adjacent à une boîte flottante.

En HTML :

<div class="verte5">
  <p class="jaune5">
    Une boîte jaune flottant doté d'un contenu plus long…
  </p>
  <p>
    Une boîte verte
  </p>

  <div class="spacer"> </div>
</div>
      

En CSS :

.jaune {
  background-color: #ffff00;
  float: right;
  width: 100px;
  text-align: center;
  margin: 0;
}
.verte {
  width: 100%;
  background-color: #00ff00;
}
.spacer {
  clear: both;
}
      

Le résultat, illustré par la figure ci-dessous, peut être observé également dans l'exemple 3

La boîte jaune ne déborde plus vers le bas au-delà de la boîte verte

Le bloc spacer, ne pouvant se placer à côté du bloc flottant, se trouve décalé plus bas que celui-ci.

Note : —

IE a parfois quelques difficultés à représenter correctement les arrières-plans et les bordures dans les combinaisons intégrant des boîtes flottantes à droite et des séparateurs dotés de la propriété clear: both.

Les vignettes : une utilisation du spacer et des flottantes

Mark Newhouse appliquait en particulier cette solution à une série de boîtes flottantes placées dans une boîte conteneur dont le contenu propre se réduit au spacer : elle ne sert qu'à créer une boîte délimitant l'espace visuel où s'affichent les boîtes flottantes.

En CSS :

.flottante {
  background-color: #00ff00;
  border: 2px dotted #ffff00;
  margin: 2px;
  float: left;
  width: 100px;
  text-align: center;
}
.conteneur {
  width: 100%;
}
.spacer {
  clear: both;
}
      

En HTML :

<div>
  <p class="flottante">boîte verte 1</p>
  <p class="flottante">boîte verte 2</p>
  <p class="flottante">boîte verte 3</p>

  …etc…
  <div class="spacer"> </div>
</div>
      

On obtient une série de vignettes pouvant accueillir par exemple des images, les liens d'un menu de navigation, etc. ou encore permettant de réaliser une mise en page en colonnes… Elle s'adapte automatiquement à la largeur d'affichage disponible : faute de place à droite, une boîte flottante sera replacée à la ligne.

Le résultat, illustré par la figure ci-dessous, peut être observé également dans l'exemple 4

6 vignettes alignées de gauche à droite sur deux lignes

Une variante du spacer : <hr />

Le défaut du spacer est d'introduire dans le code HTML un contenu fictif à des fins de présentation…

Lorsque la boîte adjacente à la boîte flottante est suivie d'une coupure logique dans votre page (nouvelle section de texte…), il est préférable d'associer la propriété clear à un contenu réel. La ligne horizontale créée par la balise <hr /> peut jouer avantageusement ce rôle :

En HTML :

<p class="jaune">
  Une boîte jaune flottant doté d'un contenu plus long…
</p>
<p class="verte">
  Une boîte verte

</p>
<hr />
      

En CSS :

.jaune {
  background-color: #ffff00;
  float: right;
  width: 100px;
  margin: 0;
}
.verte {
  background-color: #00ff00;
}
hr {
  clear: both;
}
      

Le résultat, illustré par la figure ci-dessous, peut être observé également dans l'exemple 5

La ligne horizontale en bas de la boîte verte empêche le débordement de la boîte jaune

La ligne de séparation s'avère très utile pour les utilisateurs de navigateurs qui ne tiendront pas compte de la feuille de style (navigateurs textes, navigateurs périmés…) Il est possible de leur en réserver l'affichage, en le supprimant dans les navigateurs qui appliqueront la feuille de style, à l'aide de la propriété visibility: hidden;: celle-ci rend un élément invisible, tout en le laissant agir sur le flux.

hr {
  clear: both;
  visibility: hidden;
}
      

Le résultat (figure ci-dessous et exemple 6) est visuellement identique au spacer précédent.

La boîte jaune ne déborde plus vers le bas au-delà de la boîte verte

Et appliqué à la série de vignettes flottantes, le résultat, illustré par la figure ci-dessous, peut être observé également dans l'exemple 7 :

6 vignettes alignées de gauche à droite sur deux lignes

4. CSS3 Flexbox Layout module

Positionner correctement des éléments en CSS s'est toujours révélé être une mission aussi palpitante que fastidieuse en raison d'un lourd passé de navigateurs assez peu enclins à suivre des standards communs. Depuis sa création, CSS propose officiellement quatre types de rendus d'éléments :

  • Le rendu "bloc"
  • Le rendu "inline"
  • Le rendu "tabulaire"
  • Le rendu "positionné"

Chacune des valeurs de la propriété display (par exemple inline-block), de float, ou de position, renvoie à l'un de ces quatre types de rendus.

CSS3 étend ce périmètre en introduisant un nouveau modèle de boîte "flexible" : Flexbox, ou Flexible Box Layout Module.

Flexbox est un nouveau mode de positionnement, introduit via la propriété display, permettant de créer un contexte général d'affichage sur un parent et d'en faire hériter ses enfants :

  • Distribution en bloc ou en ligne,
  • Alignements horizontaux et verticaux,
  • Gestion des espaces disponibles (fluidité à l'instar des cellules de tableau),
  • Réorganisation des éléments indépendamment de l'ordre du flux (DOM).

Compatibilité de Flexbox module

Commençons par calmer les plus optimistes d'entre vous et ceux que je vois déjà en train de se ruer sur leur éditeur HTML préféré. Posons d'entrée le décor ; j'ai deux bonnes et une mauvaise nouvelle :

  • La première bonne nouvelle est que les spécifications concernant Flexbox sont au stade de "Candidate Recommandation" et peuvent être aujourd'hui considérées comme stables.
  • La seconde bonne nouvelle est que l'implémentation de Flexbox sur les navigateurs est "relativement correcte", comme en témoigne l'excellente ressource Caniuse.
  • La mauvaise nouvelle est que les spécifications ont radicalement changé plusieurs fois et que les navigateurs compatibles sont susceptibles de reconnaître l'une ou l'autre des versions des spécifications, parfois de manière incomplète, et - bien entendu - avec moults préfixes de partout !

Malgré ces quelques petites embûches, consolez-vous en vous rappelant notamment que dans le monde du Web mobile, les navigateurs récents sont déjà parfaitement prêts à afficher vos sites web dans ce mode de positionnement avant-gardiste.

Tableau des compatibilités

Navigateurs Versions Détails
Internet Explorer Internet Explorer 10+
IE mobile 10+
- Ancienne spécification pour IE10 (2011). Avec préfixe -ms-
- Spécification finale sans préfixe pour IE11
Firefox Firefox 2+

- Ancienne spécification (2009). Avec préfixe -moz-
- Spécification finale sans préfixe depuis Firefox 22

Chrome Chrome 4+
Chrome Mobile (Android 4+)
- Ancienne spécification (2009) depuis Chrome 4. Avec préfixe -webkit-
- Spécification finale depuis Chrome 21. Avec préfixe -webkit-
- Spécification finale sans préfixe depuis Chrome 29.
- Ancienne spécification pour Chrome sur Android. Avec préfixe -webkit-
Opera Opera 12.1+
Opera Mobile 12.1+
- Spécification finale sans préfixe entre les versions 12 et 15
- Spécification finale depuis Opera 16. Avec préfixe -webkit-
Safari

Safari 3.1+
Safari Mobile (iOS 3.2+)

- Ancienne spécification (2009). Avec préfixe -webkit-
- Spécification finale depuis Safari 7. Avec préfixe -webkit-

Android Browser Android Browser 2.1+ - Ancienne spécification (2009). Avec préfixe -webkit-

Des spécifications fluctantes

Comme vous l'avez judicieusement constaté à la lecture attentive du tableau de compatibilité, la spécification de Flexbox a connu différentes étapes de syntaxe et nommage. Il y a eu trois syntaxes très différentes au cours de l'évolution de ce module :

Syntaxe 2009 Syntaxe 2011 Syntaxe 2012 (finale)
display : box display : flexbox display : flex
box-flex flex flex
box-ordinal-group flex-order order
box-orient flex-direction flex-direction
box-pack + box-align flex-pack justify-content + align-items

Pour des raisons pratiques évidentes, nous nous contenterons des syntaxes standardisées et sans préfixes au sein de cet article, il vous incombera de rajouter tous les préfixes constructeurs si vous désirez appliquer les exemples de codes sur votre navigateur préféré.

Appliquer Flexbox

Le principe général de Flexbox peut paraître assez déroutant de prime abord, mais finalement très pratique : il suffit de créer un "contexte de boîte flexible" sur un parent à l'aide de la propriété display afin qu'il soit appliqué à l'ensemble de ses enfants directs.

Tout au long de cet article et pour l'ensemble des exemples pratiques, nous avons choisi le navigateur Google Chrome, actuellement le plus à même de supporter cette spécification dans sa dernière version stable. Cependant, rien ne devrait vous empêcher de tester sur d'autres navigateurs.

En clair, la règle suivante va affecter les éléments enfants de .kiwi :

.kiwi {display: flex;}

flex01

Démonstration display: flex

Modifier l'orientation

L'un des premiers avantages de ce type de positionnement est de pouvoir jongler aisément entre une disposition d'éléments sous forme de colonnes (blocs) ou de lignes (inlines).

Pour ce faire, il suffit là encore d'indiquer ce comportement sur le parent à l'aide de la propriété flex-direction :

/* les enfants s'affichent en colonne */
.kiwi {flex-direction: column;} 

/* les enfants s'affichent en ligne */
.kiwi {flex-direction: row;} 

flex02

Démonstration flex-direction: column

Le suffixe -reverse inverse l'ordre d'affichage :

/* les enfants s'affichent en colonne inversée */
.kiwi {flex-direction: column-reverse;} 

/* les enfants s'affichent en ligne inversée */
.kiwi {flex-direction: row-reverse;} 

flex02b

Démonstration flex-direction: column-reverse

Dans la lignée de flex-direction, signalons l'existence de la propriété intéressante flex-wrap.

Cette propriété autorise (ou non) les éléments à s'afficher sur plusieurs lignes lorsqu'elles dépassent de leur conteneur, les valeurs étant les suivantes :

  • flex-wrap: nowrap : les éléments demeurent toujours sur une ligne, et peuvent déborder
  • flex-wrap: wrap : les éléments passent à la ligne plutôt que de déborder
  • flex-wrap: wrap-reverse : les éléments passent à la ligne… en inversant leur direction

flex03

Démonstration flex-wrap: wrap

flex03b

Démonstration flex-wrap: wrap-reverse

Pour votre culture personnelle, sachez qu'il existe une propriété raccourcie flex-flow qui regroupe flex-direction et flex-wrap.
Ne vous étonnez donc pas de rencontrer tantôt la syntaxe .kiwi {flex-flow: column;}

/* affichage en ligne et passage à la ligne autorisé */
.kiwi {flex-flow: row wrap;} 

Gérer les alignements horizontaux et verticaux

Flexbox propose de gérer très finement les alignements et centrages, en différenciant les deux axes d'affichage de cette manière :

  • Les alignements dans l'axe principal sont traités via la propriété justify-content et ses différentes valeurs : flex-start, flex-end, center, space-between et space-around
  • Les alignements dans l'axe secondaire sont gérés avec align-items et ses valeurs : flex-start, flex-end, center, baseline, stretch

Exemple de centrage horizontal et vertical :

.kiwi {
  justify-content: center;
  align-items: center;
} 

flex04

Démonstration justify-content

flex05

Démonstration align-items

Alignement : gérer les exceptions

La propriété align-self offre la possibilité de distinguer un élément particulier de ses frères en adoptant un alignement différent.

Attention toutefois, cette méthode peut dans certains cas causer des soucis d'accessibilité lorsque la feuille de style est désactivée (Cf Accessiweb 2.2 critère 10.3).

.kiwi > li:last-child {
  align-self: flex-end;
} 

flex05b

Démonstration align-self

Autre astuce, la propriété margin et sa valeur auto permettent de positionner un élément en dehors de la distribution de ses frères.

Il devient donc possible d'afficher un groupe d'élément à gauche du parent et d'en placer un à droite :

.kiwi {
  justify-content: flex-start;
} 
.kiwi > li:last-child {
  margin-left: auto;
}

flex05c

Démonstration margin: auto

Jouer avec la flexibilité des éléments

Cela ne devrait étonner personne, la notion de flexibilité constitue le fondement du module de positionnement Flexbox, et c'est là qu'intervient l'indispensable propriété flex.

La propriété flex est un raccourci de trois propriétés, flex-grow, flex-shrink et flex-basis, dont les fonctions sont :

  • flex-grow : propension pour un élément à s'étirer dans l'espace restant
  • flex-shrink : propension pour un élément à se contracter si besoin
  • flex-basis : taille initiale de l'élément avant que l'espace restant ne soit distribué

Les particularités des propriétés de flexibilité étant assez nombreuses (et leurs spécifications assez alambiquées), je vous propose un petit résumé explicatif simplifié :

Pour rendre un élément flexible, il suffit de lui attribuer une valeur de flex-grow (ou flex en raccourci) supérieure à zéro.
Cet élément occupera alors l'espace restant au sein de son conteneur :

/* .salade occupera l'espace restant */
.salade {
  flex: 1;
}

Plusieurs éléments peuvent être rendus flexibles et se répartir l'espace restant.

Dans l’exemple ci-dessous, l’espace total est découpé en 4 (1+2+1), puis partagé entre les trois éléments selon le "poids" attribué à chacun. En l’occurrence, le troisième occupera la moitié de l’espace (2/4), les deux autres se partageant le reste par parts égales.

.salade {
  flex: 1;
}   
.tomate {
  flex: 2;
}   
.oignons {
  flex: 1;
}

En ajoutant une valeur supplémentaire, celle de flex-basis, il est possible d'indiquer une largeur minimale préférée qui sera appliquée tant qu'il n'y a pas d'espace superflu :

.salade {
  flex: 1 200px;
}   
.tomate {
  flex: 2 400px;
}   
.oignons {
  flex: 1 200px;
}

flex06

Démonstration flex n°1

flex06b

Démonstration flex n°2

Gabarit flexible

Réordonner les éléments au sein de leur parent

L'une des fonctionnalités les plus avant-gardistes du modèle d'affichage Flexbox est de pouvoir réordonner à sa guise chacun des éléments indépendamment grâce à la propriété order.

Les valeurs de order agissent telles des pondérations : les éléments dont la valeur est la plus forte se trouveront en bas de la pile. La valeur initiale de order est 0.

/* le premier de la liste s'affichera en bas de pile */
li:first-child {
  order: 1;
}

flex07

Démonstration order

Démonstration navigation

Pour aller plus loin

Voici quelques ressources externes pour en savoir plus sur ce positionnement très polyvalent :

Articles et tutoriels connexes

Alternatives

Il existe un outil de type polyfill en JavaScript afin d'émuler le support de Flexbox sur les anciens navigateurs tels IE6-IE9 et Opera 10. Il s'agit de Flexie.js. Vous pouvez le tester sur Flexie Playground. Sachez cependant que cette alternative JavaScript ne semble plus mise à jour depuis une bonne année et se base sur la syntaxe désuette de 2009.

Signalons également l'existence d'un outil de test de Flexbox en ligne : Flexplorer (à tester sur un navigateur compatible).

Conclusion

Flexbox est une spécification vaste et complexe, nous n'en n'avons démontré que les parties les plus exploitables mais d'autres recoins restent à explorer et seront dévoilés au fur et à mesure de leur support avec les navigateurs. Quoi qu'il en soit, le positionnement Flexible Layout regroupe de nombreuses bonnes pratiques et attentes des webdesigners et intégrateurs depuis de longues années. Dans un avenir proche (ou dès maintenant selon votre cible), il constitue sans aucun doute la méthode de positionnement la plus pratique et polyvalente.