Як отримати ширину браузера за допомогою коду JavaScript?


180

Я намагаюся написати функцію JavaScript, щоб отримати поточну ширину браузера.

Я знайшов це:

javascript:alert(document.body.offsetWidth);

Але його проблема в тому, що він не вдається, якщо тіло має ширину на 100%.

Чи є якась інша краща функція чи вирішення?

Відповіді:


133

Оновлення за 2017 рік

Моя оригінальна відповідь була написана в 2009 році. Хоча вона все ще працює, я хотів би оновити її на 2017 рік. Веб-браузери все ще можуть вести себе по-різному. Я довіряю команді jQuery зробити велику роботу з підтримання узгодженості між браузером. Однак включати всю бібліотеку не обов’язково. У джерелі jQuery відповідна частина знаходиться у рядку 37 розмірів.js . Тут він видобутий і модифікований для роботи окремо:

function getWidth() {
  return Math.max(
    document.body.scrollWidth,
    document.documentElement.scrollWidth,
    document.body.offsetWidth,
    document.documentElement.offsetWidth,
    document.documentElement.clientWidth
  );
}

function getHeight() {
  return Math.max(
    document.body.scrollHeight,
    document.documentElement.scrollHeight,
    document.body.offsetHeight,
    document.documentElement.offsetHeight,
    document.documentElement.clientHeight
  );
}

console.log('Width:  ' +  getWidth() );
console.log('Height: ' + getHeight() );


Оригінальний відповідь

Оскільки всі веб-переглядачі ведуть себе по-різному, вам потрібно спочатку перевірити значення, а потім скористатися правильним. Ось функція, яка робить це для вас:

function getWidth() {
  if (self.innerWidth) {
    return self.innerWidth;
  }

  if (document.documentElement && document.documentElement.clientWidth) {
    return document.documentElement.clientWidth;
  }

  if (document.body) {
    return document.body.clientWidth;
  }
}

і аналогічно по висоті:

function getHeight() {
  if (self.innerHeight) {
    return self.innerHeight;
  }

  if (document.documentElement && document.documentElement.clientHeight) {
    return document.documentElement.clientHeight;
  }

  if (document.body) {
    return document.body.clientHeight;
  }
}

Зателефонуйте в обох сценаріях за допомогою getWidth()або getHeight(). Якщо жодна з власних властивостей браузера не визначена, вона повернеться undefined.


11
Найкраща відповідь, тому що я не повинен включати бібліотеку в 33 к для простого переспрямування на основі ширини вікна браузера
Девід Агірре,

1
Це дає правильні (або очікувані) результати послідовно порівняно з реалізацією jQuery.
Еммануель Джон

3
... кожне з цих трьох показує певний результат, і всі результати (ширини) різні. Наприклад , з Google Chrome см self.innerWidth 423, document.documentElement.clientWidth 326і document.body.clientWidth 406. У такому випадку питання: що правильно і що використовувати? Наприклад, я хочу змінити розмір карти Google. 326 або 423 велика різниця. Якщо ширина ~ 700, то див. 759, 735, 742 (не така велика різниця)
Андріс

1
@ user2118559 var pageWidth = Math.max(self.innerWidth || 0, document.documentElement.clientWidth || 0, document.body.clientWidth || 0);і var windowWidth = self.innerWidth || -1;// через "body" або "screen" або "document" не є "вікном", якщо ви перевіряєте переповнений вміст html, який ви можете зрозуміти. # i.stack.imgur.com/6xPdH.png
Абдулла Айдін

1
помилка копіювання та вставки у вашому прикладі, getWidth()посилання на функціїself.innerHeight
theGecko

309

Це біль у попі . Я рекомендую пропустити дурниці та використовувати jQuery , що дозволяє вам просто робити $(window).width().


2
Якщо я правильно згадував, jQuery втягнув більшу частину розмірів у ядро. Вам ще потрібні розміри, щоб виконати те, що ви пропонуєте?
Носредна

Виявляється, ти цього не робиш. Що є дивним. Відредагована відповідь на Дякую за голову.
хаос

6
Підтримка $ (window) .width () в jQuery починається з версії 1.2, якщо вона стосується когось.
хаос

18
Я виявив, що $ (window) .width () не завжди повертає те саме значення, що і InternalWidth / clientWidth, як показано у наведених нижче прикладах. Версія jQuery не враховує смуги прокрутки браузера (так чи інакше у FF). Це викликало у мене велику плутанину із запитами CSS @media, які з'являються для запуску на неправильній ширині. Використання нативного коду здається більш надійним, оскільки враховує зовнішній вигляд смуг прокрутки.
Кодер

5
Додавання рядків коду 30k для отримання ширини вікна - це рішення BAD!
codechimp

49
var w = window.innerWidth;
var h = window.innerHeight;
var ow = window.outerWidth; //including toolbars and status bar etc.
var oh = window.outerHeight;

Обидва повертають цілі числа і не потребують jQuery. Сумісний веб-браузер.

Я часто знаходжу jQuery повертає недійсні значення для ширини () та висоти ()


1
Проблеми з використанням цього на iphone Safari.
nu everest

17

Чому ніхто не згадує matchMedia?

if (window.matchMedia("(min-width: 400px)").matches) {
  /* the viewport is at least 400 pixels wide */
} else {
  /* the viewport is less than 400 pixels wide */
}

Не тестував стільки, але протестував із браузерами Android за замовчуванням та андроїд-хромом, настільним хромом, поки що схоже, що це працює добре.

Звичайно, воно не повертає числового значення, але повертає булеве - якщо збігається чи ні, то може не точно відповідати питанню, але це те, що ми хочемо в будь-якому випадку і, мабуть, хоче автор питання.


1
Підтримує лише IE10 +.
qarthandso

17
Якщо вони використовують IE9 або старіші, вони не заслуговують на Інтернет.
Дарій.V

Схоже, ifari Safari цього не підтримує.
nu everest

Новіші версії if Safari повинні підтримувати matchMedia. Джерело: caniuse.com/#feat=matchmedia
Vargr

8

Від W3schools та його перехресного браузера назад до темних віків IE!

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
var w = window.innerWidth
|| document.documentElement.clientWidth
|| document.body.clientWidth;

var h = window.innerHeight
|| document.documentElement.clientHeight
|| document.body.clientHeight;

var x = document.getElementById("demo");
x.innerHTML = "Browser inner window width: " + w + ", height: " + h + ".";

alert("Browser inner window width: " + w + ", height: " + h + ".");

</script>

</body>
</html>

Підхід працює прекрасно і може бути прийнятою відповіддю, оскільки він набагато коротший, ніж будь-яке інше рішення (крім використання jQuery).
Саймон Штейнбергер

2
Чи не призведе до помилки, якщо document.documentElement не визначено?
PhiLho

6

Ось коротша версія функції, представлена ​​вище:

function getWidth() {
    if (self.innerWidth) {
       return self.innerWidth;
    }
    else if (document.documentElement && document.documentElement.clientHeight){
        return document.documentElement.clientWidth;
    }
    else if (document.body) {
        return document.body.clientWidth;
    }
    return 0;
}

4
Що не може повернути значення, якщо всі умови помилкові.
Майк C

10
Вам не потрібні ельзи :)
Нік

0

Адаптоване рішення до відповіді сучасного Дж. Травіса:

const getPageWidth = () => {
  const bodyMax = document.body
    ? Math.max(document.body.scrollWidth, document.body.offsetWidth)
    : 0;

  const docElementMax = document.documentElement
    ? Math.max(
        document.documentElement.scrollWidth,
        document.documentElement.offsetWidth,
        document.documentElement.clientWidth
      )
    : 0;

  return Math.max(bodyMax, docElementMax);
};

0

Важливе доповнення до відповіді Тревіса; вам потрібно поставити getWidth () в тіло документа, щоб переконатися, що ширина смуги прокрутки підраховується, інакше ширина смуги прокрутки браузера віднімається від getWidth (). Що я зробив ;

<body>
<script>
function getWidth(){
return Math.max(document.body.scrollWidth,
document.documentElement.scrollWidth,
document.body.offsetWidth,
document.documentElement.offsetWidth,
document.documentElement.clientWidth);
}
var aWidth=getWidth();
</script>
</body>

і викликати змінну aWidth в будь-якому місці після цього.

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