À propos de l'auteur : Rachel Andrew n'est pas seulement la rédactrice en chef du Smashing Magazine, mais aussi une développeur Web, une écrivaine et une conférencière. Elle est l'auteur de plusieurs livres, dont 
The New CSS Layout , l'un des développeurs du système de gestion de contenu 
Perch . Il écrit sur les affaires et la technologie sur son site Web 
rachelandrew.co.uk .
Résumé: dans cet article, nous examinerons les propriétés d'alignement dans Flexbox et quelques règles de base sur le fonctionnement de l'alignement sur les axes principal et transversal.
 Dans le 
premier article de cette série, j'ai parlé de ce qui se passe lorsqu'une propriété 
display: flex est déclarée pour un élément. Examinons maintenant les propriétés d'alignement et leur fonctionnement avec Flexbox. Si vous avez déjà été confus, appliquez 
align ou 
justify , espérons que cet article clarifiera beaucoup!
Historique d'alignement Flexbox
Dans l'histoire CSS, l'alignement correct sur les deux axes semblait être le plus grand défi. L'apparition de cette fonctionnalité dans Flexbox est devenue pour beaucoup le principal avantage de cette technologie. L'alignement se résumait à 
deux lignes de CSS .
Les propriétés d'alignement sont désormais entièrement définies dans 
la spécification Box Alignment . Il détaille le fonctionnement de l'alignement dans différentes dispositions. Cela signifie que dans CSS Grid, vous pouvez utiliser les mêmes propriétés que dans Flexbox - et à l'avenir dans d'autres mises en page également. Par conséquent, toute nouvelle fonction d'alignement Flexbox sera décrite en détail dans la spécification Box Alignment, et non dans la prochaine version de Flexbox.
Les propriétés
Il est difficile pour beaucoup de se rappeler s'il faut utiliser des propriétés commençant par 
align- ou 
justify- . Il est important de se rappeler ce qui suit:
- justify-effectue l'alignement sur l'axe principal dans la même direction que la direction de- flex-direction;
- align - effectue l' align-des axes dans laflex-direction.
Cela aide vraiment à penser en termes d'axes principal et transversal, et non horizontal et vertical. Peu importe la façon dont l'axe est physiquement dirigé.
Alignement de l'axe principal avec justify-content
Commençons par l'alignement sur l'axe principal. Il est implémenté à l'aide de la propriété 
justify-content . Cette propriété traite tous les éléments comme un groupe et contrôle la répartition de l'espace entre eux.
La valeur de 
justify-content initiale 
justify-content est 
flex-start . C'est pourquoi lors de la déclaration d' 
display: flex tous les éléments flex s'alignent au début de la ligne. Par écrit, de gauche à droite, les éléments sont regroupés de gauche.

Veuillez noter que la propriété 
justify-content produit un effet visible uniquement 
lorsqu'il y a de l'espace libre . Par conséquent, si votre ensemble d'éléments occupe tout l'espace sur l'axe principal, 
justify-content ne fera rien.

Si 
justify-content sur 
flex-end , tous les éléments seront déplacés à la fin de la ligne. L'espace libre est maintenant au début.

Il y a d'autres choses que vous pouvez faire avec cet espace. Par exemple, répartissez-le entre nos éléments en utilisant 
justify-content: space-between . Dans ce cas, le premier et le dernier élément seront placés aux extrémités du conteneur, et tout l'espace sera divisé également entre les éléments.

Nous pouvons allouer de l'espace en utilisant 
justify-content: space-around . Dans ce cas, l'espace disponible est divisé en parties égales et placé de chaque côté de l'élément.

La nouvelle valeur de 
justify-content peut être trouvée dans la spécification d'alignement de boîte; il n'est pas spécifié dans la spécification Flexbox. Cette valeur est 
space-evenly . Dans ce cas, les éléments sont répartis uniformément dans le conteneur et l'espace supplémentaire est réparti uniformément entre les éléments et des deux côtés.

Vous pouvez jouer avec toutes les valeurs de la 
démo .
Les valeurs fonctionnent exactement de la même manière verticalement, c'est-à-dire si 
flex-direction est appliqué à la 
column . Certes, vous ne disposez peut-être pas d'espace libre dans la colonne pour la distribution si vous n'ajoutez pas la hauteur ou la taille de bloc du conteneur, comme dans 
cette démo .
Alignement axial avec align-content
Si le conteneur a plusieurs axes et 
flex-wrap: wrap spécifié, vous pouvez utiliser 
align-content pour aligner les lignes sur l'axe transversal. Mais un espace supplémentaire est nécessaire. Dans 
cette démonstration, l' axe transversal fonctionne en direction de la colonne, et j'ai indiqué que la hauteur du conteneur est de 
60vh . Comme cela est plus que nécessaire pour afficher tous les éléments, un espace libre vertical apparaît.
Ensuite, je peux appliquer 
align-content avec l'une des valeurs .
Si la 
column spécifiée comme 
flex-direction , 
align-content fonctionne comme dans l' 
exemple suivant .
Comme avec 
justify-content , nous travaillons avec un groupe de chaînes et allouons de l'espace libre.
Propriété par place-content
Dans la spécification Box Alignment, vous pouvez trouver la propriété 
place-content . L'utilisation de cette propriété signifie que vous définissez 
justify-content et 
align-content en même temps. La première valeur est pour 
align-content , la seconde pour 
justify-content . Si une seule valeur est spécifiée, elle s'applique aux deux propriétés:
 .container { place-content: space-between stretch; } 
Correspond à ceci:
 .container { align-content: space-between; justify-content: stretch; } 
Et un tel code:
 .container { place-content: space-between; } 
Équivalent à ce qui suit:
 .container { align-content: space-between; justify-content: space-between; } 
Alignement axial avec align-items
Nous savons maintenant que vous pouvez aligner un ensemble d'éléments ou de lignes en tant que groupe. Cependant, il existe une autre façon d'aligner les éléments entre eux sur l'axe transversal. Le conteneur a une hauteur, qui est déterminée par la hauteur de l'élément le plus haut.

Alternativement, il peut être défini par la propriété 
height dans le conteneur:

Pourquoi les éléments sont étirés à la taille de l'élément le plus haut - c'est parce que la valeur initiale du paramètre 
align-items est 
stretch . Les éléments sont étirés le long de l'axe transversal à la taille du récipient dans cette direction.
Notez que dans un conteneur multi-lignes, chaque ligne se comporte comme un nouveau conteneur. L'élément le plus élevé de cette ligne déterminera la taille de tous les éléments de cette ligne.
En plus de la valeur d' 
stretch initiale, vous pouvez définir 
align-items sur 
flex-start , auquel cas ils sont alignés sur le début du conteneur et ne sont plus étirés en hauteur.

La valeur de 
flex-end déplace vers l'extrémité du conteneur le long de l'axe transversal.

Si vous utilisez la valeur 
center , les éléments sont centrés les uns par rapport aux autres:

Nous pouvons également les aligner sur la ligne de base. Cela garantit que le texte est aligné sur une base, contrairement à l'alignement des champs autour du texte.

Toutes ces options peuvent être essayées dans la 
démo .
Alignement individuel avec align-self
La propriété 
align-items définit l'alignement de tous les éléments en même temps. En fait, il définit 
align-self valeurs 
align-self pour tous les éléments du groupe. Vous pouvez également utiliser la propriété 
align-self pour tout élément unique pour l'aligner dans la chaîne et par rapport aux autres éléments.
L' 
exemple suivant utilise 
align-items dans le conteneur pour centrer l'ensemble du groupe, mais aussi 
align-self pour les premier et dernier éléments.

Pourquoi ne pas se justify-self ?
La question se pose souvent de savoir pourquoi il est impossible d'aligner un élément ou un groupe d'éléments le long de l'axe principal. Pourquoi n'y a-t-il pas de propriété 
-self dans 
-self pour l'alignement sur l'axe principal? Si vous introduisez 
justify-content et 
align-content comme un moyen d'allouer de l'espace, alors la réponse devient plus évidente. Nous traitons les éléments en tant que groupe et plaçons l'espace libre d'une certaine manière: soit au début ou à la fin du groupe, soit entre les éléments.
Il peut également être utile de réfléchir à la façon dont le 
justify-content align-content fonctionnent dans CSS Grid Layout. Dans Grid, ces propriétés sont utilisées pour répartir l'espace libre dans un conteneur de 
grille entre les pistes de la grille . Ici, nous prenons également un groupe de pistes - et à l'aide de ces propriétés, nous distribuons de l'espace libre entre elles. Étant donné que nous opérons dans un groupe à la fois dans la grille et la Flexbox, nous ne pouvons pas prendre un élément séparé et faire autre chose avec lui. Cependant, il existe un moyen d'obtenir la conception de mise en page souhaitée par les codeurs lorsqu'ils parlent de la propriété 
self sur l'axe principal. C'est l'utilisation de champs automatiques.
Utilisation de champs automatiques sur l'axe principal
Si vous avez déjà centré un bloc en CSS (par exemple, encapsuler pour le contenu de la page principale, définir les champs à gauche et à droite en 
auto ), vous avez déjà une certaine expérience avec les champs automatiques. La valeur 
auto des champs remplit l'espace maximum dans la direction définie. Pour centrer le bloc, nous définissons les champs gauche et droit sur 
auto : chacun d'eux essaie de prendre autant d'espace que possible, et place donc notre bloc au centre.
Les champs automatiques fonctionnent très bien dans Flexbox pour aligner des éléments individuels ou des groupes d'éléments sur l'axe principal. L' 
exemple suivant montre un cas typique. Il y a une barre de navigation, les éléments sont affichés sous forme de chaîne et utilisent la valeur initiale 
justify-content: start . Je veux que le dernier élément soit affiché séparément des autres à la fin de la ligne - à condition que la ligne ait suffisamment d'espace pour cela.
Nous prenons cet élément et définissons la propriété 
margin-left sur 
auto . Cela signifie que le champ essaie d'obtenir autant d'espace que possible à gauche de l'élément, c'est-à-dire que l'élément est poussé vers la bordure droite.

Si vous utilisez des champs automatiques sur l'axe principal, alors le 
justify-content cessera de fonctionner, car les champs automatiques occuperont tout l'espace qui serait autrement alloué à l'aide 
justify-content .
Alignement de rechange
Pour chaque méthode d'alignement, une solution de repli est décrite - ce qui se passe si l'alignement donné n'est pas possible. Par exemple, si vous n'avez qu'un seul élément dans le conteneur et que vous spécifiez 
justify-content: space-between , que doit-il se passer? Dans ce cas, un alignement 
flex-start rechange est appliqué - un élément sera aligné au début du conteneur. Dans le cas de 
justify-content: space-around , un alignement de 
center rechange est utilisé.
Dans la spécification actuelle, vous ne pouvez pas modifier l'alignement de rechange. Il y a une 
note aux spécifications , qui permet la possibilité de spécifier un repli arbitraire dans les futures versions.
Alignement sûr et dangereux
Un ajout récent à la spécification Box Alignment est le concept d'alignement sûr et non sûr à l'aide des mots clés 
sûrs et 
dangereux .
Dans le code suivant, le dernier élément est trop large pour le conteneur, et avec un alignement dangereux et un conteneur flexible sur le côté gauche de la page, l'élément est coupé car le débordement dépasse les bordures de page.
 .container { display: flex; flex-direction: column; width: 100px; align-items: unsafe center; } .item:last-child { width: 200px; } 

Un alignement sûr empêche la perte de données en déplaçant le débordement de l'autre côté.
 .container { display: flex; flex-direction: column; width: 100px; align-items: safe center; } .item:last-child { width: 200px; } 

Ces mots clés ne sont pas encore pris en charge par tous les navigateurs, mais montrent comment les spécifications d'alignement de boîte ajoutent un contrôle à Flexbox.
Conclusion
Les propriétés d'alignement ont commencé avec une liste dans Flexbox, mais ont maintenant leurs propres spécifications et s'appliquent à d'autres contextes de disposition. Voici quelques faits clés pour vous souvenir de leur utilisation dans Flexbox:
- justify-pour les axes principaux, et- align-pour la transversale;
- align-contentet- justify-contentnécessitent de l'espace libre;
- Les propriétés align-contentetjustify-contentsont appliquées aux éléments du groupe, en répartissant l'espace entre eux. Vous ne pouvez pas spécifier l'alignement d'un élément individuel car la propriété-selfmanquante;
- si vous souhaitez aligner un élément ou diviser un groupe le long de l'axe principal, utilisez des champs automatiques;
- align-itemsdéfinit les mêmes propriétés- align-selfpour tout le groupe. Utilisez- align-selfpour l'enfant du groupe pour définir sa valeur individuellement.