Как получить фактическую ширину и высоту элемента HTML?
предположим, что у меня есть <div>
что я хочу центрировать на дисплее браузера (viewport). Для этого мне нужно рассчитать ширину и высоту <div>
элемент.
что я должен использовать? Просьба включить информацию о совместимости браузеров.
12 ответов
вы должны использовать .offsetWidth
и .offsetHeight
свойства.
Обратите внимание, что они принадлежат элементу, а не .style
.
var width = document.getElementById('foo').offsetWidth;
посмотри 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;
стоит отметить, что объект, возвращаемый этим методом, на самом деле не является нормальный
Примечание: этот ответ был написан в 2008 году. В то время лучшим кросс-браузерным решением для большинства людей действительно было использование jQuery. Я оставляю ответ здесь для потомков, и если вы используете jQuery, это хороший способ сделать это. Если вы используете какую-то другую структуру или чистый JavaScript, принятый ответ, вероятно, является способом.
начиная с jQuery 1.2.6 вы можете использовать один из core функции CSS, height
и width
(или outerHeight
и outerWidth
, по мере необходимости).
var height = $("#myDiv").height();
var width = $("#myDiv").width();
var docHeight = $(document).height();
var docWidth = $(document).width();
на всякий случай, если это кому-то полезно, я поставил текстовое поле, кнопку и div все с тем же 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
вам нужно только вычислить его для IE7 и старше (и только если ваш контент не имеет фиксированного размера). Я предлагаю использовать условные комментарии HTML для ограничения взлома старых IEs, которые не поддерживают 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>
любого размера и сжимает-обертывает его до размера его содержимого.
по данным MDN: Определение размеров элементов
offsetWidth
и offsetHeight
возвращает "общий объем пространства, занимаемого элементом, включая ширину видимого содержимого, полосы прокрутки (если таковые имеются), заполнение и границу"
clientWidth
и clientHeight
return "сколько места занимает фактическое отображаемое содержимое, включая заполнение, но не включая границу, поля или полосы прокрутки"
scrollWidth
и scrollHeight
возврат " фактического размера содержания, независимо от того, сколько из него в настоящее время видно"
таким образом, это зависит от того, ожидается ли измеренное содержимое из текущей видимой области.
элемент.offsetWidth и элемент.offsetHeight должны сделать, как предложено в предыдущем посте.
однако, если вы просто хотите центрировать контент, есть лучший способ сделать это. Предполагая, что вы используете XHTML strict DOCTYPE. установите поле: 0, свойство auto и требуемую ширину в px для тега body. Содержимое выравнивается по центру страницы.
... кажется, 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>
легко изменить стили элементов, но довольно сложно прочитать значение.
JavaScript не может прочитать свойство стиля элемента (elem.стиль), исходящий из css (внутренний/внешний), если вы не используете встроенный вызов метода getComputedStyle в javascript.
getComputedStyle (element[, псевдо])
элемент: элемент для чтения значения.
псевдо: псевдо-элемент, если требуется, для пример:: раньше. Пустая строка или нет аргумента означает сам элемент.
результатом является объект со свойствами стиля, например elem.стиль, но теперь по отношению ко всем классам css.
например, здесь style не видит поля:
<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. Это может выглядеть как высота: 1em или размер шрифта: 125%.
разрешенное значение стиля-это то, которое, наконец, применяется к элементу. Значения типа 1em или 125% относительны. Браузер принимает вычисленное value и делает все единицы фиксированными и абсолютными, например: высота:20 пикселей или размер шрифта: 16px. Для свойств геометрии разрешенные значения может иметь плавающую точку, например width: 50.5 px.
давным-давно getComputedStyle был создан для получения вычисленных значений, но оказалось, что разрешенные значения гораздо удобнее, и стандарт изменился.
Таким образом, в настоящее время getComputedStyle фактически возвращает разрешенное значение свойства.
Обратите Внимание:
getComputedStyle требуется полное имя свойства
вы всегда должны спрашивать точное свойство, которое вы хотите, например paddingLeft или высота или ширина. В противном случае правильный результат не гарантирован.
например, если есть свойства paddingLeft/ paddingTop, то что мы должны получить для getComputedStyle (elem).обивка? Ничего, или может быть," сгенерированное " значение из известных прокладок? Нет стандарта здесь править.
там другие нестыковки. Например, некоторые браузеры (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
также вы можете использовать этот код:
var divID = document.getElementById("divid");
var h = divID.style.pixelHeight;
здесь код 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 {
}
}
}
Если offsetWidth возвращает 0, вы можете получить свойство style width элемента и искать его для числа. "100 Пикс" -> 100
/ \d*/.exec (MyElement.стиль.ширина)