Tout ce que vous devez savoir sur l'alignement dans Flexbox

À 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 la flex-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-content et justify-content nécessitent de l'espace libre;
  • Les propriétés align-content et justify-content sont 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é -self manquante;
  • si vous souhaitez aligner un élément ou diviser un groupe le long de l'axe principal, utilisez des champs automatiques;
  • align-items définit les mêmes propriétés align-self pour tout le groupe. Utilisez align-self pour l'enfant du groupe pour définir sa valeur individuellement.

Source: https://habr.com/ru/post/fr420935/


All Articles