Hay situaciones en las que puede ser útil obtener el ancho de píxel exacto de una medida em
. Por ejemplo, supongamos que tiene un elemento con una propiedad CSS (como borde o relleno) que se mide en ems, y necesita obtener el ancho exacto de píxeles del borde o relleno. Hay una pregunta existente, que toca este tema:Convertir em a px en Javascript (y obtener el tamaño de fuente predeterminado)
How can i get default font size in pixels by using JavaScript or JQuery?
Esta pregunta se preguntará por conseguir el tamaño de fuente predeterminado - lo cual es necesario con el fin de convertir un valor relativo em
a un valor exacto px
.
This answer tiene una muy buena explicación de cómo hacer para conseguir el tamaño de fuente predeterminado de un elemento:
Desde anchura medida ems siempre se puede calcular el píxel exacto de una fuente tamaño mediante la creación de un div que es 1000 ems de longitud y dividiendo su propiedad de ancho de cliente por 1000. Parece que ems se truncan a la milésima más cercana, por lo que necesita 1000 ems para evitar un error de truncamiento del resultado de píxel.
Así, utilizando esta respuesta como una guía, escribí la siguiente función para obtener el tamaño de fuente predeterminado:
function getDefaultFontSize(parentElement)
{
parentElement = parentElement || document.body;
var div = document.createElement('div');
div.style.width = "1000em";
parentElement.appendChild(div);
var pixels = div.offsetWidth/1000;
parentElement.removeChild(div);
return pixels;
}
vez que tenga el tamaño de fuente predeterminado, puede convertir cualquier ancho em
-px
anchura por simplemente multiplicando el ems por tamaño de fuente predeterminado del elemento y redondeando el resultado:
Math.round(ems * getDefaultFontSize(element.parentNode))
Problema: Idealmente, se supone que el getDefaultFontSize
es una función simple sin efectos secundarios que devuelve el tamaño de fuente predeterminado. Pero DOES tienen un desafortunado efecto secundario: ¡modifica el DOM! Anexa un niño y luego lo saca. Agregar al niño es necesario para obtener una propiedad offsetWidth
válida. Si no agrega el hijo div
al DOM, la propiedad offsetWidth
permanece en 0 porque el elemento nunca se representa. Aunque eliminemos inmediatamente el elemento secundario, esta función aún puede crear efectos colaterales no deseados, como disparar un evento (como el evento onpropertychange
de Internet Explorer o el DOMSubtreeModified
de W3C) que estaba escuchando en el elemento padre.
Pregunta: ¿Hay alguna manera de escribir un libre getDefaultFontSize()
verdadera función de efectos secundarios que no va a disparar accidentalmente controladores de eventos o causar otros efectos secundarios no deseados?
En realidad, así es como funciona el DOM. Sin embargo, puede establecer la clase del elemento creado en algo como 'font-size-check' y luego en cualquier evento disparado, verifique si el elemento tiene esa clase para determinar si desea ignorarlo o no. –
Recorre el DOM hasta que encuentres un nodo con un ancho especificado en ems, y úsalo para una medida algo menos precisa. El único efecto secundario es el tiempo de procesamiento. Además, no se garantiza que funcione. – mgiuffrida