Estoy diseñando un nuevo sitio web y quiero que sea compatible con tantos navegadores y configuraciones de navegador como sea posible. Estoy tratando de decidir qué unidad de medida debo usar para los tamaños de mis fuentes y elementos, pero no puedo encontrar una respuesta concluyente.
Mi pregunta es: ¿debería usar px
o rem
en mi CSS?
- Hasta ahora sé que el uso
px
no es compatible con los usuarios que ajustan el tamaño de fuente base en su navegador. - He ignorado los
em
s porque son más difíciles de mantener, en comparación conrem
s, ya que caen en cascada. - Algunos dicen que los
rem
s son independientes de la resolución y, por lo tanto, más deseables. Pero otros dicen que los navegadores más modernos amplían todos los elementos por igual de todos modos, por lo que usarpx
no es un problema.
Lo pregunto porque hay muchas opiniones diferentes sobre cuál es la medida de distancia más deseable en CSS, y no estoy seguro de cuál es la mejor.
html
css
distance
units-of-measurement
TylerH
fuente
fuente
Respuestas:
TL; DR: uso
px
.Los hechos
Primero, es extremadamente importante saber que, según las especificaciones , la
px
unidad CSS no equivale a un píxel de visualización física. Esto siempre ha sido cierto, incluso en la especificación CSS 1 de 1996 .CSS define el píxel de referencia , que mide el tamaño de un píxel en una pantalla de 96 ppp. En una pantalla que tiene un ppp sustancialmente diferente de 96 ppp (como las pantallas Retina), el agente de usuario cambia la escala de la
px
unidad para que su tamaño coincida con el de un píxel de referencia. En otras palabras, este cambio de escala es exactamente la razón por la que 1 píxel CSS equivale a 2 píxeles físicos de pantalla Retina.Dicho esto, hasta 2010 (y a pesar de la situación del zoom móvil),
px
casi siempre igualaba un píxel físico, porque todas las pantallas ampliamente disponibles tenían alrededor de 96 ppp.Los tamaños especificados en
em
s son relativos al elemento padre . Esto lleva alem
"problema de capitalización", donde los elementos anidados se hacen cada vez más grandes o más pequeños. Por ejemplo:Nos da:
El CSS3
rem
, que siempre es relativo solo alhtml
elemento raíz , ahora es compatible con el 96% de todos los navegadores en uso .La opinión
Creo que todos están de acuerdo en que es bueno diseñar sus páginas para que se adapten a todos y tener en cuenta a las personas con discapacidad visual. Una de esas consideraciones (¡pero no la única!) Es permitir a los usuarios hacer que el texto de su sitio sea más grande, para que sea más fácil de leer.
Al principio, la única forma de proporcionar a los usuarios una forma de escalar el tamaño del texto era mediante el uso de unidades de tamaño relativo (como
em
s). Esto se debe a que el menú de tamaño de fuente del navegador simplemente cambió el tamaño de fuente raíz. Por lo tanto, si especificó tamaños de fuentepx
, no se escalarían al cambiar la opción de tamaño de fuente del navegador.Los navegadores modernos (e incluso el no tan moderno IE7) cambiaron el método de escala predeterminado para simplemente ampliar todo, incluidas las imágenes y los tamaños de los cuadros. Esencialmente, hacen que el píxel de referencia sea más grande o más pequeño.
Sí, alguien todavía podría cambiar su estilo por defecto del navegador para ajustar el tamaño de fuente por defecto (el equivalente a la opción tamaño de la fuente de estilo antiguo), pero eso es una manera muy esotérica de hacer las cosas y yo apuesto a que nadie 1 lo hace. (En Chrome, está oculto bajo la configuración avanzada, el contenido web, los tamaños de fuente. En IE9, está aún más oculto. Debe presionar Alt e ir a Ver, Tamaño de texto). Es mucho más fácil seleccionar la opción Zoom en el menú principal del navegador (o use Ctrl+ +/ -/ rueda del mouse).
1 - dentro del error estadístico, naturalmente
Si suponemos que la mayoría de los usuarios escalan las páginas usando la opción de zoom, encuentro que las unidades relativas son irrelevantes. Es mucho más fácil desarrollar su página cuando todo se especifica en la misma unidad (las imágenes se tratan en píxeles) y no tiene que preocuparse por la composición. ( "Me dijeron que no habría matemática" , se trata de tener que calcular lo que 1.5em realmente funciona).
Otro problema potencial de usar solo unidades relativas para los tamaños de fuente es que las fuentes redimensionadas por el usuario pueden romper las suposiciones que hace su diseño. Por ejemplo, esto puede hacer que el texto se recorte o se ejecute demasiado tiempo. Si usa unidades absolutas, no tiene que preocuparse de que tamaños de fuente inesperados rompan su diseño.
Entonces mi respuesta es usar unidades de píxeles. Yo uso
px
para todo. Por supuesto, su situación puede variar, y si debe admitir IE6 (que los dioses de los RFC tengan piedad de usted), tendrá que usarem
s de todos modos.fuente
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: uso
rem
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 elfont-size
de cualquier partido:root
. En el caso de HTML, es el<html>
elemento; para SVG, es el<svg>
elemento. El valor predeterminadofont-size
en cada navegador * es16px
.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 usar1px
, con elpt
que tendrías que usar0.75pt
para obtener resultados consistentes, y eso no es muy conveniente.Sobre el uso
rem
rem
El valor predeterminado de16px
no es un argumento muy fuerte para su uso. Escribir0.0625rem
es peor que escribir0.75pt
, entonces, ¿por qué alguien lo usaríarem
?Hay dos partes en
rem
ventaja sobre otras unidades.px
valor aparente derem
lo que quierasRespetando 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 preferencias24px
o32px
corregir la baja visión o la poca visibilidad (por ejemplo, el brillo de la pantalla). Si basa sus unidades enrem
, 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 usuariofont-size
configurado32px
en un640px
navegador ancho verá efectivamente su sitio como se muestra a un usuario en16px
un320px
navegador ancho. No hay absolutamente ninguna pérdida para RWD en el usorem
.Cambio del
px
valor aparenteDebido a que
rem
se basa en lafont-size
del:root
nodo, si desea cambiar lo que1rem
representa, todo lo que tiene que hacer es cambiar elfont-size
:Hagas lo que hagas, no establezcas los
:root
elementosfont-size
en unpx
valor.Si se establece el
font-size
sobrehtml
a unpx
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
es16px
, pero digamos que queremos cambiarlo20px
. Todo lo que necesitamos hacer es multiplicar16
por algún valor para obtener20
.Configura tu ecuación:
Y resuelve para
X
:Hacer todo en múltiplos de
20
no es tan bueno, pero una sugerencia común es hacer que el tamaño aparente searem
igual a10px
. El número mágico para eso es10/16
cuál es0.625
, o62.5%
.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 unafont-size
enbody
el uso derem
:Es importante tener en cuenta que, con este ajuste en su lugar, el valor aparente de
rem
es lo10px
que significa que cualquier valor en el que haya escritopx
puede convertirse directamente alrem
colocar un decimal.se convierte en
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:
y tener
1rem
igual1px
.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:Aquí el valor de los
rem
cambios depende de si se aplica la consulta de medios, y la consulta de medios depende del valor derem
, entonces, ¿qué está pasando?rem
en las consultas de los medios de comunicación utiliza el valor inicial defont-size
y no debe (ver sección Safari) tener en cuenta cualquier cambio que pueda haber ocurrido a lafont-size
del:root
elemento. En otras palabras, su valor aparente es siempre16px
.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.
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.
SafariDesafortunadamente, hay un error conocido con Safari en el que los cambios en el
:root
tamaño de fuente realmente cambian losrem
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: usarem
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 de10px
dónde en otro proyecto podría ser el tamaño aparente1px
. Esto puede ser confuso y causar problemas.Mi única recomendación aquí es seguir
62.5%
para convertirrem
a un tamaño aparente de10px
, 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ándolopx
.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 derem
.* No quiero alejar a nadie del uso
rem
, pero no he podido confirmar oficialmente que todos los navegadores usan16px
de forma predeterminada. Verá, hay muchos navegadores y no sería tan difícil para un navegador haber divergido tan levemente, digamos15px
o18px
. 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 de16px
. Si encuentra un ejemplo de este tipo, compártelo conmigo.fuente
matrix()
con javascript, que es el uso de valores de traducción matricialpx
(corrígeme si estoy equivocado), y estoy muy confundido con él .getComputedStyle()
pero el resultado siempre está en píxeles, así que tengo que dividir el resultado por elrem
valor (como 16). CMIIWrem
valor, si ya tiene elpx
valor correcto , no es necesario cambiar arem
unidades para cosas que ya están calculadas para el contexto dado.En este artículo se describe muy bien los pros y los contras de
px
,em
yrem
.El autor finalmente concluye que el mejor método es probablemente usar ambos
px
yrem
, declarandopx
primero para navegadores antiguos y redeclarandorem
para navegadores nuevos:fuente
px
. En cuanto a la unidad de elementos, seguirpx
sería mejor, ya que generalmente querría dimensionar elementos con precisión.px
es para habilitar el cambio de tamaño. Ahora, si usamosrem
, todavía tenemos que proporcionarpx
respaldo (en navegadores más antiguos). Esencialmente, lo que significa es quepx
cambiar el tamaño del soporte es mejor querem
. Los navegadores más nuevos admiten elpx
cambio de tamaño y para los navegadores más antiguos de cualquier manera que recurramospx
. Ahora, a la luz de esta conclusión, estoy muy interesado en saber, ¿por qué usarlorem
? Si puedo ver la luz al final del túnel.Como respuesta refleja, recomendaría usar rem, porque le permite cambiar el "nivel de zoom" de todo el documento de una vez, si es necesario. En algunos casos, cuando desee que el tamaño sea relativo al elemento padre, use em.
Pero el soporte remoto es irregular, IE8 necesita un polyfill y Webkit exhibe un error. Además, el cálculo de subpíxeles puede hacer que cosas como las líneas de un píxel a veces desaparezcan. El remedio es codificar en píxeles para elementos tan pequeños. Eso introduce aún más complejidad.
Entonces, en general, pregúntese si vale la pena: ¿qué tan importante y probable es que cambie el "nivel de zoom" de todo el documento dentro de CSS?
Para algunos casos es sí, para otros será no.
Por lo tanto, depende de sus necesidades, y debe sopesar los pros y los contras, porque el uso de rem y em introduce algunas consideraciones adicionales en comparación con el flujo de trabajo basado en píxeles "normal".
Tenga en cuenta que es fácil cambiar (o más bien convertir) su CSS de px a rem (JavaScript es otra historia), porque los siguientes dos bloques de código CSS producirían el mismo resultado:
fuente
Sí, REM y PX son relativos, sin embargo, otras respuestas han sugerido optar por REM sobre PX, también me gustaría respaldar esto usando un ejemplo de accesibilidad.
Cuando el usuario establece diferentes tamaños de fuente en el navegador, REM escala automáticamente hacia arriba y hacia abajo elementos como fuentes, imágenes, etc. en la página web, que no es el caso con PX.
En el siguiente gif, el texto del lado izquierdo se configura con la unidad REM del tamaño de fuente, mientras que la fuente del lado derecho se configura con la unidad PX.
El tamaño de fuente predeterminado de una página web es 16px, que es igual a 1 rem (solo para la página html predeterminada, es decir
html{font-size:100%}
), por lo tanto, 1.25rem es igual a 20px.PD: ¿quién más está usando REM? CSS Frameworks! como Bootstrap 4, Bulma CSS, etc., así que mejor llevate bien con él.
fuente
La respuesta de josh3736 es buena, pero para proporcionar un contrapunto 3 años después:
Recomiendo usar
rem
unidades para fuentes, aunque solo sea porque le facilita a usted , el desarrollador, cambiar los tamaños. Es cierto que los usuarios rara vez cambian el tamaño de fuente predeterminado en sus navegadores, y que el zoom moderno del navegador se ampliarápx
unidades. Pero, ¿qué pasa si su jefe viene a usted y le dice "no amplíe las imágenes o los iconos, sino que haga que todas las fuentes sean más grandes". Es mucho más fácil simplemente cambiar el tamaño de la fuente raíz y dejar que todas las demás fuentes escalen en relación con eso, luego cambiar lospx
tamaños en docenas o cientos de reglas CSS.Creo que todavía tiene sentido usar
px
unidades para algunas imágenes, o para ciertos elementos de diseño que siempre deben ser del mismo tamaño, independientemente de la escala del diseño.Caniuse.com puede haber dicho que solo el 75% de los navegadores cuando josh3736 publicó su respuesta en 2012, pero a partir del 27 de marzo reclaman un soporte del 93.78% . Solo IE8 no lo admite entre los navegadores que rastrean.
fuente
Only IE8 doesn't support it among the browsers they track.
¿Eh? La página vinculada establece que "IE9 e IE10 no admiten unidades rem cuando se usan en propiedades de abreviatura de fuente o cuando se usan en pseudo elementos. IE9, 10 y 11 no admiten unidades rem cuando se usan en propiedades de altura de línea cuando se usan en: antes y después de pseudo elementos. Los bordes de tamaño real desaparecen cuando la página se aleja en Chrome. No funciona en el navegador Samsung Note II Android 4.3 y Samsung Galaxy Tab 2 en Android 4.2. Chrome 31-34 y Android basado en Chrome (como 4.4) tienen un error de tamaño de fuente que ocurre cuando el elemento raíz tiene un tamaño basado en porcentaje ".as of March 27 they claim 93.78% support.
En el momento de escribir este comentario, caniuse muestra solo un 91.79% de compatibilidad total con el navegador. Mirando su porcentaje, estoy bastante seguro de que también incluyó el soporte de navegador con errores (actualmente en 2.8%, que podría interpretarse como una cobertura general optimista de 94.6%, pero el hecho es que esos 2.8% vienen con errores, incompletos o incluso completamente no ayuda ... como se señala en mi comentario anterior: cada error es el resultado de diferentes versión del navegador y del sistema operativo combinaciones) Es posible que desee corregir su respuesta en consecuencia ....He encontrado que la mejor manera de programar los tamaños de fuente de un sitio web es definir un tamaño de fuente base para el
body
y luego usar em's (o rem's) para cualquier otrofont-size
que declare después de eso. Supongo que es una preferencia personal, pero me ha servido bien y también ha hecho que sea muy fácil incorporar un diseño más receptivo .En cuanto al uso de unidades rem, creo que es bueno encontrar un equilibrio entre ser progresivo en su código, pero también ofrecer soporte para navegadores antiguos. Echa un vistazo a este enlace sobre el soporte del navegador para unidades rem , que debería ayudarte mucho en tu decisión.
fuente
body
tamaño de la fuente y todo cambia con ella.pt
es similarrem
, en el sentido de que es relativamente fijo, pero casi siempre independiente de DPI, incluso cuando los navegadores no conformes tratanpx
de manera dependiente del dispositivo.rem
varía con el tamaño de fuente del elemento raíz, pero puede usar algo como Sass / Compass para hacer esto automáticamentept
.Si tuvieras esto:
entonces
1rem
siempre lo sería12pt
.rem
yem
son tan independientes del dispositivo como los elementos en los que se basan; algunos navegadores no se comportan de acuerdo con las especificaciones y se tratanpx
literalmente. Incluso en los viejos tiempos de la Web, 1 punto se consideraba constantemente como 1/72 de pulgada, es decir, hay 72 puntos en una pulgada.Si tiene un navegador antiguo que no cumple con los requisitos y tiene:
entonces
1rem
dependerá del dispositivo. Para los elementos que heredarían dehtml
forma predeterminada,1em
también serían dependientes del dispositivo.12pt
sería la de esperar equivalente independiente del dispositivo garantizada:16px / 96px * 72pt = 12pt
donde96px = 72pt = 1in
.Puede ser bastante complicado hacer los cálculos si quieres apegarte a unidades específicas. Por ejemplo
.75em of html = .75rem = 9pt
, y.66em of .75em of html = .5rem = 6pt
. Una buena regla de oro:pt
para tamaños absolutos. Si realmente necesita que esto sea dinámico en relación con el elemento raíz, está pidiendo demasiado CSS; necesita un lenguaje que compile a CSS, como Sass / SCSS.em
para tamaños relativos. Es bastante útil poder decir: "Quiero que el margen de la izquierda sea aproximadamente del ancho máximo de una letra" o "Haga que el texto de este elemento sea un poco más grande que su entorno".<h1>
es un buen elemento para usar un tamaño de fuente en ems, ya que puede aparecer en varios lugares, pero siempre debe ser más grande que el texto cercano. De esta manera, no tiene que tener un tamaño de fuente separado para cada clase a la que se aplicah1
: el tamaño de fuente se adaptará automáticamente.px
para tamaños muy pequeños. En tamaños muy pequeños,pt
puede aparecer borroso en algunos navegadores a 96 DPI,pt
ypx
no se alinea del todo. Si solo desea crear un borde delgado de un píxel, dígalo. Si tiene una pantalla de alto DPI, esto no será obvio para usted durante la prueba, así que asegúrese de probar en una pantalla genérica de 96 DPI en algún momento.fuente
La mitad (pero solo la mitad) respuesta sarcástica (la otra mitad es un desdén amargo de la realidad de la burocracia):
Use vh
Todo siempre tiene el tamaño de la ventana del navegador.
Siempre permita desplazarse hacia abajo, nunca hacia un lado.
Establezca el ancho del cuerpo para que sea un 50vh estático, y nada flota o sale del div principal. Y diseñe solo usando tablas para que todo se mantenga rígidamente en su lugar como se esperaba. Incluya una función de JavaScript para deshacer cualquier actividad Ctrl +/- que el usuario pueda hacer.
Todos te odiarán, excepto las personas que te dicen que hagas que las cosas coincidan con su maqueta, y estarán extasiados. Y todos saben que su opinión es la única que importa.
fuente
Si. O, más bien, no.
Er, quiero decir, no importa. Use el que tenga sentido para su proyecto particular. PX y EM o ambos son igualmente válidos, pero se comportarán un poco diferentes dependiendo de la arquitectura CSS de su página en general.
ACTUALIZAR:
Para aclarar, estoy afirmando que, por lo general, no importa cuál uses. A veces, es posible que desee elegir específicamente uno sobre el otro. Los EM son buenos si puedes comenzar desde cero y quieres usar un tamaño de fuente base y hacer todo lo relacionado con eso.
Los PX a menudo se necesitan cuando se está adaptando un rediseño en una base de código existente y se necesita la especificidad de px para evitar problemas de anidamiento.
fuente
Los em son el camino a seguir, no solo para las fuentes, sino que también puede usarlas con cuadros, grosor de línea y otras cosas, ¿por qué?
En pocas palabras, los em son los únicos que se escalan al unísono con las teclas alt + y alt- en el navegador para hacer zoom.
Otras medidas escalan, pero no tan limpiamente como un em.
En una nota al margen si desea lo mejor en escala, también convierta sus gráficos a SVG basado en vectores siempre que sea posible, ya que estos también se escalarán limpiamente con la relación de zoom de los navegadores.
fuente
Los EM son lo ÚNICO que escalan las consultas de medios que manejan el escalado +/-, que las personas hacen todo el tiempo, no solo las personas ciegas. Aquí hay otra demostración profesional muy bien escrita de por qué esto es importante.
Por cierto, esta es la razón por la cual Zurb Foundation usa ems , mientras que Bootstrap 3 inferior todavía usa píxeles.
fuente