522 votes

Dois-je utiliser les unités de valeur px ou rem dans mon CSS ?

Je suis en train de concevoir un nouveau site web et je veux qu'il soit compatible avec le plus grand nombre possible de navigateurs et de paramètres de navigation. J'essaie de décider quelle unité de mesure je dois utiliser pour les tailles de mes polices et éléments, mais je ne parviens pas à trouver une réponse concluante.

Ma question est la suivante : dois-je utiliser px ou rem dans mon CSS ?

  • Jusqu'à présent, je sais qu'en utilisant px n'est pas compatible avec les utilisateurs qui ajustent la taille de leur police de base dans leur navigateur.
  • Je n'ai pas tenu compte em parce qu'ils sont plus difficiles à entretenir que les autres. rem en cascade.
  • Certains disent que em sont indépendants de la résolution et sont donc plus souhaitables. Mais d'autres disent que la plupart des navigateurs modernes zooment tous les éléments de la même manière de toute façon, donc l'utilisation de px n'est pas un problème.

Je pose cette question parce qu'il y a beaucoup d'opinions différentes sur ce qui est la mesure de distance la plus souhaitable en CSS, et je ne suis pas sûr de la meilleure.

560voto

josh3736 Points 41911

TL;DR : utiliser px .

Les faits

  • Tout d'abord, il est extrêmement important de savoir que selon les spécifications le CSS px unité n'est pas correspondent à un pixel d'affichage physique. Cela a toujours a été vrai - même en 1996 Spécification CSS 1 .

    CSS définit le pixel de référence qui mesure la taille d'un pixel sur un écran de 96 ppp. Sur un écran dont la résolution est sensiblement différente de 96 ppp (comme les écrans Retina), l'agent utilisateur redéfinit l'échelle de l'image. px afin que sa taille corresponde à celle d'un pixel de référence. En d'autres termes, cette remise à l'échelle explique exactement pourquoi 1 pixel CSS équivaut à 2 pixels physiques de l'écran Retina.

    Cela dit, jusqu'en 2010 (et en dépit de la situation du zoom mobile), le px correspondait presque toujours à un pixel physique, car tous les écrans largement disponibles étaient aux alentours de 96dpi.

  • Tailles spécifiées dans em sont relatives à l'élément parent . Cela conduit à la em Il s'agit du "problème de composition", où les éléments imbriqués deviennent progressivement plus grands ou plus petits. Par exemple :

    body { font-size:20px; } 
    div { font-size:0.5em; }

    Nous donne :

    <body> - 20px
        <div> - 10px
            <div> - 5px
                <div> - 2.5px
                    <div> - 1.25px
  • Les CSS3 rem qui n'est toujours relatif qu'à la racine. html est trop récent pour qu'on puisse s'y fier. En juillet 2012, environ 75% de tous les navigateurs utilisés soutenir le rem .

L'opinion

Je pense que tout le monde est d'accord pour dire qu'il est bon de concevoir ses pages de manière à ce qu'elles soient adaptées à tout le monde, et de prendre en compte les malvoyants. L'une de ces considérations (mais pas la seule !) consiste à permettre aux utilisateurs d'agrandir le texte de votre site, afin qu'il soit plus facile à lire.

Au début, la seule façon de fournir aux utilisateurs un moyen de mettre à l'échelle la taille du texte était d'utiliser des unités de taille relative (telles que em s). Cela s'explique par le fait que le menu de taille de police du navigateur a simplement modifié la taille de la police Racine. Ainsi, si vous avez spécifié des tailles de police dans px ils ne sont pas mis à l'échelle lorsque l'option de taille de police du navigateur est modifiée.

Les navigateurs modernes (et même le pas si moderne IE7) ont tous changé la méthode de mise à l'échelle par défaut pour simplement zoomer sur tout, y compris les images et les tailles des boîtes. Essentiellement, ils agrandissent ou réduisent le pixel de référence.

Oui, quelqu'un peut toujours modifier la feuille de style par défaut de son navigateur pour modifier la taille de la police par défaut (l'équivalent de l'option de taille de la police à l'ancienne), mais c'est une façon très ésotérique de procéder et je parie que personne 1 le fait. (Dans Chrome, elle est cachée sous les paramètres avancés, Contenu Web, Tailles de police. Dans IE9, elle est encore plus cachée. Vous devez appuyer sur Alt, et aller dans Affichage, Taille du texte). Il est beaucoup plus simple de sélectionner l'option Zoom dans le menu principal du navigateur (ou d'utiliser la fonction Ctrl + + / - /roue de la souris).

1 - dans les limites de l'erreur statistique, naturellement

Si nous supposons que la plupart des utilisateurs mettent les pages à l'échelle en utilisant l'option de zoom, je trouve que les unités relatives ne sont pas pertinentes. Il est beaucoup plus facile de développer votre page lorsque tout est spécifié dans la même unité (les images sont toutes traitées en pixels), et vous n'avez pas à vous soucier de la composition. ( "On m'a dit qu'il n'y aurait pas de maths" - il y a le problème de devoir calculer ce que représente 1,5em).

Un autre problème potentiel lié à l'utilisation d'unités relatives pour les tailles de police est que les polices redimensionnées par l'utilisateur peuvent rompre les hypothèses de votre mise en page. Par exemple, le texte pourrait être coupé ou trop long. Si vous utilisez des unités absolues, vous n'avez pas à vous soucier des tailles de police inattendues qui peuvent casser votre mise en page.

Ma réponse est donc d'utiliser des unités de pixels. J'utilise px pour tout. Bien sûr, votre situation peut varier, et si vous devez supporter IE6 (que les dieux des RFC aient pitié de vous), vous devrez utiliser em de toute façon.

58voto

uzyn Points 3054

Cet article décrit assez bien les avantages et les inconvénients de px , em et rem .

L'auteur conclut finalement que la meilleure méthode est probablement d'utiliser les deux px et rem déclarant px d'abord pour les anciens navigateurs et redéclarer rem pour les navigateurs plus récents :

html { font-size: 62.5%; } 
body { font-size: 14px; font-size: 1.4rem; } /* =14px */
h1   { font-size: 24px; font-size: 2.4rem; } /* =24px */

9voto

Rolf Points 922

Comme réponse réflexe, je recommanderais d'utiliser rem, car il vous permet de changer le "niveau de zoom" de l'ensemble du document en une seule fois, si nécessaire. Dans certains cas, lorsque vous souhaitez que la taille soit relative à l'élément parent, utilisez alors em.

Mais La prise en charge des rem est inégale, IE8 a besoin d'un polyfill et Webkit présente un bogue. De plus, le calcul en sous-pixels peut parfois faire disparaître des éléments tels que des lignes d'un pixel. Le remède consiste à coder en pixels pour ces très petits éléments. Cela introduit encore plus de complexité.

Donc, dans l'ensemble, demandez-vous si cela en vaut la peine - dans quelle mesure il est important et probable que vous changiez le "niveau de zoom" de l'ensemble du document au sein de CSS ?

Dans certains cas, c'est oui, dans d'autres, c'est non.

Cela dépend donc de vos besoins, et vous devez peser le pour et le contre, car l'utilisation de rem et em introduit des considérations supplémentaires par rapport au flux de travail "normal" basé sur les pixels.

Gardez à l'esprit qu'il est facile de passer (ou plutôt de convertir) votre CSS de px à rem (JavaScript est une autre histoire), car les deux blocs de code CSS suivants produiraient le même résultat :

html {
}

body {
  font-size:14px;
}

.someElement {
  width: 12px;
}

html {
  font-size:1px;
}

body {
  font-size:14rem;
}

.someElement {
  width: 12rem;
}

2voto

Zenexer Points 4192

pt est similaire à rem En effet, il est relativement fixe, mais presque toujours indépendant de l'IAP, même lorsque des navigateurs non conformes traitent les données. px en fonction de l'appareil. rem varie en fonction de la taille de la police de l'élément Root, mais vous pouvez utiliser quelque chose comme Sass/Compass pour faire cela automatiquement avec pt .

Si tu avais ça :

html {
    font-size: 12pt;
}

puis 1rem serait toujours 12pt . rem et em sont aussi indépendants des périphériques que les éléments sur lesquels ils reposent ; certains navigateurs ne se comportent pas conformément à la spécification et traitent les éléments suivants px littéralement. Même à l'époque du Web, un point était systématiquement considéré comme 1/72 de pouce, c'est-à-dire qu'il y a 72 points dans un pouce.

Si vous avez un vieux navigateur non conforme, et que vous avez :

html {
    font-size: 16px;
}

puis 1rem va dépendre de l'appareil. Pour les éléments qui hériteraient de html par défaut, 1em dépendrait également de l'appareil. 12pt serait le Avec un peu de chance, équivalent garanti indépendant du dispositif : 16px / 96px * 72pt = 12pt96px = 72pt = 1in .

Il peut être assez compliqué de faire les calculs si vous voulez vous en tenir à des unités spécifiques. Par exemple, .75em of html = .75rem = 9pt et .66em of .75em of html = .5rem = 6pt . Une bonne règle de base :

  • Utilisez pt pour les tailles absolues. Si vous avez vraiment besoin que ce soit dynamique par rapport à l'élément Root, vous demandez trop à CSS ; vous avez besoin d'un langage qui se compile avec CSS, comme Sass/SCSS.
  • Utilisez em pour les tailles relatives. C'est assez pratique de pouvoir dire : "Je veux que la marge de gauche ait la largeur maximale d'une lettre" ou "Je veux que le texte de cet élément soit un peu plus grand que son environnement". <h1> est un bon élément sur lequel utiliser une taille de police en ems, puisqu'elle peut apparaître à différents endroits, mais doit toujours être plus grande que le texte voisin. De cette façon, vous n'avez pas besoin d'avoir une taille de police distincte pour chaque classe appliquée à h1 : la taille de la police s'adaptera automatiquement.
  • Utilisez px pour les très petites tailles. À de très petites tailles, pt peut devenir floue dans certains navigateurs à 96 DPI, puisque pt et px ne s'alignent pas tout à fait. Si vous souhaitez simplement créer une fine bordure d'un pixel, dites-le. Si vous disposez d'un écran à haute résolution, cela ne sera pas évident pendant le test. Veillez donc à tester sur un écran générique à 96 DPI à un moment donné.
  • N'utilisez pas de sous-pixels pour donner de la fantaisie aux écrans à haute résolution. Certains navigateurs peuvent le prendre en charge, en particulier sur les écrans à haute résolution, mais c'est une erreur. La plupart des utilisateurs préfèrent le gros et le clair, même si le web nous a appris le contraire à nous, développeurs. Si vous souhaitez ajouter des détails supplémentaires pour vos utilisateurs disposant d'écrans de pointe, vous pouvez utiliser des graphiques vectoriels (lire : SVG), ce que vous devriez faire de toute façon.

1voto

cereallarceny Points 2819

J'ai découvert que la meilleure façon de programmer la taille des polices d'un site web est de définir une taille de base pour la police du site. body puis utiliser des em (ou rem) pour chaque autre font-size Je déclare après cela. C'est une préférence personnelle, je suppose, mais cela m'a bien servi et m'a également permis d'incorporer très facilement un système de gestion de l'information plus efficace. conception réactive .

En ce qui concerne l'utilisation des unités rem, je pense qu'il est bon de trouver un équilibre entre le fait d'être progressif dans son code, mais aussi d'offrir un support pour les anciens navigateurs. Consultez ce lien sur la prise en charge des unités rem par les navigateurs. Cela devrait vous aider à prendre une bonne décision.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X