Line-height: une propriété méconnue

Vincent De Oliveira · @iamvdo

Vincent

«Personne n'a jamais vraiment compris line-height» Anonyme

Le rôle de line-height

  • Gérer l’espace vertical entre les lignes
  • Créer un rythme vertical.
  • Ça paraît simple...

C’est quoi le line-height?

  • Interligne?
  • Mais de où à où exactement?
Définition de la hauteur d'une ligne avec line-height

C’est quoi le line-height?

  • Un paragraphe est un empilement de lignes (line-box)
  • Chaque ligne a sa propre hauteur
  • Les lignes ne se superposent jamais
  • Le line-height, c'est la hauteur minimale d'une ligne
Définition de la hauteur d'une ligne avec line-height

Définir le line-height

  • Deux méthodes différentes
    • Avec unités: px, %, em
    • Sans unités
  • Pas une meilleure que l'autre

Line-height avec unités

html {
  font-size: 1em; /*16px*/
  line-height: 3em; /*48px*/
}
h1 {
  font-size: 3em; /*48px*/
}
p {
  
}
  • La valeur calculée de line-height est 3em, soit 48px.
  • Toutes les lignes mesurent alors 48px.
font-size line-height
h1 3em (48px) 48px
p 1em (16px) 48px

Rythme vertical avec unités

  • Utilisation indifférente de px, em ou %
  • Mais em et % sont relatifs, donc des calculs sont nécessaires
  • Voir le rendu

Line-height sans unités

.container {
  font-size: 1em; /*16px*/
  line-height: 1.5; /*24px*/
}
h1 {
  font-size: 3em; /*48px*/
}
p {
  
}
  • Le facteur de 1.5 donne un line-height de 24px.
  • Respecte la cascade: chaque élément n'hérite pas de cette valeur.
  • line-height = font-size * facteur
font-size line-height
h1 3em (48px) 72px
p 1em (16px) 24px

Rythme vertical sans unités

«OK, là c'était facile! Regardons dans le détail maintenant...»

Inline formatting context

  • Comment se décompose un <p>?
  • Par exemple, ce code:
<p>Good design. ... <strong>...</strong> ... </p>
  • Comment s'affiche t'il à l'écran?

Inline formatting context

  • Création d'une (ou plusieurs) boites horizontales pour les éléments inline

Inline formatting context

  • Création de boites anonymes

Inline formatting context

  • Calcul de la hauteur de chaque boite
  • Création des lignes (line-boxes)
  • La hauteur d'une ligne dépend donc de la hauteur de ses enfants

Hauteur d'une boite inline

  • Un élément, deux hauteurs!
  • Hauteur réelle
    • C'est le content-area
    • Dépend de la police et de la taille
    • Baseline, ascendante (A) et descendante (D)
    • Identifiable avec background
  • Hauteur virtuelle
    • Calcul du leading (= line-height - A+D)
    • La moitié de ce leading est ajouté en haut et l'autre moitié en bas. C'est le half-leading
    • Hauteur virtuelle = hauteur réelle + 2 half-leading
    • Plus simple: Hauteur virtuelle = line-height
  • C'est la hauteur virtuelle qui est utilisée pour la hauteur d'une ligne

Un élément, deux hauteurs!

Démo

.container {
  font-size: 100px;
  line-height: 200px;
}
span {
  background: white;
}
Good design

Hauteur d'une ligne (line-box)

  • Calcul la hauteur de chaque élément de niveau inline
    • pour inline, c'est la valeur du line-height
    • pour inline-block, inline-table, éléments remplacés (img, input, contenu généré, etc.), c'est la limite des marges hautes et basses.
  • Alignement des boites avec vertical-align
  • La hauteur de la line-box est la distance entre la limite la plus haute et la limite la plus basse

Alignements

  • C'est la propriété vertical-align
    • top ou bottom: alignement sur la line-box
    • text-top ou text-bottom: alignement sur le content-area
    • D'autres valeurs aussi: baseline, middle, etc.
  • Attention, c'est la hauteur virtuelle qui est alignée!

Démo

.container {
  font-size: 100px;
  line-height: 200px;
}
span {
  background: #444;
}
Good design

Hauteur d'une ligne (line-box)

  • Hauteur de ligne avec éléments inline
  • vertical-align: baseline par défaut

Hauteur d'une ligne (line-box)

  • Hauteur de ligne avec éléments inline-block
  • Rappel inline-block
    • Les marges agrandissent la hauteur
    • Alignement baseline est la dernière ligne (sauf si overflow: hidden: marge basse)

Hauteur d'une ligne (line-box)

  • Un élément vide crée également une boite de niveau inline
  • Sa hauteur peut donc influer sur la hauteur de ligne
div {
  height: 300px;
}
span {
  background: deepskyblue;
}
span::after {
  content:'';
  
}
HELLO

Problèmes d'alignements

  • middle n'est pas toujours centré
  • middle aligne le centre d'une boite avec la baseline du parent, + une demi hauteur d'x.
  • Si A - x/2 != D + x/2
  • Agrandissement de la hauteur de ligne possible

Démo

.container {
  font-size: 50px;
  line-height: 100px;
}
img {
  
}
Good
  • Besoin de connaitre les valeurs précises de la police pour un alignement parfait

«Vous suivez encore? C'est maintenant que les problèmes arrivent…»

line-height: normal

  • Mais c'est combien en fait?
  • Parce que line-height: normal != line-height: 1
  • La spec définit entre 1 et 1.2: mais c'est faux!

«line-height: 1 c'est le mal…» Moi

Démo

div {
  
  background: orangered;
}
span {
  background: deepskyblue;
}
HELLO
  • La hauteur virtuelle peut alors être plus petite que la hauteur réelle!
  • Elle peut même être de 0!

Mais c'est combien alors?

  • Très difficile de connaitre la hauteur
  • Impossible en CSS

Alignements précis

  • Ex: aligner les images dans un bloc de texte
    • Le bas de l'image aligné sur la ligne de base
    • Le haut aligné sur la hauteur d'x
  • Voir le rendu

Et après?

Merci, questions?

Vincent De Oliveira · @iamvdo

slides.iamvdo.me/kiwiparty14