Me gustaría elogiar la respuesta de josh3736 por proporcionar un excelente contexto histórico. Si bien está bien articulado, el panorama CSS ha cambiado en los casi cinco años desde que se hizo esta pregunta. Cuando se hizo esta pregunta, px
fue la respuesta correcta, pero eso ya no es cierto hoy.
tl; dr: usorem
Descripción de la unidad
Históricamente, las px
unidades generalmente representaban un píxel del dispositivo. Con dispositivos que tienen una densidad de píxeles cada vez mayor, esto ya no es válido para muchos dispositivos, como con la pantalla Retina de Apple.
rem
unidades representan la r oot em tamaño. Es el font-size
de cualquier partido :root
. En el caso de HTML, es el <html>
elemento; para SVG, es el <svg>
elemento. El valor predeterminado font-size
en cada navegador * es 16px
.
Al momento de escribir, rem
es compatible con aproximadamente el 98% de los usuarios . Si le preocupa ese otro 2%, le recordaré que las consultas de medios también son compatibles con aproximadamente el 98% de los usuarios .
Sobre el uso px
La mayoría de los ejemplos de CSS en Internet usan px
valores porque eran el estándar de facto. pt
, in
y una variedad de otras unidades podrían haberse usado en teoría, pero no manejaban bien los valores pequeños, ya que rápidamente necesitarías recurrir a fracciones, que eran más largas de escribir y más difíciles de razonar.
Si quisieras un borde delgado, con el px
que podrías usar 1px
, con el pt
que tendrías que usar 0.75pt
para obtener resultados consistentes, y eso no es muy conveniente.
Sobre el uso rem
rem
El valor predeterminado de 16px
no es un argumento muy fuerte para su uso. Escribir 0.0625rem
es peor que escribir 0.75pt
, entonces, ¿por qué alguien lo usaría rem
?
Hay dos partes en rem
ventaja sobre otras unidades.
- Se respetan las preferencias del usuario.
- Puedes cambiar el
px
valor aparente de rem
lo que quieras
Respetando las preferencias del usuario
El zoom del navegador ha cambiado mucho a lo largo de los años. Históricamente, muchos navegadores solo se escalaban font-size
, pero eso cambió bastante rápido cuando los sitios web se dieron cuenta de que sus hermosos diseños perfectos en píxeles se rompían cada vez que alguien se acercaba o alejaba. En este punto, los navegadores escalan toda la página, por lo que el zoom basado en fuentes está fuera de la imagen.
Respetar los deseos de un usuario no está fuera de la imagen. El hecho de que un navegador esté configurado 16px
de forma predeterminada, no significa que ningún usuario pueda cambiar sus preferencias 24px
o 32px
corregir la baja visión o la poca visibilidad (por ejemplo, el brillo de la pantalla). Si basa sus unidades en rem
, cualquier usuario con un tamaño de fuente más alto verá un sitio proporcionalmente más grande. Las fronteras serán más grandes, el relleno será más grande, los márgenes serán más grandes, todo se ampliará de manera fluida.
Si basa sus consultas de medios rem
, también puede asegurarse de que el sitio que ven sus usuarios se ajuste a su pantalla. Un usuario font-size
configurado 32px
en un 640px
navegador ancho verá efectivamente su sitio como se muestra a un usuario en 16px
un 320px
navegador ancho. No hay absolutamente ninguna pérdida para RWD en el uso rem
.
Cambio del px
valor aparente
Debido a que rem
se basa en la font-size
del :root
nodo, si desea cambiar lo que 1rem
representa, todo lo que tiene que hacer es cambiar el font-size
:
:root {
font-size: 100px;
}
body {
font-size: 1rem;
}
<p>Don't ever actually do this, please</p>
Hagas lo que hagas, no establezcas los :root
elementos font-size
en un px
valor.
Si se establece el font-size
sobre html
a un px
valor, que ha impresionado las preferencias del usuario sin una manera de recuperarlos.
Si desea cambiar el valor aparente de rem
, use %
unidades.
La matemática para esto es razonablemente sencilla.
El tamaño de fuente aparente de :root
es 16px
, pero digamos que queremos cambiarlo 20px
. Todo lo que necesitamos hacer es multiplicar 16
por algún valor para obtener 20
.
Configura tu ecuación:
16 * X = 20
Y resuelve para X
:
X = 20 / 16
X = 1.25
X = 125%
:root {
font-size: 125%;
}
<p>If you're using the default font-size, I'm 20px tall.</p>
Hacer todo en múltiplos de 20
no es tan bueno, pero una sugerencia común es hacer que el tamaño aparente sea rem
igual a 10px
. El número mágico para eso es 10/16
cuál es 0.625
, o 62.5%
.
:root {
font-size: 62.5%;
}
<p>If you're using the default font-size, I'm 10px tall.</p>
El problema ahora es que su valor predeterminado font-size
para el resto de la página se establece demasiado pequeñas, pero hay una solución simple para ello: Configurar una font-size
en body
el uso de rem
:
:root {
font-size: 62.5%;
}
body {
font-size: 1.6rem;
}
<p>I'm the default font-size</p>
Es importante tener en cuenta que, con este ajuste en su lugar, el valor aparente de rem
es lo 10px
que significa que cualquier valor en el que haya escrito px
puede convertirse directamente al rem
colocar un decimal.
padding: 20px;
se convierte en
padding: 2rem;
El tamaño de fuente aparente que elija depende de usted, por lo que si lo desea, no hay razón para que no pueda usar:
:root {
font-size: 6.25%;
}
body {
font-size: 16rem;
}
y tener 1rem
igual 1px
.
Así que ahí lo tiene, una solución simple para respetar los deseos del usuario y al mismo tiempo evitar complicar demasiado su CSS.
Espera, ¿cuál es el problema?
Tenía miedo de que pudieras preguntar eso. Por mucho que quisiera fingir que eso rem
es mágico y lo resuelve todo, todavía hay algunos problemas importantes. En mi opinión no hay nada que rompa el trato , pero los voy a llamar para que no me digas que no te lo advertí.
Consultas de medios (uso em
)
Uno de los primeros problemas con los que te encontrarás rem
implicará consultas de medios. Considere el siguiente código:
:root {
font-size: 1000px;
}
@media (min-width: 1rem) {
:root {
font-size: 1px;
}
}
Aquí el valor de los rem
cambios depende de si se aplica la consulta de medios, y la consulta de medios depende del valor de rem
, entonces, ¿qué está pasando?
rem
en las consultas de los medios de comunicación utiliza el valor inicial de font-size
y no debe (ver sección Safari) tener en cuenta cualquier cambio que pueda haber ocurrido a la font-size
del :root
elemento. En otras palabras, su valor aparente es siempre 16px
.
Esto es un poco molesto, porque significa que tienes que hacer algunos cálculos fraccionarios, pero descubrí que las consultas de medios más comunes ya usan valores que son múltiplos de 16.
| px | rem |
+------+-----+
| 320 | 20 |
| 480 | 30 |
| 768 | 48 |
| 1024 | 64 |
| 1200 | 75 |
| 1600 | 100 |
Además, si está utilizando un preprocesador CSS, puede usar mixins o variables para administrar sus consultas de medios, lo que enmascarará el problema por completo.
Safari
Desafortunadamente, hay un error conocido con Safari en el que los cambios en el :root
tamaño de fuente realmente cambian los rem
valores calculados para los rangos de consulta de medios. Esto puede causar un comportamiento muy extraño si el tamaño de fuente del :root
elemento se cambia dentro de una consulta de medios. Afortunadamente, la solución es simple: usar em
unidades para consultas de medios .
Cambio de contexto
Si cambia entre varios proyectos diferentes, es muy posible que el tamaño de fuente aparente rem
tenga valores diferentes. En un proyecto, puede estar usando un tamaño aparente de 10px
dónde en otro proyecto podría ser el tamaño aparente 1px
. Esto puede ser confuso y causar problemas.
Mi única recomendación aquí es seguir 62.5%
para convertir rem
a un tamaño aparente de 10px
, porque eso ha sido más común en mi experiencia.
Bibliotecas CSS compartidas
Si está escribiendo CSS que se utilizará en un sitio que no controla, como un widget incorporado, realmente no hay una buena manera de saber qué tamaño aparente rem
tendrá. Si ese es el caso, siéntase libre de seguir usándolo px
.
Sin embargo, si todavía desea usar rem
, considere lanzar una versión Sass o LESS de la hoja de estilo con una variable para anular la escala para el tamaño aparente de rem
.
* No quiero alejar a nadie del uso rem
, pero no he podido confirmar oficialmente que todos los navegadores usan 16px
de forma predeterminada. Verá, hay muchos navegadores y no sería tan difícil para un navegador haber divergido tan levemente, digamos 15px
o 18px
. En las pruebas, sin embargo, no he visto un solo ejemplo en el que un navegador que usa la configuración predeterminada en un sistema que usa la configuración predeterminada tuviera un valor distinto de 16px
. Si encuentra un ejemplo de este tipo, compártelo conmigo.