Припустимо, у мене є <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-питання. Якщо такого вже немає, можливо, подумайте про те, щоб задати питання та самовідповістись.