CSS Box Alignment

Le module de spécification CSS Box Alignment (alignement des boîtes en CSS) décrit les fonctionnalités relatives à l'alignement des boîtes pour les différents modes de disposition CSS : disposition en bloc, en tableau, disposition flexible et disposition en grille. L'objectif de ce module est d'obtenir des méthodes d'alignement cohérentes pour tout CSS. Dans ce guide, nous verrons les différents concepts utilisés par cette spécification.

Note : La documentation relative à chaque méthode de disposition explicitera comment le module d'alignement est appliqué pour cette méthode.

Anciennes méthodes d'alignement

Par le passé, CSS disposait de peu d'outils pour l'alignement. Le texte pouvait être aligné grâce à text-align, les blocs pouvaient être centrés avec des marges (margin) automatique et les tableaux ou éléments en affichage inline-block pouvaient tirer parti de vertical-align. Désormais, l'alignement du texte est couvert par les modules Inline Layout et CSS Text et, pour la première fois, avec le module Box Alignment, on dispose d'outils complets pour l'alignement vertical et horizontal.

Si vous connaissez déjà les boîtes flexibles (flexbox), vous reconnaitrez certaines propriétés faisant partie de la spécification de niveau 1 pour Flexbox. Toutefois, la spécification indique que la spécification Box Alignment est prioritaire car elle peut décrire certaines fonctionnalités supplémentaires.

Exemples simples

Dans les exemples suivants, nous allons voir comment certaines des propriétés d'alignement peuvent être appliquées sur des dispositions en grille ou utilisant les boîtes flexibles.

Alignement pour une disposition en grille

Dans cet exemple avec une grille, on dispose d'un espace restant dans le conteneur après avoir placé les pistes de largeur fixe le long de l'axe en ligne (l'axe principal). L'espace est réparti grâce à la propriété justify-content. Sur l'axe de bloc (l'axe secondaire), l'alignement des éléments sur la grille est dicté par align-items. Le premier objet surcharge la règle fournie par align-items en utilisant align-self avec la valeur center.

Alignement pour une disposition flexible (flexbox)

Dans cet exemple, trois objets flexibles sont alignés le long de l'axe principal avec justify-content et selon l'axe secondaire avec align-items. Le premier objet surcharge la règle indiquée avec align-items grâce à la propriété align-self qui vaut ici center.

Concepts majeurs et terminologie

Ce module de spécification définit des termes relatifs à l'alignement afin de pouvoir se référer à ces concepts sans qu'ils soient particulièrement liés à l'implémentation particulière d'un mode de disposition. Ces concepts sont communs à l'ensemble des méthodes de disposition.

Liens avec les modes d'écriture

L'alignement est lié aux modes d'écriture et, lorsqu'on aligne un élément, on ne l'aligne pas selon des axes « physiques » (haut, droit, bas, gauche) mais selon le début ou la fin des dimensions utilisées par ce mode d'écriture. Cela permet de s'assurer que l'alignement fonctionne de la même façon, quel que soit le mode d'écriture utilisé par le document.

Deux dimensions pour l'alignement

Lorsqu'on utilise les propriétés d'alignement, on aligne le contenu selon deux axes : l'axe en ligne (inline axis) et l'axe de bloc (block axis). L'axe en ligne correspond à l'axe selon lequel les mots sont écrits pour ce mode d'écriture. En français, par exemple, l'axe en ligne est un axe horizontal dirigé de la gauche vers la droite. L'axe de bloc est orthogonal à l'axe en ligne et suit la direction selon laquelle les blocs de texte sont disposés les uns à la suite des autres.

Lorsqu'on aligne des objets le long de l'axe en ligne, on utilisera les propriétés qui commencent par justify-:

Lorsqu'on aligne des objets le long de l'axe de bloc, on utilisera les propriétés qui commencent par align-:

Flexbox ajoute un niveau de complexité car si flex-direction vaut row, ces règles sont vraies mais si flex-direction vaut column, elles sont inversées. Toutefois, lorsqu'on travaille avec les boîtes flexibles, il est préférable de penser en termes d'axe principal et d'axe secondaire plutôt qu'en termes d'axe en ligne et d'axe de bloc. Les propriétés justify- permettent toujours d'aligner selon l'axe principal et les propriétés align- d'aligner selon l'axe secondaire.

Le sujet de l'alignement (alignment subject)

Le sujet de l'alignement est l'objet qu'on aligne. Pour justify-self ou align-self, ou lorsqu'on paramètre ces valeurs pour un group avec justify-items ou align-items, cela correspondra à la boîte de marge de l'élément sur lequel la propriété est appliqué. Les propriétés justify-content et align-content varient selon la méthode de disposition utilisée.

Le conteneur d'alignement (alignment container)

Le conteneur d'alignement est la boîte au sein de laquelle le sujet est aligné. Il s'agit généralement du bloc englobant du sujet de l'alignement. Un conteneur d'alignement peut contenir un ou plusieurs sujets.

Dans l'image qui suit, on voit un conteneur d'alignement qui contient deux sujets.

L'alignement de recours (fallback)

Si l'alignement défini ne peut pas être respecté, on utilisera un alignement de recours (fallback alignment) qui déterminera comment gérer l'espace disponible. L'alignement de recours est défini spécifiquement pour chaque méthode de disposition.

Types d'alignement

Il existe trois types d'alignement définis par la spécification et qui fonctionnent avec des mots-clés.

  • Alignement en position : la position du sujet est définie relativement à celle du conteneur.
  • Alignement selon la ligne de base : ces mots-clés définissent l'alignement comme une relation entre les lignes de base des sujets au sein d'un contexte d'alignement.
  • Alignement distribué : ces mots-clés définissent l'alignement comme une distribution de l'espace entre les sujets.

Alignement en position avec des mots-clés

Les valeurs suivantes permettent de réaliser un alignement en position et peuvent être utilisées comme valeurs pour justify-content, align-content ainsi que pour justify-self et align-self.

  • center
  • start
  • end
  • self-start
  • self-end
  • flex-start (uniquement pour les boîtes flexibles)
  • flex-end (uniquement pour les boîtes flexibles)
  • left
  • right

En dehors des valeurs physiques left et right qui sont relatives à la disposition physique de l'écran, les autres valeurs sont des valeurs logiques qui font référence au mode d'écriture du contenu.

Si on prendre l'exemple d'une disposition en grille : en français, utiliser justify-content avec start déplacera les éléments sur l'axe en ligne au début, ce qui correspondra, dans ce cas, à la gauche. Si on utilise cette même règle avec un document écrit en arabe, qui s'écrit de droite à gauche, la valeur start regroupera les éléments sur le côté droit de la page.

On voit ici que ces deux exemples utilisent justify-content: start mais que l'emplacement des sujets varie selon le mode d'écriture.

Alignement selon la ligne de base

Les mots-clés pour l'alignement sur les lignes de bases permettent d'aligner les lignes de bases des boîtes parmi un groupe de sujets. Ces valeurs peuvent être utilisées avec justify-content, align-content ou avec justify-self et align-self.

  • baseline
  • first baseline
  • last baseline

L'alignement du contenu selon la ligne de base (c'est-à-dire avec justify-content ou align-content) fonctionne pour les méthodes de disposition qui organisent les objets en lignes. Les sujets sont alignés sur une ligne de base commune en ajoutant du remplissage (padding) à l'intérieur de chaque boîte si nécessaire.

L'alignement des éléments (self alignment) (c'est-à-dire avec justify-self ou align-self pour des sujets distincts ou avec justify-items et align-items pour des groupes) décale les boîtes afin de les aligner sur une ligne de base en ajoutant une marge à l'extérieur des boîtes.

Alignement distribué

Les mots-clés permettant de décrire un alignement distribué sont utilisés avec les propriétés align-content et justify-content. Ces mots-clés définissent ce qui se produit lorsqu'il reste de l'espace après que les sujets aient été affichés. Les valeurs correspondantes sont :

  • stretch
  • space-between
  • space-around
  • space-evenly

Ainsi, si des objets flexibles sont alignés avec flex-start et qu'on travaille dans un mode d'écriture horizontal de gauche à droite et de haut en bas (comme le français) avec flex-direction qui vaut row, les sujets commenceront à gauche et l'espace disponible sera affiché à droite après que les sujets aient été placés.

Si on utilise justify-content: space-between sur le conteneur flexible, l'espace disponible sera alors réparti entre les objets.

Pour que ces mots-clés aient un effet, il est nécessaire qu'il reste de l'espace supplémentaire. S'il n'y a plus d'espace, aucune distribution ne pourra être effectuée.

Gestion du dépassement

Les mots-clés safe et unsafe permettent de définir le comportement obtenu lorsque le sujet d'alignement est plus grand que le conteneur. Le mot-clé safe alignera selon start si l'alignement indiqué provoque un dépassement, afin de réduire la « perte de données » visible en dehors du conteneur et sur laquelle l'utilisateur ne pourra pas avoir accès.

La valeur unsafe permet de respecter l'alignement indiqué, même si celui-ci provoque un dépassement entraînant une telle perte de données.

Espaces entre les boîtes

La spécification pour l'alignement des boîtes inclut également les propriétés gap, row-gap et column-gap. Ces propriétés permettent d'obtenir un espacement cohérents entre les objets d'une ligne ou d'une colonne pour tout mode de disposition organisant les objets de cette façon.

La propriété gap est une propriété raccourcie pour row-gap et column-gap et qui permet de définir ces deux propriétés en une seule règle.

Dans l'exemple suivant, on a une disposition en grille et on utilise la propriété raccourcie gap afin de définir un espace de 10px entre chaque piste de ligne et un espace de 2em entre chaque piste de colonne.

Dans cet exemple, on utilise la propriété gap en plus de la propriété gap. Les propriétés d'espacement, initialement définies pour la disposition en grille, étaient préfixées par grid- et certains navigateurs ne prennent encore en charge que ces versions préfixées :

Ces versions préfixées seront maintenues comme des alias des propriétés non-préfixées. Toutefois, il est toujours possible de les dédoubler comme on le fait avec les propriétés préfixées des différents éditeurs : déclarer la propriété grid-gap puis gap avec la même valeur.

Attention, d'autres éléments peuvent rentrer en jeu et ajouter de l'espace (les mots-clés de distribution ou les marges sur les éléments par exemple).

Pages associées à chaque propriété d'alignement

Les propriétés d'alignement des boîtes CSS sont implémentées différemment selon le mode de disposition utilisé. Vous pouvez vous référer aux pages suivantes afin de connaître les détails de ces différences :

Référence

Propriétés CSS

Termes du glossaire

Guides

Ressources externes