Як отримати фактичну ширину та висоту елемента HTML?


892

Припустимо, у мене є <div>те, що я хочу зосередити на дисплеї браузера (вікно перегляду). Для цього мені потрібно обчислити ширину і висоту <div>елемента.

Що я повинен використовувати? Будь ласка, включіть інформацію про сумісність браузера.


9
Майте на увазі, що отримання висоти елемента за допомогою будь-якого методу завжди впливає на ефективність, оскільки змушує браузер перерахувати положення всіх елементів на сторінці (переглядати). Тому уникайте цього робити занадто багато. Ознайомтесь із цим списком, які речі викликають поповнення.
Марсело Лазароні

Відповіді:


1285

Вам слід використовувати властивості .offsetWidthта .offsetHeightвластивості. Зверніть увагу, що вони належать до елемента, а не .style.

var width = document.getElementById('foo').offsetWidth;

Функція.getBoundingClientRect() повертає розміри та розташування елемента у вигляді чисел з плаваючою комою після виконання CSS перетворень.

> console.log(document.getElementById('id').getBoundingClientRect())
DOMRect {
    bottom: 177,
    height: 54.7,
    left: 278.5,​
    right: 909.5,
    top: 122.3,
    width: 631,
    x: 278.5,
    y: 122.3,
}

174
Остерігайся! offsetHeight / offsetWidth може повернути 0, якщо ви нещодавно змінили елемент DOM для елемента. Можливо, вам доведеться викликати цей код у виклику setTimeout після того, як ви змінили елемент.
Дан Фабуліч

37
Документація про .offsetWidthта .offsetHeight: developer.mozilla.org/uk/Determining_the_dimensions_of_elements
Denilson Sá Maia

30
За яких обставин вона повертає 0?
Гепард

46
@JDandChips: offsetWidthбуде 0, якщо елемент є display:none, тоді як обчислені widthв цьому випадку можуть мати додатне значення. visibility:hiddenне впливає на offsetWidth.
MrWhite

20
@Supuhstar обидва мають різні значення. offsetWidthповертає "ціле" вікно, включаючи вміст, підкладку та рамки; при цьому clientWidthповертає розмір вікна вмісту поодинці (тому він матиме менше значення кожного разу, коли елемент має будь-яке ненульове заміщення та / або межу). (мод відредагований для наочності)
Едурн Паскуаль

200

Погляньте Element.getBoundingClientRect().

Цей метод повертає об'єкт , що містить width, heightі деякі інші корисні значення:

{
    width: 960,
    height: 71,
    top: 603,
    bottom: 674,
    left: 360,
    right: 1320
}

Наприклад:

var element = document.getElementById('foo');
var positionInfo = element.getBoundingClientRect();
var height = positionInfo.height;
var width = positionInfo.width;

Я вважаю , що це не має проблем , що .offsetWidthі .offsetHeightробити , де вони іноді повертаються 0(як описано в коментарі тут )

Ще одна відмінність полягає в тому, що getBoundingClientRect()можна повернути дробові пікселі, де .offsetWidthі .offsetHeightбуде округлюватися до найближчого цілого числа.

Примітка IE8 : getBoundingClientRectне повертає висоту та ширину на IE8 та нижче. *

Якщо ви повинні підтримувати IE8, використовуйте .offsetWidthта .offsetHeight:

var height = element.offsetHeight;
var width = element.offsetWidth;

Варто зазначити, що Об'єкт, повернутий цим методом, насправді не є нормальним об'єктом. Його властивості не перелічуються (так, наприклад, Object.keysце не працює нестандартно).

Більше інформації про це тут: Як найкраще перетворити ClientRect / DomRect в звичайний Об'єкт

Довідка:


8
getboundingClientRect () поверне фактичну ширину та висоту елементів, масштабованих за допомогою css, тоді як offsetHeightі offsetWidthні.
Лука

66

ПРИМІТКА . Ця відповідь була написана в 2008 році. У той час найкращим крос-браузерним рішенням для більшості людей було дійсно використання jQuery. Тут я залишаю відповідь для нащадків, і якщо ви використовуєте jQuery, це хороший спосіб зробити це. Якщо ви використовуєте інший фреймворк чи чистий JavaScript, прийнята відповідь, ймовірно, шлях.

Станом на JQuery 1.2.6 ви можете використовувати один з основних функцій CSS , heightі width(або outerHeightі outerWidth, в залежності від обставин).

var height = $("#myDiv").height();
var width = $("#myDiv").width();

var docHeight = $(document).height();
var docWidth = $(document).width();

45

На всякий випадок, коли це комусь корисно, я кладу текстове поле, кнопку та ділю все з тим самим css:

width:200px;
height:20px;
border:solid 1px #000;
padding:2px;

<input id="t" type="text" />
<input id="b" type="button" />
<div   id="d"></div>

Я спробував це в chrome, firefox і ie-edge, я намагався з jquery і без, і я спробував це з і без box-sizing:border-box. Завжди з<!DOCTYPE html>

Результати:

                                                               Firefox       Chrome        IE-Edge    
                                                              with   w/o    with   w/o    with   w/o     box-sizing

$("#t").width()                                               194    200    194    200    194    200
$("#b").width()                                               194    194    194    194    194    194
$("#d").width()                                               194    200    194    200    194    200

$("#t").outerWidth()                                          200    206    200    206    200    206
$("#b").outerWidth()                                          200    200    200    200    200    200
$("#d").outerWidth()                                          200    206    200    206    200    206

$("#t").innerWidth()                                          198    204    198    204    198    204
$("#b").innerWidth()                                          198    198    198    198    198    198
$("#d").innerWidth()                                          198    204    198    204    198    204

$("#t").css('width')                                          200px  200px  200px  200px  200px  200px
$("#b").css('width')                                          200px  200px  200px  200px  200px  200px
$("#d").css('width')                                          200px  200px  200px  200px  200px  200px

$("#t").css('border-left-width')                              1px    1px    1px    1px    1px    1px
$("#b").css('border-left-width')                              1px    1px    1px    1px    1px    1px
$("#d").css('border-left-width')                              1px    1px    1px    1px    1px    1px

$("#t").css('padding-left')                                   2px    2px    2px    2px    2px    2px
$("#b").css('padding-left')                                   2px    2px    2px    2px    2px    2px
$("#d").css('padding-left')                                   2px    2px    2px    2px    2px    2px

document.getElementById("t").getBoundingClientRect().width    200    206    200    206    200    206
document.getElementById("b").getBoundingClientRect().width    200    200    200    200    200    200
document.getElementById("d").getBoundingClientRect().width    200    206    200    206    200    206

document.getElementById("t").offsetWidth                      200    206    200    206    200    206
document.getElementById("b").offsetWidth                      200    200    200    200    200    200
document.getElementById("d").offsetWidth                      200    206    200    206    200    206

1
Просто для того, щоб було зрозуміло ... чи хтось із цих браузерів робить щось інакше від іншого? Я не можу знайти будь - яких відмінностей ... Крім того , я не вниз голосування (поки), але це не дуже прямо відповісти на питання, хоча він може бути легко Editted зробити це.
Zach Lysobey

1
Не був спрямований на відповідь на питання - на нього вже відповіли. Лише корисна інформація та так, що всі основні браузери останньої версії згодні з цими значеннями - це добре.
Грем

3
Ну ... якщо ваш намір не відповідати на питання, то це насправді не належить тут (як "відповідь"). Я б розглядав можливість включити це до якогось зовнішнього ресурсу (можливо, суть GitHub чи публікація в блозі) і пов’язати це у коментарі до оригінального питання або однієї з відповідей.
Zach Lysobey

21
@ZachLysobey З кожного правила є винятки - і це класна корисна річ.
Dan Nissenbaum

16

Згідно MDN: Визначення розмірів елементів

offsetWidthі offsetHeightповернути "загальну кількість місця, який займає елемент, включаючи ширину видимого вмісту, смуги прокрутки (якщо такі є), набивання та межу"

clientWidthі clientHeightповернути "скільки місця займає фактично відображений вміст, включаючи прокладку, але не включаючи рамки, поля чи смуги прокрутки"

scrollWidthі scrollHeightповернути "фактичний розмір вмісту, незалежно від того, скільки його наразі видно"

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


5

Потрібно розраховувати його лише для IE7 та старших версій (і лише якщо вміст не має фіксованого розміру). Я пропоную використовувати умовні коментарі HTML, щоб обмежити злом на старих IE, які не підтримують CSS2. Для всіх інших браузерів використовуйте це:

<style type="text/css">
    html,body {display:table; height:100%;width:100%;margin:0;padding:0;}
    body {display:table-cell; vertical-align:middle;}
    div {display:table; margin:0 auto; background:red;}
</style>
<body><div>test<br>test</div></body>

Це ідеальне рішення. Він центрує <div>будь-який розмір і стискає його до розміру вмісту.


3

Стилі елементів легко змінювати, але начебто складно читати значення.

JavaScript не може прочитати будь-яке властивість стилю елемента (elem.style), що надходить з css (внутрішній / зовнішній), якщо ви не використовуєте вбудований виклик методу getComputedStyle в JavaScript.

getComputedStyle (елемент [, псевдо])

Елемент: елемент, для якого слід прочитати значення.
pseudo: Якщо потрібен, псевдоелемент, наприклад :: раніше. Порожній рядок або відсутність аргументу означає сам елемент.

Результат - об’єкт із властивостями стилю, наприклад, elem.style, але тепер стосовно всіх класів css.

Наприклад, тут стиль не бачить поля:

<head>
  <style> body { color: red; margin: 5px } </style>
</head>
<body>

  <script>
    let computedStyle = getComputedStyle(document.body);

    // now we can read the margin and the color from it

    alert( computedStyle.marginTop ); // 5px
    alert( computedStyle.color ); // rgb(255, 0, 0)
  </script>

</body>

Таким чином, ви змінили код javaScript, щоб включити елемент getComputedStyle для елемента, який ви хочете отримати, його ширина / висота або інший атрибут

window.onload = function() {

    var test = document.getElementById("test");
    test.addEventListener("click", select);


    function select(e) {                                  
        var elementID = e.target.id;
        var element = document.getElementById(elementID);
        let computedStyle = getComputedStyle(element);
        var width = computedStyle.width;
        console.log(element);
        console.log(width);
    }

}

Обчислені та вирішені значення

У CSS є два поняття:

Обчислене значення стилю - це значення після застосування всіх правил CSS та успадкування CSS, як результат каскаду CSS. Він може виглядати як висота: 1ем або розмір шрифту: 125%.

Розв’язане значення стилю - це те, що остаточно застосовується до елемента. Такі значення, як 1ем або 125%, відносні. Браузер приймає обчислене значення і робить усі одиниці фіксованими та абсолютними, наприклад: висота: 20 пікселів або розмір шрифту: 16 пікселів. Для геометричних властивостей вирішені значення можуть мати плаваючу точку, наприклад ширину: 50,5 пікселів.

Дуже давно створено getComputedStyle для отримання обчислених значень, але виявилося, що розв'язані значення набагато зручніше, а стандарт змінився.
Отже, сьогодні getComputedStyle фактично повертає вирішене значення властивості.

Будь ласка, запиши:

getComputedStyle вимагає повного імені властивості

Ви завжди повинні запитувати точну властивість, яку ви хочете, наприклад paddingLeft або висоту чи ширину. Інакше правильний результат не гарантується.

Наприклад, якщо є властивості paddingLeft / paddingTop, то що нам слід отримати для getComputedStyle (elem) .padding? Нічого, а може бути, "генерованого" значення з відомих прокладок? Тут немає жодного стандартного правила.

Є й інші невідповідності. Наприклад, деякі веб-переглядачі (Chrome) показують 10px в документі нижче, а деякі з них (Firefox) - не:

<style>
  body {
    margin: 30px;
    height: 900px;
  }
</style>
<script>
  let style = getComputedStyle(document.body);
  alert(style.margin); // empty string in Firefox
</script>

для отримання додаткової інформації https://javascript.info/styles-and-classes


1

element.offsetWidth та element.offsetHeight повинні робити, як було запропоновано в попередньому дописі.

Однак, якщо ви просто хочете централізувати вміст, є кращий спосіб зробити це. Якщо припустимо, що ви використовуєте xhtml строгий DOCTYPE. встановіть маржу: 0, властивість авто та потрібну ширину в px для тега body. Вміст вирівнюється по центру до сторінки.


1
Я думаю, що він хоче також зосереджувати його вертикально, що є правильним болем при CSS, якщо ви не зможете відповідати певним критеріям (наприклад, вміст відомого розміру)
Грег

1

... здається, CSS допомагає поставити div у центр ...

<style>
 .monitor {
 position:fixed;/* ... absolute possible if on :root */
 top:0;bottom:0;right:0;left:0;
 visibility:hidden;
 }
 .wrapper {
 width:200px;/* this is size range */
 height:100px;
 position:absolute;
 left:50%;top:50%;
 visibility:hidden;
 }

 .content {
 position:absolute;
 width: 100%;height:100%;
 left:-50%;top:-50%;
 visibility:visible;
 }

</style>

 <div class="monitor">
  <div class="wrapper">
   <div class="content">

 ... so you hav div 200px*100px on center ...

  </div>
 </div>
</div>

0

також ви можете використовувати цей код:

var divID = document.getElementById("divid");

var h = divID.style.pixelHeight;

1
Хм, працює в Chrome і IE9, схоже, не працює у Firefox. Це працює лише для певних типів документів?
BrainSlugs83

1
PixelHeight був винахід Internet Explorer , який не повинен використовуватися більше stackoverflow.com/q/17405066/2194590
HolgerJeromin

0

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

yourSelector {
    position: fixed;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
} 

-2

Ось код для WKWebView, що визначає висоту конкретного елемента Dom (не працює належним чином для всієї сторінки)

let html = "<body><span id=\"spanEl\" style=\"font-family: '\(taskFont.fontName)'; font-size: \(taskFont.pointSize - 4.0)pt; color: rgb(\(red), \(blue), \(green))\">\(textValue)</span></body>"
webView.navigationDelegate = self
webView.loadHTMLString(taskHTML, baseURL: nil)

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    webView.evaluateJavaScript("document.getElementById(\"spanEl\").getBoundingClientRect().height;") { [weak self] (response, error) in
        if let nValue = response as? NSNumber {

        }
    }
}

просто, щоб було зрозуміло, це swiftкод iOS , правда? Не JavaScript. Я дотримуюсь перекладу (б / с це може бути дуже корисним), але зауважте, що це не відповідає на питання, і, ймовірно, буде більш доречним для іншого, конкретного iOS-питання. Якщо такого вже немає, можливо, подумайте про те, щоб задати питання та самовідповістись.
Зах Лісобей

-3

Якщо offsetWidth повертає 0, ви можете отримати властивість ширини стилю елемента та шукати його за числом. "100px" -> 100

/\d*/.exec(MyElement.style.width)

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