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
- Guide CSS sur Flexbox : Les concepts de base de Flexbox
- Guide CSS sur Flexbox : Aligner les éléments d'un conteneur flexible
- Guide CSS sur les grilles : Aligner les boîtes dans une disposition en grille