2012-09-03 11 views
25

Sto cercando un modo affidabile per ottenere la larghezza della finestra in unità em utilizzando javascript. Sono rimasto sorpreso nel vedere che jQuery restituirà solo un risultato nelle misure dei pixel. Qualsiasi aiuto è apprezzato.E 'possibile ottenere la larghezza della finestra in em unità usando javascript?

+3

em è relativo alla dimensione dei caratteri. Se la dimensione del font è 12 px, allora la larghezza della finestra divisa per 12 ti darà la quantità em equivale. Dipenderà dal tipo di carattere che vuoi che sia relativo a – kmb64

risposta

43

Questo sembra funzionare:

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

Per quelli che si affidano a font-size% e media queries cambia $ ("body"). Css ("font-size") a $ ("html"). css ("font-size") per ottenere una larghezza della finestra più accurata in ems. – ontananza

+0

La cosa bella di questo approccio è che diventa estremamente flessibile, in quanto si può cambiare ** $ (window) .width() **, a qualunque sia il target. – blackhawk

+0

QUESTO È GRANDE. L'ho cercato per un'ora. – salep

0

E 'possibile calcolare, ma em non è un'unità "semplice" come px perché dipende da una selezione dei font (vale a dire, una combinazione di famiglia di caratteri , stile (grassetto, corsivo, ecc.) e dimensione carattere). Ovviamente la dimensione del carattere stesso può essere relativa (ad esempio se si attribuisce un font a , ex o in percentuale, l'altezza calcolata di px per quel tipo di carattere viene ricavata dalle dimensioni dell'elemento principale).

per ottenere la larghezza em di una pagina che si possa fare la conversione in questo modo (attenzione: psuedocodarlo):

// 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

semplice, dal momento che sappiamo 1em = 16px

var window_width_em = 1/16 * window_width_px; 
+14

Supponendo che 1em sia 16 px è erroneamente errato. Le unità em sono relative alla dimensione del font in cascata di un elemento. Aggiunta di css 'html {font-size: 10px; } 'o' html {font-size: 1.5em; } 'risulterebbe in 1em ***! = *** 16px. Più lontano dal controllo degli sviluppatori c'è il fatto che la "dimensione del font standard di 16px" è impostata dall'agente utente e può essere modificata dall'utente a un capriccio ***. –

+15

Questa risposta è ancora sbagliata, non importa quante delle mie risposte hai votato :) –

1

Per chi ne ha bisogno tutto messo insieme, questo codice funziona per me:

<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> 

È pu insieme usando la risposta sopra aggiunta al window-width test code trovato nel tutorial collegato.

11

Ecco una soluzione che non richiede jQuery e non richiede una dichiarazione di dimensione carattere esplicita.

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

+1 - non farà la differenza ma 'html' sarebbe un po '* più corretto * di' body' per em prende il carattere di root dimensioni e questo è html – m02ph3u5

Problemi correlati