Ottieni la larghezza del dispositivo in javascript


128

C'è un modo per ottenere la larghezza del dispositivo dell'utente, invece della larghezza del viewport, usando javascript?

Le query multimediali CSS offrono questo, come posso dire

@media screen and (max-width:640px) {
    /* ... */
}

e

@media screen and (max-device-width:960px) {
    /* ... */
}

Questo è utile se sto mirando agli smartphone con orientamento orizzontale. Ad esempio, su iOS una dichiarazione max-width:640pxriguarderà sia la modalità orizzontale che quella verticale, anche su un iPhone 4. Questo non è il caso di Android, per quanto ne so, quindi l'utilizzo della larghezza del dispositivo in questo caso mira con successo a entrambi gli orientamenti, senza prendere di mira i dispositivi desktop.

Tuttavia , se sto invocando un binding javascript basato sulla larghezza del dispositivo, mi sembra di essere limitato a testare la larghezza del viewport, il che significa un test extra come di seguito,

if ($(window).width() <= 960 && $(window).height <= 640) { /* ... */ }

Questo non mi sembra elegante, dato il suggerimento che la larghezza del dispositivo è disponibile per css.


4
Prova questo sito web per conoscere le dimensioni corrette del tuo dispositivo. responsejs.com/labs/dimensions
Alpesh Darji

Modernizrpuò aiutarti a fare questo "in modo pulito e generico": stackoverflow.com/questions/25935686/… . Per quanto riguarda il primo commento: potresti voler cercare su Google "Modernizr vs <otherLib> media query" per scoprire cosa funziona meglio per il tuo caso d'uso
Adrien Be

Risposte:


215

È possibile ottenere la larghezza dello schermo del dispositivo tramite la proprietà screen.width.
A volte è anche utile usare window.innerWidth (che di solito non si trova sui dispositivi mobili) invece della larghezza dello schermo quando si ha a che fare con browser desktop in cui la dimensione della finestra è spesso inferiore alla dimensione dello schermo del dispositivo.

In genere, quando si tratta di dispositivi mobili E browser desktop, utilizzo quanto segue:

 var width = (window.innerWidth > 0) ? window.innerWidth : screen.width;

5
Ho notato che questo non funziona come previsto sul browser nativo di Android 2.2. Se non sono in scala 1: 1, posso riportare larghezze molto più ampie (larghe quanto la pagina può essere), il che è un po 'frustrante.
Chris Bosco

4
Questo restituisce 980 su Chrome Beta su Android e 1024 sul browser Android su un HTC vivid.
Alex

4
@Alex Queste sono le larghezze di visualizzazione predefinite dei browser. Se utilizzi un metatag viewport con width=device-widthdovresti ottenere il valore effettivo.
Brian Nickel

2
window.innerWidth restituisce 980 su Iphone (Chrome / Safari). Com'è? <meta name = "viewport" content = "width = device-width" /> non ha fatto differenza.
Joao Leme

12
In che modo questo ha così tanti voti positivi? var width = (window.innerWidth > 0) ? window.innerWidth : screen.width;restituisce 667 su iPhone 6 E 6 Plus. Questa soluzione non funziona correttamente.
Ian S

60

Un problema con l'utile risposta di Bryan Rieger è che sui display ad alta densità, i dispositivi Apple riportano screen.width in cali, mentre i dispositivi Android lo segnalano in pixel fisici. (Vedi http://www.quirksmode.org/blog/archives/2012/07/more_about_devi.html .) Suggerisco di utilizzare if (window.matchMedia('(max-device-width: 960px)').matches) {}su browser che supportano matchMedia.


1
Questa sembra una soluzione molto migliore e utilizza effettivamente le query multimediali CSS. Mi chiedo quale sia il supporto del browser per questo su piattaforme mobili?
Carl Zulauf

1
Questo sarebbe l'uso corretto? if (window.matchMedia('(max-device-width: 960px)').matches) { var winW = (window.innerWidth > 0) ? window.innerWidth : screen.width; } else { var winW = screen.width; }
norsewulf

3
Non sono sicuro che funzionerà senza il ridimensionamento impostato su 1: 1 come base ...var isMobile = window.matchMedia && window.matchMedia('(max-device-width: 960px)').matches || screen.width <= 960;
Tracker1

3
Per i browser che non supportano matchMedia()c'è un polyfill: github.com/paulirish/matchMedia.js
AvL

4
Secondo caniuse.com praticamente tutti i browser, compresi i dispositivi mobili, supportano window.matchMedia ()
Mark Langer

14

Ho appena avuto questa idea, quindi forse è miope, ma sembra funzionare bene e potrebbe essere la più coerente tra il tuo CSS e JS.

Nel tuo CSS imposti il ​​valore di larghezza massima per html in base al valore dello schermo @media:

@media screen and (max-width: 480px) and (orientation: portrait){

    html { 
        max-width: 480px;
    }

    ... more styles for max-width 480px screens go here

}

Quindi, usando JS (probabilmente tramite un framework come JQuery), dovresti semplicemente controllare il valore di larghezza massima del tag html:

maxwidth = $('html').css('max-width');

Ora puoi utilizzare questo valore per apportare modifiche condizionali:

If (maxwidth == '480px') { do something }

Se mettere il valore di larghezza massima sul tag html sembra spaventoso, allora forse puoi inserire un tag diverso, uno che viene utilizzato solo per questo scopo. Per il mio scopo il tag html funziona bene e non influisce sul markup.


Utile se stai usando Sass, ecc : per restituire un valore più astratto, come il nome del punto di interruzione, invece del valore px puoi fare qualcosa come:

  1. Creare un elemento che memorizzerà il nome del punto di interruzione, ad es <div id="breakpoint-indicator" />
  2. L'utilizzo di query multimediali CSS modifica la proprietà del contenuto per questo elemento, ad esempio "large" o "mobile", ecc. (Stesso approccio di query multimediale di base come sopra, ma impostando la proprietà 'content' css invece di 'max-width').
  3. Ottieni il valore della proprietà del contenuto CSS utilizzando js o jquery (ad es. Jquery $('#breakpoint-indicator').css('content');), che restituisce "large" o "mobile", ecc. A seconda di ciò su cui è impostata la proprietà del contenuto dalla query multimediale.
  4. Agire sul valore corrente.

Ora puoi agire sugli stessi nomi dei punti di interruzione di sass, ad esempio sass: @include respond-to(xs)e js if ($breakpoint = "xs) {}.

Quello che mi piace particolarmente di questo è che posso definire i miei nomi di breakpoint tutti in CSS e in un unico posto (probabilmente un documento scss di variabili) e il mio js può agire su di essi in modo indipendente.


8

var width = Math.max(window.screen.width, window.innerWidth);

Questo dovrebbe gestire la maggior parte degli scenari.


Math.max (window.innerWidth); ti darà la larghezza, comprese le barre di scorrimento in FireFox, Edge e Chrome. document.documentElement.clientWidth; darà la larghezza all'interno di qualsiasi barra di scorrimento in quei browser. In IE 11, entrambi mostreranno la larghezza comprese le barre di scorrimento ..
RationalRabbit

6

Dovresti usare

document.documentElement.clientWidth

È considerato compatibile con tutti i browser ed è lo stesso metodo utilizzato da jQuery (window) .width (); usi.

Per informazioni dettagliate dai un'occhiata a: https://ryanve.com/lab/dimensions/


5

Penso che l'uso window.devicePixelRatiosia più elegante della window.matchMediasoluzione:

if (window.innerWidth*window.devicePixelRatio <= 960 
    && window.innerHeight*window.devicePixelRatio <= 640) { 
    ... 
}


5

puoi facilmente usare

document.documentElement.clientWidth


3
In generale, le risposte sono molto più utili se includono una spiegazione di ciò che il codice intende fare e perché ciò risolve il problema senza introdurne altri.
Tim Diekmann

3

I telefoni Lumia danno screen.width errato (almeno sull'emulatore). Quindi forse Math.min(window.innerWidth || Infinity, screen.width)funzionerà su tutti i dispositivi?

O qualcosa di più folle:

for (var i = 100; !window.matchMedia('(max-device-width: ' + i + 'px)').matches; i++) {}
var deviceWidth = i;

2

Sì, puoi usare document.documentElement.clientWidth per ottenere la larghezza del dispositivo del client e continuare a tracciare la larghezza del dispositivo impostando setInterval

proprio come

setInterval(function(){
        width = document.documentElement.clientWidth;
        console.log(width);
    }, 1000);

Basta usare onresize. Ad esempio document.getElementsByTagName ("BODY") [0] .onresize = function ()
RationalRabbit

0

Proprio come per tua informazione, c'è una libreria chiamata breakpoints che rileva la larghezza massima impostata nei CSS e ti consente di usarla in condizioni JS if-else usando i segni <=, <,>,> = e ==. L'ho trovato abbastanza utile. La dimensione del payload è inferiore a 3 KB.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.