Propriétés logiques

Un modèle d'interface utilisateur très courant est un libellé de texte avec une icône intégrée correspondante.

L’icône se trouve à gauche du texte avec un petit espace entre les deux, fournie par margin-right sur l'icône. Il y a un problème, car cela ne fonctionne que si l'orientation du texte est de gauche à droite. Si l'orientation du texte est passée de la droite vers la gauche (ce qui est le cas dans les langues telles que l'arabe), l'icône sera placée contre le texte.

Comment en tenir compte dans les CSS ? Les propriétés logiques permettent de résoudre ces situations. Entre autres avantages, ils offrent une assistance sans frais et automatique pour l'internationalisation. Ils vous aident à créer un front-end plus résilient et plus inclusif.

Terminologie

Les propriétés physiques des parties supérieure, droite, inférieure et gauche correspondent aux dimensions physiques de la fenêtre d'affichage. Vous pouvez les considérer comme une rose des vents sur une carte. Les propriétés logiques, quant à elles, font référence aux bords d'un cadre dans le cadre du flux de contenu. Ils peuvent donc changer si l'orientation du texte ou le mode d'écriture change. C'est un grand changement par rapport aux styles directionnels, et cela nous donne beaucoup plus de flexibilité pour styliser nos interfaces.

Procédure de blocage

Le flux de blocs correspond au sens dans lequel les blocs de contenu sont placés. Par exemple, s'il y a deux paragraphes, le flux de bloc est l'endroit où le deuxième paragraphe ira. Dans un document anglais, le flux de blocs se déroule de haut en bas. Pensez-y dans le contexte de paragraphes de texte qui se suivent, de haut en bas.

Trois blocs, des éléments div, avec une flèche vers le bas et l'intitulé "block flow"

Flux intégré

Le flux intégré correspond à la façon dont le texte s'affiche dans une phrase. Dans un document en anglais, le flux intégré est de gauche à droite. Si vous modifiez la langue du document de votre page Web en arabe (<html lang="ar">), alors le flux intégré se ferait de droite à gauche.

Trois mots, &quot;elle vend des coquillages&quot;, avec une flèche de gauche à droite portant la mention &quot;Flux en ligne&quot;

Le texte s'exécute dans la direction déterminée par le mode d'écriture du document. Vous pouvez modifier l'orientation du texte avec la propriété writing-mode. Vous pouvez l'appliquer à l'ensemble du document ou à des éléments individuels.

Flux relatif

Auparavant, en CSS, nous n'avons pu appliquer que des propriétés telles que la marge par rapport à la direction de leurs côtés. Par exemple, margin-top est appliqué à la partie supérieure physique de l'élément. Avec des propriétés logiques, margin-top devient margin-block-start. Indépendamment de la langue et de l'orientation du texte, le flux de blocage dispose de règles de marge appropriées.

Schéma illustrant les différentes tailles d&#39;une boîte et le début et la fin de chaque section de taille

Dimensionnement

Pour éviter qu'un élément ne dépasse une certaine largeur ou hauteur, écrivez une règle comme ceci:

.my-element {
  max-width: 150px;
  max-height: 100px;
}

Les équivalents en fonction du flux sont max-inline-size et max-block-size. Vous pouvez également utiliser min-block-size et min-inline-size au lieu de min-height et min-width.

Avec des propriétés logiques, la règle de largeur et de hauteur max. se présente comme suit:

.my-element {
  max-inline-size: 150px;
  max-block-size: 100px;
}

Début et fin

Au lieu d'utiliser des directions telles que haut, droite, bas et gauche, utiliser le début et la fin. Les options "block-start", "inline-end", "block-end" et "inline-start" sont alors possibles. Ils vous permettent d'appliquer des propriétés CSS qui réagissent aux changements du mode d'écriture.

Par exemple, pour aligner le texte à droite, vous pouvez utiliser le code CSS suivant:

p {
  text-align: right;
}

Si votre objectif n'est pas de vous aligner sur le droit physique, mais au début du sens de lecture, cela n'est pas utile. Avec les valeurs logiques, il existe des valeurs start et end plus utiles qui correspondent à l'orientation du texte. La règle d'alignement du texte se présente maintenant comme suit:

p {
  text-align: end;
}

Espacement et positionnement

Propriétés logiques pour margin, padding et inset faciliter le positionnement des éléments et déterminer comment ces éléments interagissent les uns avec les autres dans les différents modes d'écriture plus facilement et plus efficacement. Les propriétés liées aux marges sont toujours des mappages directs aux directions, mais la principale différence est que lorsqu'un mode d'écriture change, il change en même temps.

.my-element {
  padding-top: 2em;
  padding-bottom: 2em;
  margin-left: 2em;
  position: relative;
  top: 0.2em;
}

Cela ajoute de l'espace vertical à l'intérieur avec padding et le pousse vers l'extérieur de la gauche avec margin. La propriété top la décale également vers le bas. Avec des équivalents de propriétés logiques, il ressemblerait plutôt à ceci:

.my-element {
  padding-block-start: 2em;
  padding-block-end: 2em;
  margin-inline-start: 2em;
  position: relative;
  inset-block-start: 0.2em;
}

Cela ajoute de l'espace intérieur avec padding et le retire du début intégré avec margin. La propriété inset-block la déplace vers l'intérieur à partir du début du bloc.

La propriété inset-block n'est pas la seule option de raccourci avec des propriétés logiques. Cette règle peut être condensée, en utilisant des versions abrégées des propriétés de marge et de marge intérieure.

.my-element {
  padding-block: 2em;
  margin-inline: 2em 0;
  position: relative;
  inset-block: 0.2em 0;
}

Bordures

Vous pouvez également ajouter border et border-radius à l'aide de propriétés logiques. Pour ajouter une bordure en bas et à droite, avec un rayon à droite, vous pouvez écrire une règle comme celle-ci:

.my-element {
  border-bottom: 1px solid red;
  border-right: 1px solid red;
  border-bottom-right-radius: 1em;
}

Vous pouvez également utiliser des propriétés logiques comme celles-ci:

.my-element {
  border-block-end: 1px solid red;
  border-inline-end: 1px solid red;
  border-end-end-radius: 1em;
}

end-end dans border-end-end-radius est la fin du bloc et la fin intégrée.

Unités

Les propriétés logiques génèrent deux nouvelles unités: vi et vb. Une unité vi correspond à 1% de la taille de la fenêtre d'affichage lorsqu'elle est intégrée. L'équivalent non logique de la propriété est vw. L'unité vb représente 1% de la fenêtre d'affichage dans le sens du bloc. L'équivalent non logique de la propriété est vh.

Ces unités sont toujours associées au sens de lecture. Par exemple, si vous souhaitez qu'un élément occupe 80% de l'espace intégré disponible dans une fenêtre d'affichage, lorsque l'unité vi est utilisée, cette taille s'affiche automatiquement de haut en bas si le mode d'écriture est vertical.

Utiliser des propriétés logiques de manière pragmatique

Les propriétés logiques et les modes d'écriture ne sont pas réservés à l'internationalisation. Vous pouvez les utiliser pour créer une interface utilisateur plus polyvalente.

Si votre graphique comporte des libellés sur les axes X et Y, vous voudrez peut-être que le texte de l'étiquette Y soit lu verticalement.

Étant donné que l'étiquette de l'axe Y dans la démonstration a une writing-mode de vertical-rl, vous pouvez utiliser les mêmes valeurs margin pour les deux étiquettes. La valeur margin-block-start s'applique aux deux étiquettes car le début du volume est à droite pour l'axe Y et en haut pour l'axe X. Les côtés de départ du bloc ont une bordure rouge pour que vous puissiez les voir.

Résoudre le problème des icônes

Maintenant que nous avons couvert les propriétés logiques, ces connaissances peuvent être appliquées au problème de conception avec lequel nous avons commencé.

p {
  display: inline-flex;
  align-items: center;
}

p svg {
  width: 1.2em;
  height: 1.2em;
  margin-right: 0.5em;
  flex: none;
}

La marge a été appliquée à droite de l'élément d'icône. Pour que l'espacement entre l'icône et le texte soit compatible avec tous les sens de lecture, vous devez utiliser la propriété margin-inline-end à la place.

p {
  display: inline-flex;
  align-items: center;
}

p svg {
  width: 1.2em;
  height: 1.2em;
  margin-inline-end: 0.5em;
  flex: none;
}

Quel que soit le sens de lecture, l'icône se positionne et s'insère correctement.

Testez vos connaissances

Tester vos connaissances sur les propriétés logiques

Lorsque vous écrivez avec votre main, sur quel axe logique votre poignet se déplace-t-il ?

block
inline

Cochez tous ceux qui peuvent bénéficier des propriétés logiques.

coins encadrés
ombres
colors
dans différentes tailles
alignement
côtés de la boîte

Quel côté logique d'un mot est souligné ?

fin du bloc
démarrage intégré
début du bloc
fin du texte intégré