Припустимо, у мене є <div>
те, що я хочу зосередити на дисплеї браузера (вікно перегляду). Для цього мені потрібно обчислити ширину і висоту <div>
елемента.
Що я повинен використовувати? Будь ласка, включіть інформацію про сумісність браузера.
Припустимо, у мене є <div>
те, що я хочу зосередити на дисплеї браузера (вікно перегляду). Для цього мені потрібно обчислити ширину і висоту <div>
елемента.
Що я повинен використовувати? Будь ласка, включіть інформацію про сумісність браузера.
Відповіді:
Вам слід використовувати властивості .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,
}
.offsetWidth
та .offsetHeight
: developer.mozilla.org/uk/Determining_the_dimensions_of_elements
offsetWidth
буде 0, якщо елемент є display:none
, тоді як обчислені width
в цьому випадку можуть мати додатне значення. visibility:hidden
не впливає на offsetWidth
.
offsetWidth
повертає "ціле" вікно, включаючи вміст, підкладку та рамки; при цьому clientWidth
повертає розмір вікна вмісту поодинці (тому він матиме менше значення кожного разу, коли елемент має будь-яке ненульове заміщення та / або межу). (мод відредагований для наочності)
Погляньте 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 в звичайний Об'єкт
Довідка:
.offsetHeight
: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetHeight.offsetWidth
: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetWidth.getBoundingClientRect()
: https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRectoffsetHeight
і offsetWidth
ні.
ПРИМІТКА . Ця відповідь була написана в 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();
На всякий випадок, коли це комусь корисно, я кладу текстове поле, кнопку та ділю все з тим самим 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
Згідно MDN: Визначення розмірів елементів
offsetWidth
і offsetHeight
повернути "загальну кількість місця, який займає елемент, включаючи ширину видимого вмісту, смуги прокрутки (якщо такі є), набивання та межу"
clientWidth
і clientHeight
повернути "скільки місця займає фактично відображений вміст, включаючи прокладку, але не включаючи рамки, поля чи смуги прокрутки"
scrollWidth
і scrollHeight
повернути "фактичний розмір вмісту, незалежно від того, скільки його наразі видно"
Отже, це залежить від того, чи очікується, що вимірюваний вміст вийде із поточної області видимості.
Потрібно розраховувати його лише для 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>
будь-який розмір і стискає його до розміру вмісту.
Стилі елементів легко змінювати, але начебто складно читати значення.
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
element.offsetWidth та element.offsetHeight повинні робити, як було запропоновано в попередньому дописі.
Однак, якщо ви просто хочете централізувати вміст, є кращий спосіб зробити це. Якщо припустимо, що ви використовуєте xhtml строгий DOCTYPE. встановіть маржу: 0, властивість авто та потрібну ширину в 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>
також ви можете використовувати цей код:
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 {
}
}
}
swift
код iOS , правда? Не JavaScript. Я дотримуюсь перекладу (б / с це може бути дуже корисним), але зауважте, що це не відповідає на питання, і, ймовірно, буде більш доречним для іншого, конкретного iOS-питання. Якщо такого вже немає, можливо, подумайте про те, щоб задати питання та самовідповістись.