2012-09-03 11 views
25

Estoy buscando una forma confiable de obtener el ancho de la ventana en unidades em usando javascript. Me sorprendió ver que jQuery solo devolverá un resultado en mediciones de píxeles. Cualquier ayuda es apreciada.¿Es posible obtener el ancho de la ventana en unidades em usando javascript?

+3

em es relativo al tamaño de sus fuentes. Si el tamaño de su fuente es de 12 px, entonces el ancho de la ventana dividido entre 12 le dará la cantidad equivalente de em. Va a depender de la fuente que desee que sea relativa a – kmb64

Respuesta

43

Esto parece funcionar:

$(window).width()/parseFloat($("body").css("font-size")); 
+4

Para aquellos que dependen del tamaño de fuente% y las consultas de medios cambian $ ("cuerpo"). Css ("tamaño de fuente") a $ ("html"). css ("font-size") para obtener el ancho de ventana más preciso en ems. – ontananza

+0

Lo bueno de este enfoque es que se vuelve extremadamente flexible, ya que uno puede cambiar el ** $ (ventana) .width() **, cualquiera que sea el objetivo. – blackhawk

+0

ESTO ES GRANDE. He estado buscando esto por una hora. – salep

0

Es posible calcular, pero em no es una unidad de "simple" como px porque depende de una selección de fuente (es decir, una combinación de familia tipográfica , estilo (negrita, cursiva, etc.) y tamaño de letra). Por supuesto, el tamaño de fuente en sí puede ser relativo (por ejemplo, si le da a una fuente un em, ex o un porcentaje de tamaño, la altura calculada px para esa fuente se deriva del tamaño del elemento principal).

para obtener el ancho em de una página que podría hacer la conversión como esta (advertencia: psuedocode):

// For this to work reliably, size should be in px, pt, or mm. 
function getWindowWidthInEm(fontFamily, style, size) { 
    var box = document.createElement("span"); 
    box.innerText = "M"; 
    box.style.fontFamily = fontFamily; 
    box.style.fontSize = size; 
    box.style.fontWeight = style is bold; 
    box.style.fontStyle = style is italic; 

    var body = document.getElementsByTagName("body")[0]; 
    body.appendChild(box); 

    var emInPx = box.getComputedStyle().width; 

    body.removeChild(box); 

    var windowPx = window.width; 
    return windowx/emInPx; 
} 
-15

simple, ya que sabemos 1em = 16px

var window_width_em = 1/16 * window_width_px; 
+14

Suponiendo que 1em tenga 16 px es engañosamente incorrecto. Las unidades Em son relativas al tamaño de fuente en cascada de un elemento. Agregando css 'html {font-size: 10px; } 'o' html {font-size: 1.5em; } 'daría como resultado 1em ***! = *** 16px. Más allá del control de los desarrolladores está el hecho de que el "agente de usuario" establece el "tamaño de letra estándar de 16 píxeles", y el usuario puede cambiarlo *** por un simple ***. –

+15

Esta respuesta sigue siendo incorrecta, no importa cuántas de mis respuestas vote abajo :) –

1

Para aquellos que lo necesitan todo junto, este código funciona para mí:

<p>Window size: <span id="width_px"></span> pixels or <span id="width_ems"></span> ems</p> 
<script> 
    window.onresize = function() { 
    document.getElementById("width_px").innerHTML = window.innerWidth; 
    document.getElementById("width_ems").innerHTML = window.innerWidth/parseFloat($("body").css("font-size")); 
    }; 
</script> 

Es pu t juntos usando la respuesta anterior agregada al window-width test code que se encuentra en el tutorial vinculado.

11

Aquí hay una solución que no requiere jQuery y no requiere una declaración de tamaño de fuente explícita.

window.innerWidth/
    parseFloat(getComputedStyle(document.querySelector('body'))['font-size']) 
+1

+1 - No hará la diferencia, pero 'html' sería un poco * más correcto * que' body' para que em tome la fuente raíz tamaño y eso es html – m02ph3u5

Cuestiones relacionadas