2013-05-05 13 views

risposta

7
window.devicePixelRatio = window.devicePixelRatio || 
Math.round(window.screen.availWidth/document.documentElement.clientWidth) 

preso da http://blogs.windows.com/windows_phone/b/wpdev/archive/2012/11/08/internet-explorer-10-brings-html5-to-windows-phone-8-in-a-big-way.aspx

+1

Questo fallback sembra ** errato ** perché 'availWith' e' clientWidth' sono entrambi in [dip] (http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html) e perché 'clientWidth' è un valore dinamico. L'unità CSS per 'dispositivoPixelRatio' è [dppx] (http://www.w3.org/TR/css3-values/#dppx). – ryanve

+3

'devicePixelRatio' potrebbe essere un valore frazionario, quindi' Math.round' è fuori luogo, ma qualunque sia. Basta non usare il fallback se non sei sicuro che la finestra sia ingrandita (il che significa su tutti i client desktop). Inoltre, 'document.documentElement.clientWidth' non include la larghezza della barra di scorrimento sui browser desktop. – MaxArt

+0

@MaxArt, modifica la mia risposta se sei sicuro. – user960567

17

Per un ripiego IE, sia desktop e mobile, l'uso:

window.devicePixelRatio = window.devicePixelRatio || 
          window.screen.deviceXDPI/window.screen.logicalXDPI; 
+2

Questa dovrebbe essere la risposta corretta .. è azzeccata. – tremor

+1

ecco il riferimento ufficiale: https://msdn.microsoft.com/en-us/library/dn255104(v=vs.85).aspx – user3526

3

ho scoperto che su un Nokia Lumia 1230 la proprietà window.devicePixelRatio restituisce 1 ancora se il valore è chiaramente errato. Test per window.screen.deviceXDPI/window.screen.logicalXDPI restituisce 1.52083333. Quindi usare window.devicePixelRatio non è una buona idea.

vorrei suggerire quanto segue:

function getDevicePixelRatio(){ 
    var pixelRatio = 1; // just for safety 
    if('deviceXDPI' in screen){ // IE mobile or IE 
     pixelRatio = screen.deviceXDPI/screen.logicalXDPI; 
    } else if (window.hasOwnProperty('devicePixelRatio')){ // other devices 
     pixelRatio = window.devicePixelRatio; 
    } 
    return pixelRatio ; 
} 

Per qualche motivo, utilizzando il modo migliore per verificare la presenza del deviceXDPI nell'oggetto schermo:

if(screen.hasOwnProperty('deviceXDPI')) {// IE mobile or IE 

non funziona su questo Telefono.

2

In realtà nessuna delle risposte precedenti è corretta. Tutte le prove qui di seguito sono state effettuate su Lumia 520 telefoni con uno schermo LCD di 480 * 800:

WP8/IE Mobile 10:

  • window.devicePixelRatio = undefined
  • window.inner/outerWidth/Height = 320 * 485
  • schermo. [invano] larghezza/altezza = 330 * 549
  • document.body.clientWidth/Height = 320 * 486
  • screen.device/logicalXDPI = 140/96 = 1,45,833 mila ..

previsto devicePixelRatio è 480/320 = 1,5 che può essere calcolato da:

Math.round(screen.availWidth * screen.deviceXDPI/screen.logicalXDPI/4) * 4/document.body.clientWidth 

(è necessaria L'arrotondamento per ottenere una dimensione dello schermo LCD valido)

WP8.1/IE cellulare 11:

  • window.devicePixelRatio = 1,42,177 mila ...
  • window.outerWidth/Height = 338 * 512
  • window.innerWidth/Height = 320 * 485
  • schermo. [Invano] larghezza/altezza = 338 * 563
  • document.body.clientWidth/Height = 320 * 486
  • screen.device/logicalXDPI = 136/96 = 1,4166 ..

prevista devicePixelRatio è (ancora una volta) 480/320 = 1.5 che può essere calcolato da:

Math.round(screen.availWidth * window.devicePixelRatio/4) * 4/document.body.clientWidth 

Quindi, anche se window.devicePixelRatio è presente, vi darà il rapporto tra DOM dimensioni dello schermo e le dimensioni dello schermo a cristalli liquidi, tuttavia, la dimensione dello schermo DOM è più grande della finestra disponibile dimensione. Se vuoi conoscere l'esatto rapporto tra pixel CSS e pixel del dispositivo, devi fare i calcoli qui sopra. Inoltre, questi calcoli sono validi in modalità verticale. In modalità orizzontale usa invece screen.availHeight (le dimensioni della schermata DOM non cambiano in base al cambio di orientamento su IE Mobile).