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 pxo remen mi CSS?
- Hasta ahora sé que el uso
pxno es compatible con los usuarios que ajustan el tamaño de fuente base en su navegador. - He ignorado los
ems porque son más difíciles de mantener, en comparación conrems, ya que caen en cascada. - Algunos dicen que los
rems 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 usarpxno 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
pxunidad 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
pxunidad 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),
pxcasi siempre igualaba un píxel físico, porque todas las pantallas ampliamente disponibles tenían alrededor de 96 ppp.Los tamaños especificados en
ems 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 alhtmlelemento 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
ems). 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
pxpara 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 usarems 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,
pxfue la respuesta correcta, pero eso ya no es cierto hoy.tl; dr: uso
remDescripción de la unidad
Históricamente, las
pxunidades 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.remunidades representan la r oot em tamaño. Es elfont-sizede cualquier partido:root. En el caso de HTML, es el<html>elemento; para SVG, es el<svg>elemento. El valor predeterminadofont-sizeen cada navegador * es16px.Al momento de escribir,
remes 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
pxLa mayoría de los ejemplos de CSS en Internet usan
pxvalores porque eran el estándar de facto.pt,iny 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
pxque podrías usar1px, con elptque tendrías que usar0.75ptpara obtener resultados consistentes, y eso no es muy conveniente.Sobre el uso
remremEl valor predeterminado de16pxno es un argumento muy fuerte para su uso. Escribir0.0625remes peor que escribir0.75pt, entonces, ¿por qué alguien lo usaríarem?Hay dos partes en
remventaja sobre otras unidades.pxvalor aparente deremlo 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
16pxde forma predeterminada, no significa que ningún usuario pueda cambiar sus preferencias24pxo32pxcorregir 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-sizeconfigurado32pxen un640pxnavegador ancho verá efectivamente su sitio como se muestra a un usuario en16pxun320pxnavegador ancho. No hay absolutamente ninguna pérdida para RWD en el usorem.Cambio del
pxvalor aparenteDebido a que
remse basa en lafont-sizedel:rootnodo, si desea cambiar lo que1remrepresenta, todo lo que tiene que hacer es cambiar elfont-size:Hagas lo que hagas, no establezcas los
:rootelementosfont-sizeen unpxvalor.Si se establece el
font-sizesobrehtmla unpxvalor, 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
:rootes16px, pero digamos que queremos cambiarlo20px. Todo lo que necesitamos hacer es multiplicar16por algún valor para obtener20.Configura tu ecuación:
Y resuelve para
X:Hacer todo en múltiplos de
20no es tan bueno, pero una sugerencia común es hacer que el tamaño aparente searemigual a10px. El número mágico para eso es10/16cuál es0.625, o62.5%.El problema ahora es que su valor predeterminado
font-sizepara el resto de la página se establece demasiado pequeñas, pero hay una solución simple para ello: Configurar unafont-sizeenbodyel uso derem:Es importante tener en cuenta que, con este ajuste en su lugar, el valor aparente de
remes lo10pxque significa que cualquier valor en el que haya escritopxpuede convertirse directamente alremcolocar 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
1remigual1px.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
remes 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
remimplicará consultas de medios. Considere el siguiente código:Aquí el valor de los
remcambios depende de si se aplica la consulta de medios, y la consulta de medios depende del valor derem, entonces, ¿qué está pasando?remen las consultas de los medios de comunicación utiliza el valor inicial defont-sizey no debe (ver sección Safari) tener en cuenta cualquier cambio que pueda haber ocurrido a lafont-sizedel:rootelemento. 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
:roottamaño de fuente realmente cambian losremvalores calculados para los rangos de consulta de medios. Esto puede causar un comportamiento muy extraño si el tamaño de fuente del:rootelemento se cambia dentro de una consulta de medios. Afortunadamente, la solución es simple: usaremunidades para consultas de medios .Cambio de contexto
Si cambia entre varios proyectos diferentes, es muy posible que el tamaño de fuente aparente
remtenga valores diferentes. En un proyecto, puede estar usando un tamaño aparente de10pxdó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 convertirrema 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
remtendrá. 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 usan16pxde forma predeterminada. Verá, hay muchos navegadores y no sería tan difícil para un navegador haber divergido tan levemente, digamos15pxo18px. 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 elremvalor (como 16). CMIIWremvalor, si ya tiene elpxvalor correcto , no es necesario cambiar aremunidades 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,emyrem.El autor finalmente concluye que el mejor método es probablemente usar ambos
pxyrem, declarandopxprimero para navegadores antiguos y redeclarandorempara navegadores nuevos:fuente
px. En cuanto a la unidad de elementos, seguirpxsería mejor, ya que generalmente querría dimensionar elementos con precisión.pxes para habilitar el cambio de tamaño. Ahora, si usamosrem, todavía tenemos que proporcionarpxrespaldo (en navegadores más antiguos). Esencialmente, lo que significa es quepxcambiar el tamaño del soporte es mejor querem. Los navegadores más nuevos admiten elpxcambio 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
remunidades 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ápxunidades. 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 lospxtamaños en docenas o cientos de reglas CSS.Creo que todavía tiene sentido usar
pxunidades 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
bodyy luego usar em's (o rem's) para cualquier otrofont-sizeque 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
bodytamaño de la fuente y todo cambia con ella.ptes similarrem, en el sentido de que es relativamente fijo, pero casi siempre independiente de DPI, incluso cuando los navegadores no conformes tratanpxde manera dependiente del dispositivo.remvarí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
1remsiempre lo sería12pt.remyemson tan independientes del dispositivo como los elementos en los que se basan; algunos navegadores no se comportan de acuerdo con las especificaciones y se tratanpxliteralmente. 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
1remdependerá del dispositivo. Para los elementos que heredarían dehtmlforma predeterminada,1emtambién serían dependientes del dispositivo.12ptsería la de esperar equivalente independiente del dispositivo garantizada:16px / 96px * 72pt = 12ptdonde96px = 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:ptpara 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.empara 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.pxpara tamaños muy pequeños. En tamaños muy pequeños,ptpuede aparecer borroso en algunos navegadores a 96 DPI,ptypxno 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