Jour 41 - Cas pratique pour l'agrandissement des caractères

On met en pratique la théorie sur l’agrandissement des caractères.

Ce que j’ai fait :

Ajout d’unités relatives

La feuille de styles par défaut du blog comportait des unités en pixels et quelques tailles en em par-ci par-là. J’ai choisi d’utiliser l’unité relative rem sur l’ensemble du blog. Pourquoi du rem et pas du em ? La principale raison est que j’ai l’habitude d’utiliser cette unité et que je la trouve plus facile à manier car il n’y a pas de question d’héritage à gérer. Mais je ne suis pas anti em pour autant, je compte bien d’ailleurs utiliser cette unité dans un de mes projets futurs pour mieux me familiariser avec.

J’ai choisi de simplifier le calcul de conversion des px en rem en ajoutant la propriété suivante :

html {
  font-size: 62.5%; // to facilitate calculations, assuming that the base size is 16px
  font-size: calc(1em * 0.625);  // IE9-IE11 math fixing
}

En partant de l’idée que la taille par défaut d’un navigateur est de 16px, 62.5% de ces 16px donnent 10px à l’affichage. Les calculs sont donc grandement facilités :

p {
  font-size: 1.8rem /* taille équivalente à 18px */
}

Evidemment, la taille de base d’un navigateur peut ne pas être systématiquement de 16px ou bien l’internaute peut avoir modifier ses préférences pour avoir une taille de base de 24px. Mais cela ne pose pas vraiment de problème puisque dans tous les cas l’ensemble s’adaptera de manière fluide tout en respectant les préférences de l’internaute.

Quant à la ligne font-size: calc(1em * 0.625);, elle permet de corriger une erreur d’arrondi dans Internet Explorer pour qui une taille de l’élément html définie à 62.5% ne vaut pas 10px mais… 9.93px.

J’ai appliqué l’unité rem sur l’ensemble des tailles de caractères, mais également sur les margin et padding, afin que l’agrandissement des caractères et des espacements soit harmonieux.

J’ai également vérifié que les propriétés line-height ne comportaient pas d’unités.

Enfin, la taille du conteneur principal du blog est définie avec une largeur maximale de 740px de la manière suivante : max-width: 74rem;. Je me suis donc assurée que l’agrandissement global et uniquement du texte ne posait pas de souci avec cette propriété.

Tests avec le zoom du navigateur

L’agrandissement à 200%, uniquement du texte, ne pose pas de problème particulier. Le contenu reste lisible. Idem pour le test avec le zoom graphique.

Ce que j’ai appris

Un rappel très important et intéressant : les media-queries sont basées sur les préférences utilisateur, et non pas l’élément html. Sur le Codepen suivant(lien externe) (tiré de l’excellent article de Nicolas Hoffmann, Les media-queries et les préférences utilisateurs(lien externe)), vous pouvez constater le comportement strictement identique du media-query, qu’il y ait un reset de 62.5% dans l’élément html ou non.

Cela signifie donc que pour mon media-query précédemment défini avec un min-width: 640px, l’équivalent en rem sera non pas min-width: 64rem mais min-width: 40rem. Il faut en effet bien penser à diviser la taille par 16px, soit la taille de référence choisie pour nos calculs. Autrement dit, on aura bien :

@mixin desktop {
  @media screen and (min-width: 40rem) {
    // 640px / 16 = 40rem
    @content;
  }
}

Dans son article en date de mai 2016 et mis à jour en mars 2018, Nicolas Hoffmann évoque plusieurs problèmes de support des rem dans les medias-queries, notamment sur Firefox et Safari qui ne déclenchent pas le breakpoint au bon moment. Le problème a depuis été résolu sur Firefox et cela semble également être le cas sur Safari puisque le site Can I Use(lien externe) annonce un support total de l’unité rem et ne signale un souci de compatibilité avec les medias-queries que pour les versions iOS 5.0 et 5.1.