Propriétés logiques

Podcast CSS – 012: Propriétés logiques

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

L'icône se trouve à gauche du texte, avec un petit espace entre les deux, fourni par margin-right sur l'icône. Il y a toutefois un problème, car cela ne fonctionne que lorsque l'orientation du texte est de gauche à droite. Si le texte est lu de droite à gauche (comme c'est le cas pour l'arabe), l'icône sera positionnée contre le texte.

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

Terminologie

Les propriétés physiques en haut, à droite, en bas et à gauche font référence aux dimensions physiques de la fenêtre d'affichage. Vous pouvez les considérer comme une rose des vents sur une carte. En revanche, les propriétés logiques font référence aux bords d'une boîte en relation avec le flux de contenu. Par conséquent, ils peuvent changer si l'orientation du texte ou le mode d'écriture change. Il s'agit d'un grand changement par rapport aux styles directionnels, et cela nous offre beaucoup plus de flexibilité pour styliser nos interfaces.

Flux en bloc

Le flux de blocs correspond à la direction dans laquelle 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 en anglais, le flux de bloc est de haut en bas. Pensez-y dans le contexte de paragraphes de texte qui se suivent, de haut en bas.

Trois blocs, éléments div, avec une flèche vers le bas, intitulé "flux de blocs"

Flux intégré

Le flux intégré correspond à la circulation du texte dans une phrase. Dans un document en anglais, le flux intégré s'effectue de gauche à droite. Si vous modifiez la langue du document de votre page Web en arabe (<html lang="ar">), le flux intégré s'effectuera de droite à gauche.

Trois mots, &quot;elle vend des coquillages&quot;, accompagnés d&#39;une flèche de gauche à droite intitulée &quot;flux intégré&quot;

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

Flux relatif

Auparavant, dans les CSS, nous ne pouvions appliquer que des propriétés telles que la marge en fonction de la direction de leurs côtés. Par exemple, margin-top est appliqué à la partie supérieure physique de l'élément. Avec les propriétés logiques, margin-top devient margin-block-start. Cela signifie que, quelle que soit la langue et l'orientation du texte, le flux de blocs dispose de règles de marge appropriées.

Schéma illustrant les différentes tailles d&#39;une boîte et où chaque section de dimensionnement commence et se termine

Taille

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

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

Les équivalents relatifs au 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 les propriétés logiques, cette règle de largeur et de hauteur maximales ressemblerait à ceci:

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

Début et fin

Au lieu d'utiliser des directions comme le haut, la droite, le bas et la gauche, utilisez le début et la fin. Vous obtenez ainsi un bloc "block-start", "inline-end", "block-end" et "inline-start". Elles 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 la droite physique, mais plutôt sur le début de la direction de lecture, cette option 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

Les propriétés logiques de margin, padding et inset facilitent le positionnement des éléments, et permettent de déterminer la manière dont ils interagissent les uns avec les autres sur les différents modes d'écriture. Les propriétés liées à la marge et à la marge intérieure sont toujours des mappages directs avec les directions, mais la principale différence est que lorsqu'un mode d'écriture change, ils changent en même temps.

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

Cela permet d'ajouter un espace intérieur vertical avec padding et de le repousser de la gauche avec margin. La propriété top la déplace également vers le bas. Avec des équivalents de propriété logiques, cela 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 permet d'intégrer l'espace dans l'espace avec padding et de le repousser à partir du début de la ligne 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 abrégée avec des propriétés logiques. Cette règle peut être condensée à l'aide de 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 vers la 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;
}

Le 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 apportent deux nouvelles unités: vi et vb. Une unité vi correspond à 1% de la taille de la fenêtre d'affichage dans le sens de l'intégration. L'équivalent de propriété non logique est vw. L'unité vb correspond à 1% de la fenêtre d'affichage dans le sens du bloc. L'équivalent de propriété non logique est vh.

Ces unités seront toujours mappées avec la direction de lecture. Par exemple, si vous souhaitez qu'un élément occupe 80% de l'espace intégré disponible d'une fenêtre d'affichage, l'utilisation de l'unité vi définit automatiquement cette taille de haut en bas si le mode d'écriture est vertical.

Utiliser les 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 vous disposez d'un graphique comportant des étiquettes sur l'axe X et l'axe Y, vous pouvez souhaiter que le texte de l'étiquette Y soit lu verticalement.

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

Résoudre le problème d'icône

Maintenant que nous avons abordé 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 de l'icône. Pour que l'espacement entre l'icône et le texte soit pris en charge dans tous les sens de lecture, la propriété margin-inline-end doit être utilisée à la place.

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

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

Maintenant, quelle que soit la direction de lecture, l'icône se positionnera et s'espacera de manière appropriée.

Testez vos connaissances

Tester vos connaissances sur les propriétés logiques

Lorsque vous écrivez avec votre main, votre poignet se déplace le long de quel axe logique ?

inline
Les mots sont alignés, votre main doit donc voyager lorsque vous écrivez.
block
Le contenu s'affiche sous forme de blocs et votre poignet se déplace le long de cet axe lorsque vous terminez un type de contenu et en commencez un autre.

Sélectionner tous ceux qui peuvent bénéficier des propriétés logiques

colors
La couleur ne change pas en même temps qu'un mode d'écriture de document.
alignment
Exemples: flex-start, block-end et inline-start
ombres
Les ombres ne changent pas en même temps qu'un mode d'écriture de document.
côtés de la boîte
Exemples: block-start et inline.
sizes
Exemples: inline-size et max-block-size.
coins de la boîte
Exemples: border-end-end-radius.

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

début intégré
Cela permet de souligner un mot en français à gauche.
fin intégrée
Cela permet de souligner un mot en anglais à sa droite.
début du bloc
Cela permet de souligner un mot en anglais.
fin du bloc
C'est une bonne chose que le CSS effectue ce positionnement pour vous.