Отримайте ширину пристрою в JavaScript


128

Чи є спосіб отримати ширину пристрою користувачів на відміну від ширини перегляду за допомогою javascript?

Медіа-запити CSS пропонують це, як я можу сказати

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

і

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

Це корисно, якщо я орієнтуюсь на смартфони в ландшафтній орієнтації. Наприклад, на iOS декларація max-width:640pxнацілятиметься як на пейзажний, так і на портретний режими, навіть на iPhone 4. Це не так, як для Android, наскільки я можу сказати, тому використання ширини пристрою в цьому випадку успішно націлює обидві орієнтації, без націлювання на настільні пристрої.

Однак якщо я посилаюсь на прив'язку JavaScript на основі ширини пристрою, я, здається, обмежуюся тестуванням ширини вікна перегляду, що означає додатковий тест, як у наступному,

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

Мені це не здається елегантним, враховуючи натяк, що ширина пристрою доступна для css.


4
Спробуйте на цьому веб-сайті знати правильні розміри вашого пристрою. responsejs.com/labs/dimensions
Альпеш Дарджі

Modernizrможе допомогти вам зробити це «чистий і загальний шлях»: stackoverflow.com/questions/25935686 / ... . Щодо першого коментаря: ви можете перейти в Google "Modernizr vs <otherLib> медіа-запит", щоб дізнатися, що найкраще підходить для вашого випадку використання
Adrien Be

Відповіді:


215

Ви можете отримати ширину екрана пристрою через властивість screen.width.
Іноді також корисно використовувати window.innerWidth (зазвичай не зустрічається на мобільних пристроях) замість ширини екрана при роботі з браузерами настільних пристроїв, де розмір вікна часто менше, ніж розмір екрана пристрою.

Зазвичай під час роботи з мобільними пристроями та наглядачами для настільних комп'ютерів я використовую наступне:

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

5
Я помітив, що це не працює, як очікувалося, у нашому веб-переглядачі Android 2.2. Якщо я не за шкалою 1: 1, він може повідомити про набагато ширші ширини (наскільки це може бути сторінка), що трохи засмучує.
Кріс Боско

4
Це повертає 980 у Chrome Beta на Android та 1024 у Android Browser на HTC vivid.
Олексій

4
@Alex Це ширини вікна перегляду за замовчуванням у веб-переглядачах. Якщо ви використовуєте метатег вікна перегляду, width=device-widthви повинні отримати фактичне значення.
Брайан Нікель

2
window.innerWidth повертає 980 на Iphone (Chrome / Safari). Як у тому, що? <meta name = "viewport" content = "width = device-width" /> не змінилося.
Жоао Леме

12
Як це має стільки результатів? var width = (window.innerWidth > 0) ? window.innerWidth : screen.width;повертає 667 на iphone 6 AND 6 Plus. Це рішення працює неправильно.
Ян S

60

Одне питання корисної відповіді Брайана Рігера полягає в тому, що на дисплеях з високою щільністю пристрої Apple повідомляють про ширину екрана в крапках, а пристрої Android повідомляють про це у фізичних пікселях. (Див. Http://www.quirksmode.org/blog/archives/2012/07/more_about_devi.html .) Я пропоную використовувати if (window.matchMedia('(max-device-width: 960px)').matches) {}в браузерах, що підтримують matchMedia.


1
Це здається набагато кращим рішенням і фактично використовує запити медіа CSS. Цікаво, що підтримує браузер для цього на мобільних платформах?
Карл Зулауф

1
Це буде правильне використання? if (window.matchMedia('(max-device-width: 960px)').matches) { var winW = (window.innerWidth > 0) ? window.innerWidth : screen.width; } else { var winW = screen.width; }
norsewulf

3
Я не впевнений, чи вдасться це зробити без масштабування, встановленого на базу 1: 1 ...var isMobile = window.matchMedia && window.matchMedia('(max-device-width: 960px)').matches || screen.width <= 960;
Tracker1

3
Для веб-переглядачів, які не підтримують, matchMedia()існує поліфайл
AvL

4
За даними caniuse.com практично всі браузери, включаючи мобільний, підтримують window.matchMedia ()
Марк Лангер

14

У мене щойно була така ідея, тому, можливо, вона короткозора, але вона, здається, працює добре і може бути найбільш узгодженою між вашим CSS та JS.

У своєму CSS ви встановлюєте значення максимальної ширини для html на основі екранного значення @media:

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

    html { 
        max-width: 480px;
    }

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

}

Тоді, використовуючи JS (можливо, через таку структуру, як JQuery), ви просто перевірите значення максимальної ширини тега html:

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

Тепер ви можете використовувати це значення для внесення змін до умов:

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

Якщо розміщення значення максимальної ширини на тезі html здається страшним, то, можливо, ви можете поставити інший тег, який використовується лише для цієї мети. Для моєї мети тег HTML працює чудово і не впливає на мою розмітку.


Корисно, якщо ви використовуєте Sass тощо : Щоб повернути більш абстрактне значення, наприклад, ім'я точки перелому, замість значення px, ви можете зробити щось на кшталт:

  1. Створіть елемент, який буде зберігати ім'я точки розриву, наприклад <div id="breakpoint-indicator" />
  2. Використовуючи мультимедійні запити css, змініть властивість вмісту цього елемента, наприклад, "великий" або "мобільний" тощо (той самий базовий підхід до запиту медіа, як і вище, але встановіть властивість css 'content' замість "max-width").
  3. Отримайте значення властивості вмісту css, використовуючи js або jquery (наприклад, jquery $('#breakpoint-indicator').css('content');), який повертає "великий" або "мобільний" тощо, залежно від того, яке властивість вмісту встановлено медіа-запитом.
  4. Дійте на поточну величину.

Тепер ви можете діяти з тими самими іменами точки перерви, що і у sass, наприклад, sass: @include respond-to(xs)і js if ($breakpoint = "xs) {}.

Що мені особливо подобається в цьому, це те, що я можу визначити свої імена точки переривання всі в css і в одному місці (швидше за все, scss документ), і мій js може діяти на них незалежно.


8

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

Це має справлятися з більшістю сценаріїв.


Math.max (window.innerWidth); дасть вам ширину, включаючи смуги прокрутки в FireFox, Edge та Chrome. document.documentElement.clientWidth; дасть ширину всередині смуг прокрутки в цих браузерах. У IE 11 обидва покажуть ширину, включаючи смуги прокрутки ..
RationalRabbit

6

Ви повинні використовувати

document.documentElement.clientWidth

Це розглядається як сумісність між браузерами і є тим самим методом, що й jQuery (window) .width (); використовує.

Детальну інформацію можна переглянути: https://ryanve.com/lab/dimensions/


5

Я думаю, що використання window.devicePixelRatioє більш елегантним, ніж window.matchMediaрішення:

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


5

ви можете легко використовувати

document.documentElement.clientWidth


3
Як правило, відповіді набагато корисніші, якщо вони включають пояснення того, що призначений для виконання коду та чому це вирішує проблему, не вводячи інших.
Тім Дікманн

3

Телефони Lumia дають неправильну ширину екрана (принаймні, на емуляторі). То, можливо, Math.min(window.innerWidth || Infinity, screen.width)буде працювати на всіх пристроях?

Або щось божевільніше:

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

2

Ya mybe u можна використовувати document.documentElement.clientWidth, щоб отримати клієнтську ширину пристрою і продовжувати відстежувати ширину пристрою, надівши на setInterval

так як

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

Просто використовуйте onresize. Наприклад document.getElementsByTagName ("BODY") [0] .onresize = function ()
RationalRabbit

0

Як і FYI, існує бібліотека під назвою точки прориву, яка визначає максимальну ширину, встановлену в CSS, і дозволяє використовувати її в JS, якщо в інших умовах використовуючи знаки <=, <,>,> = і ==. Я вважав це досить корисним. Розмір корисної навантаження становить менше 3 Кб.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.