Cihaz genişliğini javascript olarak alın


129

Görüntü alanı genişliğinin aksine, javascript kullanarak kullanıcıların cihaz genişliğini almanın bir yolu var mı?

CSS medya sorguları, söyleyebileceğim gibi bunu sunuyor

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

ve

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

Akıllı telefonları yatay yönde hedefliyorsam bu kullanışlıdır. Örneğin, iOS'ta max-width:640pxbir iPhone 4'te bile hem yatay hem de dikey modları hedefleyeceğine dair bir bildirim. Anladığım kadarıyla Android için durum böyle değil, bu nedenle bu örnekte cihaz genişliğinin kullanılması her iki yönü de başarıyla hedefliyor. masaüstü cihazları hedeflemeden.

Bununla birlikte , cihaz genişliğine dayalı bir javascript bağını çalıştırıyorsam, görüntü alanı genişliğini test etmekle sınırlı görünüyorum, bu da aşağıdaki gibi ekstra bir test anlamına gelir,

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

Cihaz genişliğinin css için mevcut olduğu ipucu göz önüne alındığında, bu bana şık görünmüyor.


4
Cihazınızın doğru boyutlarını öğrenmek için bu web sitesini deneyin. responsejs.com/labs/dimensions
Alpesh Darji

Modernizrbunu "temiz ve genel yolla" yapmanıza yardımcı olabilir: stackoverflow.com/questions/25935686/… . 1. yorumla ilgili olarak: Kullanım alanınız için en iyi olanı bulmak için "Modernizr vs <otherLib> medya sorgusu" google'ını isteyebilirsiniz
Adrien Be

Yanıtlar:


214

Cihazın ekran genişliğini screen.width özelliği üzerinden alabilirsiniz.
Bazen pencere boyutunun genellikle cihazın ekran boyutundan daha küçük olduğu masaüstü tarayıcılarla uğraşırken ekran genişliği yerine window.innerWidth (genellikle mobil cihazlarda bulunmaz) kullanmak da yararlıdır.

Tipik olarak, mobil cihazlar VE masaüstü tarayıcılarla uğraşırken aşağıdakileri kullanıyorum:

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

5
Bunun Android 2.2 yerel tarayıcısında beklendiği gibi çalışmadığını fark ettim. 1: 1 ölçeğinde değilsem, biraz sinir bozucu olan çok daha geniş genişlikleri (sayfa olabildiğince geniş) bildirebilir.
Chris Bosco

4
Bu, Android'de Chrome Beta'da 980 ve HTC vivid'de Android Tarayıcıda 1024'ü döndürür.
Alex

4
@Alex Bunlar, tarayıcıların varsayılan görüntü alanı genişlikleridir. Bir görüntü alanı meta etiketi kullanıyorsanız width=device-width, gerçek değeri almalısınız.
Brian Nickel

2
window.innerWidth, Iphone'da (Chrome / Safari) 980 döndürüyor. Bu nasıl? <meta name = "viewport" content = "width = device-width" /> hiçbir fark yaratmadı.
Joao Leme

13
Bunun nasıl bu kadar çok olumlu oyu var? var width = (window.innerWidth > 0) ? window.innerWidth : screen.width;iphone 6 VE 6 Plus'ta 667 döndürür. Bu çözüm doğru çalışmıyor.
Ian S

60

Bryan Rieger'ın faydalı cevabıyla ilgili bir sorun, yüksek yoğunluklu ekranlarda Apple cihazlarının ekran genişliğini düşüş olarak bildirirken, Android cihazların bunu fiziksel piksel olarak bildirmesidir. (Bkz. Http://www.quirksmode.org/blog/archives/2012/07/more_about_devi.html .) if (window.matchMedia('(max-device-width: 960px)').matches) {}MatchMedia'yı destekleyen tarayıcılarda kullanmanızı öneririm.


1
Bu çok daha iyi bir çözüm gibi görünüyor ve aslında CSS medya sorgularını kullanıyor. Mobil platformlarda bunun için tarayıcı desteğinin ne olduğunu merak ediyorum.
Carl Zulauf

1
Bu doğru kullanım mı? if (window.matchMedia('(max-device-width: 960px)').matches) { var winW = (window.innerWidth > 0) ? window.innerWidth : screen.width; } else { var winW = screen.width; }
norsewulf

3
Temel olarak ölçeklendirme 1: 1 olarak ayarlanmadan bunun işe var isMobile = window.matchMedia && window.matchMedia('(max-device-width: 960px)').matches || screen.width <= 960;
yarayıp

3
Desteklemeyen Tarayıcılar matchMedia()için bir çoklu doldurma
AvL

4
Caniuse.com'a göre , mobil de dahil olmak üzere neredeyse tüm tarayıcılar window.matchMedia () 'yı destekler
Mark Langer

14

Aklıma yeni bir fikir geldi, belki de ileriyi göremiyordur, ama iyi çalışıyor gibi görünüyor ve CSS ile JS'niz arasında en tutarlı olanı olabilir.

CSS'nizde html için maksimum genişlik değerini @media ekran değerine göre ayarlarsınız:

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

    html { 
        max-width: 480px;
    }

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

}

Ardından, JS kullanarak (muhtemelen JQuery gibi bir çerçeve aracılığıyla), sadece html etiketinin maksimum genişlik değerini kontrol edersiniz:

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

Şimdi bu değeri koşullu değişiklikler yapmak için kullanabilirsiniz:

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

Max-width değerini html etiketine koymak korkutucu görünüyorsa, o zaman belki sadece bu amaç için kullanılan farklı bir etiket koyabilirsiniz. Amacım için html etiketi iyi çalışıyor ve işaretlememi etkilemiyor.


Sass, vb. Kullanıyorsanız kullanışlıdır : px değeri yerine kesme noktası adı gibi daha soyut bir değer döndürmek için aşağıdaki gibi bir şey yapabilirsiniz:

  1. Kesme noktası adını depolayacak bir öğe oluşturun, örn. <div id="breakpoint-indicator" />
  2. Css medya sorgularını kullanmak, bu öğenin içerik özelliğini değiştirir, örneğin "büyük" veya "mobil", vb. (Yukarıdakiyle aynı temel medya sorgusu yaklaşımı, ancak "maksimum genişlik" yerine css "içerik" özelliğini ayarlama).
  3. $('#breakpoint-indicator').css('content');Medya sorgusu tarafından içerik özelliğinin neye ayarlandığına bağlı olarak "büyük" veya "mobil" vb. Döndüren js veya jquery (jquery örneğin ) kullanarak css içerik özelliği değerini alın .
  4. Mevcut değere göre hareket edin.

Artık sass'ta yaptığınız gibi aynı kesme noktası adlarında hareket edebilirsiniz, örneğin sass: @include respond-to(xs)ve js if ($breakpoint = "xs) {}.

Bu konuda özellikle sevdiğim şey, kesme noktası isimlerimin tümünü css'de ve tek bir yerde (muhtemelen bir değişkenler scss belgesi) tanımlayabilmem ve js'imin bağımsız olarak hareket edebilmesidir.


8

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

Bu çoğu senaryoyu ele almalıdır.


Math.max (window.innerWidth); FireFox, Edge ve Chrome'daki kaydırma çubukları dahil olmak üzere size genişliği verecektir. document.documentElement.clientWidth; bu tarayıcılardaki herhangi bir kaydırma çubuğunun içindeki genişliği verir. IE 11'de, her ikisi de kaydırma çubukları dahil genişliği gösterecek ..
RationalRabbit

7

Kullanmalısın

document.documentElement.clientWidth

Tarayıcılar arası uyumluluk olarak kabul edilir ve jQuery (window) .width () ile aynı yöntemdir; kullanımları.

Ayrıntılı bilgi için şu adrese göz atın: https://ryanve.com/lab/dimensions/


5

Bence kullanmanın çözümden window.devicePixelRatiodaha zarif olduğunu düşünüyorum window.matchMedia:

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


5

kolayca kullanabilirsin

document.documentElement.clientWidth


3
Genel olarak, kodun ne yapması amaçlandığına ve başkalarını tanıtmadan sorunun neden çözüldüğüne dair bir açıklama içeriyorsa cevaplar çok daha yararlıdır.
Tim Diekmann

3

Lumia telefonları yanlış ekran genişliği veriyor (en azından emülatörde). Yani belki Math.min(window.innerWidth || Infinity, screen.width)tüm cihazlarda çalışacak mı?

Veya daha çılgın bir şey:

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

2

Ya mybe you can be document.documentElement.clientWidth to get the device width of client and keep on the device width by put on setInterval

aynen

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

Sadece onresize kullanın. Örneğin document.getElementsByTagName ("BODY") [0] .onresize = function ()
RationalRabbit

0

Bilginize olduğu gibi, CSS'de ayarlandığı şekliyle maksimum genişliği algılayan ve <=, <,>,> = ve == işaretlerini kullanarak JS if-else koşullarında kullanmanıza izin veren kesme noktaları adlı bir kitaplık vardır . Oldukça faydalı buldum. Yük boyutu 3 KB'nin altında.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.