Fermer

mars 28, 2019

Comment aligner les choses dans CSS


Il existe plusieurs façons d'aligner des éléments dans CSS. Dans cet article, Rachel Andrew explique leur nature en leur proposant des astuces qui vous aideront à vous rappeler laquelle utiliser et pourquoi.

Nous avons toute une série de façons d’aligner les choses en CSS aujourd’hui, et ce n’est pas toujours une décision utiliser. Cependant, savoir ce qui est disponible signifie que vous pouvez toujours essayer quelques tactiques si vous rencontrez un problème d'alignement particulier.

Dans cet article, je vais examiner les différentes méthodes d'alignement. Au lieu de fournir un guide complet à chacun d’eux, j’expliquerai quelques-uns des points de blocage des gens et pointerai vers des références plus complètes pour les propriétés et les valeurs. Comme avec beaucoup de CSS, vous pouvez aller très loin en en comprenant les choses fondamentales sur le comportement des méthodes, puis vous avez besoin d'un endroit où aller pour rechercher les détails les plus fins en termes de réalisation de la mise en page précise. que vous voulez.

Alignement de texte et d'éléments en ligne

Lorsque nous avons du texte et d'autres éléments en ligne sur une page, chaque ligne de contenu est traitée comme une zone de ligne. La propriété text-align alignera ce contenu sur la page, par exemple, si vous souhaitez que votre texte soit centré ou justifié. Cependant, vous pouvez parfois souhaiter aligner les éléments de cette zone avec d'autres éléments, par exemple si une icône est affichée à côté de texte ou de texte de tailles différentes.

Dans l'exemple ci-dessous, un texte avec une image en ligne plus grande. J'utilise vertical-align: middle sur l'image pour aligner le texte sur le centre de l'image.

La line-height Property And Alignment

N'oubliez pas que la La propriété line-height modifiera la taille de la ligne et vous permettra donc de modifier votre alignement. L'exemple suivant utilise une valeur de hauteur de ligne large de 150px et j'ai aligné l'image sur top . L'image est alignée sur le haut de la zone de ligne et non sur le haut du texte. Supprimez cette hauteur de ligne ou rendez-la inférieure à la taille de l'image. L'image et le texte s'aligneront en haut du texte. 19659005] Il s'avère que line-height et en effet, la taille du texte est assez compliquée, et je ne vais pas m'attaquer à ce trou de lapin dans cet article. Si vous essayez d'aligner avec précision les éléments en ligne et que vous voulez vraiment comprendre ce qui se passe, je vous recommande de lire « CSS Deep Dive: Font Metrics, line-height et vertical-align [19659012]. ”

Quand puis-je utiliser la propriété vertical-align ?

La propriété vertical-align est utile si vous alignez un élément en ligne. Ceci inclut les éléments avec l’affichage : inline-block . Le contenu des cellules de tableau peut également être aligné sur la propriété vertical-align .

La propriété vertical-align n'a aucun effet sur les éléments flex ou grid, et donc si elle est utilisée comme partie d’une stratégie de repli, cessera d’appliquer à la minute où l’élément parent est transformé en une grille ou un conteneur flex. Par exemple, dans le stylo suivant, j'ai un ensemble d'éléments disposés avec l'affichage : inline-block ce qui signifie que je peux aligner les éléments même si le navigateur ne dispose pas de Flexbox: [19659016] Voir le stylo inline-block et vertical-align de Rachel Andrew .

Dans ce prochain stylo, j'ai traité le alignement-block comme une solution de rechange pour la mise en page Flex. Les propriétés d'alignement ne s'appliquent plus, et je peux ajouter align-items pour aligner les éléments dans Flexbox. Vous pouvez constater que la méthode Flexbox est en jeu, car l'écart entre les éléments que vous obtiendrez en utilisant l'affichage : inline-block a disparu.

Voir le stylo flexion de repli du bloc en ligne par Rachel Andrew .

Le fait que vertical-align fonctionne sur des cellules de tableau est la raison pour laquelle le truc pour centrer verticalement un élément à l'aide de : table-cell fonctionne .

Maintenant que nous disposons de meilleurs moyens pour aligner les boîtes en CSS (comme nous le verrons dans la section suivante), nous n'avons pas besoin d'utiliser le vertical-align et propriétés text-align situées dans des emplacements autres que les éléments en ligne et les éléments de texte pour lesquels elles ont été conçues. Cependant, leur utilisation dans ces formats de texte et en ligne reste tout à fait valable. N'oubliez donc pas que si vous essayez d'aligner quelque chose en ligne, ce sont ces propriétés et non celles d'Alignement de boîte que vous devez atteindre.

Alignement de boîte

La spécification d'alignement de boîtes explique comment aligner tout le reste. La spécification détaille les propriétés d’alignement suivantes:

  • justification-contenu
  • align-contenu
  • justification-auto
  • align-auto
  • justification-items
  • align-items

Vous pourriez déjà Pensez à ces propriétés comme faisant partie de la spécification Flexbox, ou peut-être de la grille. L’historique des propriétés est qu’elles sont issues de Flexbox et existent toujours dans la spécification de niveau 1; Cependant, ils ont été déplacés dans leurs propres spécifications quand il est devenu évident qu'ils étaient plus généralement utiles. Nous les utilisons maintenant également dans Grid Layout, et elles sont spécifiées pour d'autres méthodes de disposition, même si la prise en charge actuelle du navigateur signifie que vous ne pourrez pas les utiliser pour l'instant. cet alignement vertical est la partie la plus difficile de CSS, vous pouvez leur dire ceci (qui correspond même à un tweet):

 .container {
  affichage: flex;
  align-items: centre;
  justifier-contenu: centre;
}

À l'avenir, nous pourrons peut-être même nous passer de l'affichage : flex une fois que les propriétés d'alignement des boîtes auront été implémentées pour la disposition en blocs. Cependant, pour le moment, centrez un conteneur Flex sur le parent de la chose que vous souhaitez centrer est le moyen d'obtenir un alignement horizontal et vertical.

Les deux types d'alignement

Lorsque vous alignez des éléments flex et grid, vous avez deux possibilités. éléments à aligner:

  1. Vous disposez de l'espace disponible dans la grille ou dans le conteneur flexible (une fois que les éléments ou les pistes ont été disposés).
  2. Vous avez également l'élément lui-même dans la zone de grille où vous l'avez placé ou sur lequel il a été placé. l'axe transversal à l'intérieur du conteneur flex.

Je vous ai montré un ensemble de propriétés ci-dessus, et les propriétés d'alignement peuvent être considérées comme deux groupes. Ceux qui traitent de la distribution d'espace disponible et ceux qui alignent l'élément lui-même.

Gestion des espaces disponibles: align-content et justification-contenu

Les propriétés qui fin dans - le contenu concerne la répartition de l'espace. Ainsi, lorsque vous choisissez d'utiliser align-content ou worth-content vous distribuez de l'espace disponible entre les tracés de la grille ou flex. articles. Ils ne changent pas la taille des éléments flex ou grid eux-mêmes; ils les déplacent car ils changent là où l'espace disponible est utilisé.

Ci-dessous, j'ai un exemple Flex et un exemple de grille. Les deux ont un conteneur qui est plus grand que nécessaire pour afficher les éléments flexibles ou les pistes de grille, donc je peux utiliser align-content et motivé-content pour distribuer cet espace.

Voir la plume justifier-contenu et aligner-contenu de Rachel Andrew .

Déplacement d'objets autour: justification-auto align-self justification-items et align-items

Nous avons ensuite align-self et justification-self appliqués à un individu articles flexibles ou en grille; vous pouvez également utiliser align-items et justifier-items sur le conteneur pour définir toutes les propriétés en même temps. Ces propriétés traitent de l'élément de flex ou de grille réel, c'est-à-dire que vous déplacez le contenu dans la zone de grille ou la ligne de flex.

  • Grid Layout
    Vous obtenez les deux propriétés, car vous pouvez déplacer l'élément sur le bloc et l'axe en ligne car nous avons une zone de grille définie dans laquelle il se trouve.
  • Flex Layout
    Vous ne pouvez vous aligner que sur l'axe transversal car l'axe principal est contrôlé uniquement par la distribution spatiale. Ainsi, si vos éléments sont rangés, vous pouvez utiliser align-self pour les déplacer de haut en bas à l'intérieur de la ligne de flexion, en les alignant les uns contre les autres.

Dans mon exemple ci-dessous, j'ai un flex et un conteneur de grille et j'utilise Align-items et align-self dans Flexbox pour déplacer les éléments de haut en bas les uns contre les autres sur l'axe transversal. Si vous utilisez Firefox et inspectez l'élément à l'aide de l'inspecteur Flexbox de Firefox, vous pouvez voir la taille du conteneur flex et la façon dont les éléments sont déplacés verticalement à l'intérieur.

 Les éléments Flex alignés dans leur conteneur
Aligned flex éléments avec le conteneur flex mis en évidence dans Firefox ( Grand aperçu )

Dans la grille, je peux utiliser les quatre propriétés pour déplacer les éléments dans leur zone de grille. Une fois encore, l’Inspecteur de grille de Firefox DevTools sera utile pour jouer avec alignement. Avec les lignes de la grille superposées, vous pouvez voir la zone à l'intérieur de laquelle le contenu est déplacé:

 Eléments de grille alignés
Eléments de grille alignés avec la grille en surbrillance dans Firefox ( Grand aperçu ).

Jouez avec les valeurs de la démonstration CodePen pour voir comment vous pouvez déplacer du contenu dans chaque méthode de présentation:

Voir le stylo justification-auto, align-auto, justification-éléments, align-éléments de Rachel Andrew .

Confuse By aligner et justifier

L’un des problèmes cités avec les personnes se souvenant des propriétés d’alignement dans Grid et Flexbox est le suivant: personne ne peut se rappeler s'il faut aligner ou justifier.

Pour la disposition de la grille, vous devez savoir si vous alignez dans la direction du bloc ou en ligne. La direction de bloc correspond aux blocs de direction disposés sur votre page (en mode écriture), c'est-à-dire pour l'anglais qui est verticalement. La direction Inline est la direction dans laquelle les phrases sont exécutées (donc pour l'anglais qui est placé de gauche à droite horizontalement).

Pour aligner les éléments dans la direction du bloc, vous utiliserez les propriétés commençant par align- . Vous utilisez align-content pour répartir l'espace entre les tracés de grille, s'il y a de l'espace libre dans le conteneur de grille, et align-items ou align-self pour vous déplacer. un élément situé à l'intérieur de la zone de grille dans laquelle il a été placé.

L'exemple ci-dessous présente deux dispositions de grille. L'un a le mode d'écriture: horizontal-tb (qui est la valeur par défaut pour l'anglais) et l'autre le mode d'écriture: vertical-rl . C'est la seule différence entre eux. Vous pouvez voir que les propriétés d'alignement que j'ai appliquées fonctionnent exactement de la même manière sur l'axe des blocs dans les deux modes.

Voir le stylo Alignement des axes des blocs de la grille par Rachel Andrew .

Pour aligner les éléments dans le sens de la ligne, utilisez les propriétés qui commencent par justifier- . Utilisez justification-contenu pour répartir l'espace entre les tracés de la grille et justification-éléments ou justification-soi pour aligner des éléments à l'intérieur de leur zone de quadrillage. 19659005] Une fois encore, j’ai deux exemples d’agencement de grille qui vous permettent de voir que l’inline est toujours en ligne, quel que soit le mode d’écriture utilisé.

Voir le stylo Alignement alignement de grille de Rachel Andrew .

Flexbox est un peu plus compliqué à cause du fait que nous avons un axe principal qui peut être changé en colonne row ou . Alors, commençons par penser à cet axe principal. Il est défini avec la propriété flex-direction . La valeur initiale (ou par défaut) de cette propriété est row ce qui permet de placer les éléments flexibles sous la forme d'une ligne dans le mode d'écriture actuellement utilisé. C'est pourquoi, lorsque vous travaillez en anglais, vous vous retrouvez avec des éléments posés. horizontalement lorsque nous créons un conteneur flexible. Vous pouvez ensuite changer l'axe principal en direction flex: colonne et les éléments seront disposés en colonne, ce qui signifie qu'ils sont disposés dans la direction du bloc pour ce mode d'écriture.

Pour ce faire, le facteur le plus important dans Flexbox est la question suivante: «Quel axe est mon axe principal?». Une fois que vous le savez, vous utilisez simplement justification-contenu pour l'alignement (sur votre axe principal). . Peu importe si votre axe principal est une ligne ou une colonne. Vous contrôlez l'espace entre les éléments flexibles avec justification-contenu .

Voir le stylo justfy-content dans Flexbox de Rachel Andrew .

Sur l'axe transversal, vous pouvez utiliser align-items qui alignera les éléments à l'intérieur du conteneur flexible ou la ligne flexible dans un conteneur flexible multiligne. Si vous disposez d'un conteneur multiligne utilisant de manière flexible: wrap et disposent d'un espace dans ce conteneur, vous pouvez utiliser align-content pour répartir l'espace sur l'axe transversal.

Dans l'exemple ci-dessous, nous utilisons à la fois un conteneur Flex affiché sous forme de ligne et de colonne:

Voir le stylo Alignement de l'axe croisé dans Flexbox de Rachel Andrew ].

Quand justifier-contenu ou aligner-contenu ne fonctionne pas

Le justifier-contenu et aligner le contenu ] propriétés dans Grid et Flexbox concernent environ distribuant de l’espace supplémentaire . Donc, la chose à vérifier est que vous avez un espace supplémentaire.

Voici un exemple Flex: j'ai défini flex-direction: row et j'ai trois éléments. Ils ne prennent pas toute la place dans le conteneur flexible, j'ai donc de la place sur l'axe principal. La valeur initiale de justification-contenu est flex-start etc. mes articles sont tous alignés au début et l'espace supplémentaire est à la fin. J'utilise l'inspecteur Flex de Firefox pour mettre l'espace en surbrillance.

 Les éléments Flex alignés à gauche, l'espace disponible en surbrillance à droite
L'espace disponible à la fin du conteneur ( Grand aperçu ). ] Si je change la direction de flexion en espace entre cet espace supplémentaire est maintenant réparti entre les éléments:

 Les éléments flexibles sont alignés de manière à ce que l'espace soit réparti entre les éléments
. les éléments ( Grand aperçu )

Si j'ajoute maintenant plus de contenu à mes éléments pour qu'ils deviennent plus grands et qu'il n'y ait plus d'espace supplémentaire, alors justification-contenu ne fait rien - simplement parce qu'il n'y a pas d'espace à distribuer.

 Les articles Flex remplissent le conteneur sans espace disponible
Il n'y a maintenant plus d'espace à distribuer ( Grand aperçu )

Une question courante I ' On me demande pourquoi justifier-contenu ne fonctionne pas quand flex-directio n est colonne . C'est généralement parce qu'il n'y a pas d'espace à distribuer. Si vous prenez l'exemple ci-dessus et que vous le faites flex-direction: column les éléments s'afficheront sous forme de colonne, mais il n'y aura pas d'espace supplémentaire sous les éléments, comme vous le feriez flex- direction: rangée . En effet, lorsque vous créez un conteneur Flex avec l’affichage : flex vous disposez d’un conteneur flex au niveau du bloc; cela prendra toute la place possible dans la direction en ligne. En CSS, les éléments ne s'étendent pas dans la direction du bloc, donc pas d'espace supplémentaire.

 Éléments flexibles disposés en colonne
La colonne est aussi grande que nécessaire pour afficher les éléments ( Grand aperçu )

Ajoutez une hauteur au conteneur et - tant que cela est plus que nécessaire pour afficher les éléments - vous avez un espace supplémentaire et par conséquent, justification-contenu fonctionnera sur votre colonne.

 Une colonne d'éléments flexibles avec un espace entre eux
Ajouter une hauteur au conteneur signifie que nous disposons d'un espace disponible ( Grand aperçu )

Pourquoi n'y a-t-il pas require-self

Grid Layout implémente toutes les propriétés des deux axes car nous avons toujours deux axes à traiter dans Grid Layout. Nous créons des pistes (qui peuvent laisser de l’espace supplémentaire dans le conteneur de grille dans l’une ou l’autre des dimensions) et nous pouvons donc répartir cet espace avec align-content ou justification-contenu . Nous avons également des zones de grille et l'élément dans cette zone peut ne pas occuper toute la surface. Nous pouvons donc utiliser align-self ou justification-self pour déplacer le contenu. autour de la zone (ou aligner les éléments les éléments justifiables pour modifier l'alignement de tous les éléments.)

Flexbox n'a pas de pistes de la même manière que la présentation en grille. Sur l’axe principal, il ne nous reste plus qu’à jouer avec la répartition de l’espace entre les éléments. Il n'y a pas de concept de piste dans laquelle un élément flex est placé. Il n'y a donc pas de zone dans laquelle déplacer l'élément. C'est pourquoi il n'y a pas de propriété worth-self sur les axes principaux de Flexbox.

Parfois, cependant, vous voulez être capable d'aligner un élément ou une partie du groupe d'éléments d'une manière différente. Un modèle courant serait une barre de navigation divisée avec un élément séparé du groupe. Dans cette situation, la spécification recommande l'utilisation de marges automatiques.

Une marge automatique occupe tout l'espace dans la direction où elle est appliquée, c'est pourquoi nous pouvons centrer un bloc (comme notre mise en page principale) à l'aide de une marge gauche et droite d'auto. Avec une marge automatique des deux côtés, chaque marge essaye de prendre tout l'espace et pousse le bloc au milieu. Avec notre rangée d'éléments flexibles, nous pouvons ajouter margin-left: auto à l'élément pour lequel nous souhaitons que la scission se produise. Tant qu'il y a de la place dans le conteneur Flex, vous obtenez une scission. Cela fonctionne bien avec Flexbox car, dès qu’il n’ya plus d’espace disponible, les éléments se comportent comme les éléments flex habituels.

Flexbox et micro-composants

L’une des choses que je pense souvent négligée est l’utilité de Flexbox pour faire des travaux de mise en page minuscules, où vous pourriez penser que l'utilisation de vertical-align est la voie à suivre. J'utilise souvent Flexbox pour obtenir un alignement soigné de petits motifs; par exemple, aligner une icône à côté d'un texte, baseline aligner deux éléments de tailles de police différentes ou aligner correctement les champs de formulaire et les boutons. Si vous avez du mal à vous aligner avec vertical-align essayez peut-être de faire le travail avec Flexbox. N'oubliez pas que vous pouvez également créer un conteneur flex en ligne si vous le souhaitez avec l'affichage : inline-flex .

Il n'y a aucune raison de ne pas utiliser Flexbox, ni même Grid pour de petits travaux de mise en page. Ils ne sont pas juste pour de gros morceaux de mise en page. Essayez différentes choses à votre disposition et voyez ce qui fonctionne le mieux.

Les gens ont souvent très envie de savoir quelle est la bonne ou la mauvaise façon de faire les choses. En réalité, il n’ya souvent ni bon ni mauvais; une petite différence dans votre motif pourrait signifier que la différence entre Flexbox fonctionne mieux, sinon vous utiliseriez vertical-align .

Enveloppant

Pour conclure, j'ai un bref résumé des bases. d'alignement. Si vous vous souvenez de ces quelques règles, vous devriez pouvoir aligner la plupart des choses sur CSS:

  1. Alignez-vous du texte ou un élément en ligne? Si c'est le cas, vous devez utiliser text-align vertical-align et line-height .
  2. Avez-vous un ou plusieurs éléments que vous souhaitez aligner au centre de la page ou du conteneur? Si c'est le cas, transformez le conteneur en conteneur flexible, puis définissez align-items: centre et justification-contenu: centre .
  3. Pour les dispositions de grille, les propriétés commençant par aligner travailler dans la direction du bloc; celles qui commencent par justifient- travaillent dans le sens de la ligne.
  4. Pour les schémas Flex, les propriétés commençant par align- travaillent sur l'axe transversal; celles qui commencent par justifient les travaux sur l'axe principal .
  5. Les propriétés de justification-contenu et d'alignement-contenu distribuent de l'espace supplémentaire. Si vous ne disposez d'aucun espace supplémentaire dans votre conteneur flex ou grid, ils ne feront rien.
  6. Si vous pensez avoir besoin de vier-self dans Flexbox, l'utilisation d'une marge automatique vous donnera probablement le modèle que vous souhaitez. are after.
  7. Vous pouvez utiliser Grid et Flexbox avec les propriétés d'alignement pour les travaux de disposition minuscules ainsi que pour les composants principaux - Expérimentez!

Pour plus d'informations sur l'alignement, voir ces ressources:

 Smashing Editorial (il)




Source link