Desarrollo front-end, estándares web, accesibilidad y más
Por kcmr, el 7 de enero de 2009 en Accesibilidad, CSS
Los diseños elásticos en CSS son aquellos en los que se utilizan unidades relativas para las medidas de fuentes y capas contenedoras de manera que, manteniendo la apariencia y ventajas de los diseños fijos frente a los diseños líquidos, permiten redimensionar el tamaño de todos los elementos de la página al aumentar o disminuir el tamaño de fuente en el navegador.
Este comportamiento es posible gracias a la utilización de emes como unidad de medida para definir las dimensiones de todos los elementos de la página. Las emes son una unidad relativa, es decir, no se puede decir que tengan una equivalencia en píxeles de por sí, sino que su valor depende del tamaño de fuente del elemento en base al que son declaradas.
Por suerte, el tamaño de fuente por defecto en todos los navegadores (creo que esto no siempre ha sido así), es de 16 píxeles, con lo que a partir de esto se puede decir que 1em = 16px.
Calcular tamaños relativos a 16 píxeles no es nada apetecible, sin embargo, calcular tamaños en base a 10 píxeles es tan sencillo como dividir la medida en píxeles por 10, de manera que lo que en píxeles son 400, en emes sean 40.
Con el objetivo de establecer el valor de 1em en 10px, surge esta conocida regla:
body{ font-size: 62.5%; } // 100% = 16px => 62.5% = 10px
Y ya tenemos la equivalencia deseada de 1em con 10px en todos los navegadores. En todos menos en Internet Explorer (todas las versiones, incluso el “superestándar” Internet Explorer 8 )
Toda esta explicación e introducción, probablemente innecesaria, viene a cuento de una nueva herramienta on line que he visto unas cuantas veces durante los últimos días en mis feeds. Se trata de PXtoEM.com, que se basa en la anterior regla para hacer la conversión de píxeles a emes.
Si no somos demasiado pejigueros, la regla del 62.5% es aceptable cuando sólo se van a usar emes para los tamaños de fuente, pero no es válida para hacer un diseño elástico, ya que en el momento que se empiecen a usar imágenes de fondo en capas, las cosas empezarán a no cuadrar en Internet Explorer.
Cómo comentan en un mail en la lista de correo de css-discuss.incutio.com, Internet Explorer ignora el decimal en el porcentaje (62.5%), con lo que la equivalencia conseguida es de 9.92px en vez de 10px.
Se puede comprobar utilizando una imagen de fondo en una capa a la que damos las dimensiones de la imagen de fondo. En esta página test, hay una capa con una imagen de fondo de 300 x 200 píxeles (el borde es interior). El estilo para esta página contiene solamente dos reglas:
body{ font-size: 62.5%; background: #ccc;}
.capa-test{width: 30em; height: 20em; background: url(fondo.gif) 0 0 no-repeat;}
Si vemos esta página con cualquier versión de Internet Explorer, veremos que la imagen de fondo no aparece completa, le faltan los bordes derecho e inferior.

Captura de Internet Explorer 6

Captura de Internet Explorer 7

Captura de Internet Explorer 8 Beta 2
Hay una solución que funciona, basada en establecer el tamaño de fuente del elemento HTML en 62.5%, el del BODY en 100% para los navegadores que no son Explorer y en 101% para Explorer, lo que supone tener que usar hacks o selectores para uno u otro navegador con los riesgos que esto conlleva. No sabemos si una futura versión de Opera, Firefox o cualquier otro navegador, soportará estos selectores CSS usados como filtros.
Si el problema de Internet Explorer es que ignora el decimal en el porcentaje, simplemente podemos solucionarlo buscando una medida redonda. Esta medida es 125%, que equivale a 20 píxeles.
Dando al BODY un font-size de 125% y al bloque contenedor de todos los elementos de la página un tamaño de fuente de 0.5em (la mitad de 20), conseguimos la equivalencia buscada de 1em = 10px sin usar hacks ni medidas erróneas.
En esta otra página test se puede ver el resultado y comprobar que Internet Explorer interpreta correctamente el tamaño de fuente. En este ejemplo se ha añadido una capa que contiene a la capa con la imagen de fondo, a la que se le ha dado un tamaño de fuente de 0.5em:
body{font-size: 125%; background: #ccc;}
#contenedor{font-size: .5em;}
.capa-test{width: 30em; height: 20em; background: url(fondo.gif) 0 0 no-repeat;}
Los resultados en Internet Explorer usando esta técnica:

Captura de Internet Explorer 6

Captura de Internet Explorer 7

Captura de Internet Explorer 8 Beta 2
Actualización (12/01/2009)
No es necesario dar un tamaño de fuente de 0.5em a la capa contenedora más externa, ya que podemos dar diréctamente el tamaño de 125% al elemento HTML y el de 0.5em al BODY. De esta forma nos ahorramos dar un tamaño de fuente para cada capa que se genere fuera del bloque contenedor, como suele ser el caso de ventanas modales, capas que contienen iconos de cargando, etc.
La CSS quedaría finalmente así:
html{ font-size: 125%; }
body{ font-size: .5em; }
Se puede ver el resultado en esta página.
Campos obligatorios marcados con asterisco *
5 comentarios
Por Eduardo, el 11 de febrero de 2009
Muy buena tu explicación me has aclarado mucho el tema de los em.
Gracias..
Por Fry, el 19 de mayo de 2009
Gracias!
Después de mas de 1 año maquetando con em a ojo de buen cubero, al fin mi compañero va a entender mis css!!
Por Borja, el 20 de noviembre de 2009
En primer lugar quiero felicitarte por tu blog, caí de rebote el otro día y me estoy favoriteando un montón de entradas…
Por otro lado me gustaría hacerte una aportación a este temas de diseños elásticos, porque me ha tocado abordarlos en muchos proyectos.
Creo que sería interesante que implementaras de alguna manera la definición de fuentes con palabras clave, son mucho más estables en el manejo de herencias y además tienen un límite inferior de seguridad de 9px por fuente (cosa que no pasa con el resto de unidades de medida).
No es nada de mi cosecha, me limito prácticamente a reproducir el capítulo de “Tipografía” del libro de Zeldman “Designing with web standards”. Échale un ojo si puedes porque está pero que muy bien.
Aquí tengo un par de post en un foro sobre este tema de los diseños elásticos, sobre todo en el segundo expongo las razones por las que utilizar palabras claves en lugar de EM’s para la definición de fuentes
http://www.domestika.org/foros/5-programacin_cliente/hilos/53746-cunto_mide_1em_breve_explicacin
http://www.domestika.org/foros/931-experiencia_de_usuario/hilos/51059-accesibilidad_css_liquido_elastico_fijo?page=3#post_402469
Un saludo y gracias por todo el contenido que tienes aquí dentro.
Por kcmr, el 20 de noviembre de 2009
@ Borja, gracias por las felicitaciones, no suelen ser muy frecuentes.
Yo también leí ese libro (la primera edición) que en algún momento presté y ya se sabe, libro prestado…
La verdad es que nunca he usado palabras clave, pero lo de que el tamaño mínimo no pueda ser inferior a 9px parece una muy buena idea, porque mucha gente tiene el tamaño de fuente de su navegador reducido y ni siquiera lo sabe, con lo que se supone que tampoco sabe cambiarlo.
Lo voy a mirar en cuanto tenga un rato.
Saludos
Por Borja, el 20 de noviembre de 2009
Lo de las herencias también facilita mucho las cosas, porque evita efectos acumulativos al heredarse las declaraciones de font-size.
Este es un problema muy típico con diseños elásticos, sobre todo cuando tienes equipos de maquetadores de diferentes niveles, o el sitio lo va a mantener luego otra gente (que no siempre tienen superclaros los conceptos CSS necesarios para abordar un diseño elástico).
Hace el código mucho más robusto.
Y me reafirmo en las felicitaciones, muy buen contenido.