Apakah ada cara untuk mendapatkan lebar perangkat pengguna, sebagai lawan dari lebar area pandang, menggunakan javascript?
Kueri media CSS menawarkan ini, seperti yang bisa saya katakan
@media screen and (max-width:640px) {
/* ... */
}
dan
@media screen and (max-device-width:960px) {
/* ... */
}
Ini berguna jika saya menargetkan ponsel cerdas dalam orientasi lanskap. Misalnya, di iOS, deklarasi max-width:640px
akan menargetkan mode lanskap dan potret, bahkan pada iPhone 4. Sejauh yang saya tahu, ini tidak terjadi pada Android, jadi menggunakan lebar perangkat dalam hal ini berhasil menargetkan kedua orientasi, tanpa menargetkan perangkat desktop.
Namun , jika saya menjalankan pengikatan javascript berdasarkan lebar perangkat, saya tampaknya dibatasi untuk menguji lebar area pandang, yang berarti tes tambahan seperti berikut ini,
if ($(window).width() <= 960 && $(window).height <= 640) { /* ... */ }
Ini tidak tampak elegan bagi saya, mengingat petunjuk bahwa lebar perangkat tersedia untuk css.
sumber
Modernizr
dapat membantu Anda melakukan ini "dengan cara yang bersih & umum": stackoverflow.com/questions/25935686/… . Mengenai komentar pertama: Anda mungkin ingin google "Modernizr vs <otherLib> media query" untuk mencari tahu apa yang terbaik untuk kasus penggunaan AndaJawaban:
Anda bisa mendapatkan lebar layar perangkat melalui properti screen.width.
Terkadang berguna juga untuk menggunakan window.innerWidth (biasanya tidak ditemukan di perangkat seluler) daripada lebar layar saat berurusan dengan browser desktop di mana ukuran jendela sering kali lebih kecil dari ukuran layar perangkat.
Biasanya, ketika berurusan dengan perangkat seluler DAN browser desktop saya menggunakan yang berikut ini:
sumber
width=device-width
Anda harus mendapatkan nilai sebenarnya.var width = (window.innerWidth > 0) ? window.innerWidth : screen.width;
mengembalikan 667 di iphone 6 DAN 6 Plus. Solusi ini tidak bekerja dengan benar.Satu masalah dengan jawaban berguna Bryan Rieger adalah bahwa pada layar dengan kepadatan tinggi, perangkat Apple melaporkan screen.width dalam penurunan, sementara perangkat Android melaporkannya dalam piksel fisik. (Lihat http://www.quirksmode.org/blog/archives/2012/07/more_about_devi.html .) Saya sarankan menggunakan
if (window.matchMedia('(max-device-width: 960px)').matches) {}
pada browser yang mendukung matchMedia.sumber
if (window.matchMedia('(max-device-width: 960px)').matches) { var winW = (window.innerWidth > 0) ? window.innerWidth : screen.width; } else { var winW = screen.width; }
var isMobile = window.matchMedia && window.matchMedia('(max-device-width: 960px)').matches || screen.width <= 960;
matchMedia()
ada polyfill: github.com/paulirish/matchMedia.jsSaya baru saja mendapat ide ini, jadi mungkin itu picik, tetapi tampaknya berfungsi dengan baik dan mungkin paling konsisten antara CSS dan JS Anda.
Di CSS Anda, Anda menetapkan nilai lebar-maksimal untuk html berdasarkan nilai layar @media:
Kemudian, dengan menggunakan JS (mungkin melalui kerangka kerja seperti JQuery), Anda hanya perlu memeriksa nilai lebar-maksimal dari tag html:
Sekarang Anda dapat menggunakan nilai ini untuk membuat perubahan bersyarat:
Jika menempatkan nilai lebar-maksimal pada tag html tampak menakutkan, maka mungkin Anda dapat menggunakan tag yang berbeda, yang hanya digunakan untuk tujuan ini. Untuk tujuan saya, tag html berfungsi dengan baik dan tidak memengaruhi markup saya.
Berguna jika Anda menggunakan Sass, dll : Untuk mengembalikan nilai yang lebih abstrak, seperti nama breakpoint, daripada nilai px Anda dapat melakukan sesuatu seperti:
<div id="breakpoint-indicator" />
$('#breakpoint-indicator').css('content');
), yang mengembalikan "besar", atau "seluler", dll. Bergantung pada properti konten apa yang disetel oleh kueri media.Sekarang Anda dapat bertindak pada nama breakpoint yang sama seperti yang Anda lakukan di sass, misalnya sass:,
@include respond-to(xs)
dan jsif ($breakpoint = "xs) {}
.Yang paling saya sukai dari hal ini adalah saya dapat menentukan nama breakpoint saya semua di css dan di satu tempat (kemungkinan besar dokumen scss variabel) dan js saya dapat menindaklanjutinya secara independen.
sumber
var width = Math.max(window.screen.width, window.innerWidth);
Ini harus menangani sebagian besar skenario.
sumber
Kamu harus menggunakan
Ini dianggap sebagai kompatibilitas lintas browser, dan merupakan metode yang sama dengan jQuery (window) .width (); penggunaan.
Untuk informasi rinci, lihat: https://ryanve.com/lab/dimensions/
sumber
Saya pikir menggunakan
window.devicePixelRatio
lebih elegan daripadawindow.matchMedia
solusi:sumber
Periksa
https://developer.mozilla.org/en-US/docs/Web/API/Window/matchMedia
sumber
Anda dapat dengan mudah menggunakan
document.documentElement.clientWidth
sumber
Ponsel Lumia memberikan screen.width yang salah (setidaknya pada emulator). Jadi mungkin
Math.min(window.innerWidth || Infinity, screen.width)
akan berfungsi di semua perangkat?Atau sesuatu yang lebih gila:
sumber
Ya mybe, Anda dapat menggunakan document.documentElement.clientWidth untuk mendapatkan lebar perangkat klien dan terus melacak lebar perangkat dengan memakai setInterval
seperti
sumber
Sama seperti FYI, ada pustaka yang disebut breakpoints yang mendeteksi lebar-maksimal sebagaimana diatur dalam CSS dan memungkinkan Anda untuk menggunakannya dalam kondisi JS if-else menggunakan tanda <=, <,>,> = dan ==. Saya merasa cukup berguna. Ukuran muatan di bawah 3 KB.
sumber