Как вы получаете визуализированную высоту элемента? - PullRequest
347 голосов
/ 08 февраля 2009

Как вы получаете визуализированную высоту элемента?

Допустим, у вас есть элемент <div> с некоторым содержимым внутри. Это содержимое внутри будет растягивать высоту <div>. Как вы получаете «визуализированную» высоту, если вы явно не установили высоту. Очевидно, я попытался:

var h = document.getElementById('someDiv').style.height;

Есть ли хитрость для этого? Я использую jQuery, если это поможет.

Ответы [ 17 ]

1079 голосов
/ 08 февраля 2009

Попробуйте одно из:

var h = document.getElementById('someDiv').clientHeight;
var h = document.getElementById('someDiv').offsetHeight;
var h = document.getElementById('someDiv').scrollHeight;

clientHeight включает высоту и вертикальные отступы.

offsetHeight включает высоту, отступы по вертикали и вертикальные границы.

scrollHeight включает высоту содержимого документа (будет больше, чем высота в случае прокрутки), вертикальное заполнение и вертикальные границы.

164 голосов
/ 08 февраля 2009

Это должно быть просто

$('#someDiv').height();

с помощью jQuery. Получает высоту первого элемента в упакованном наборе в виде числа.

Пытаясь использовать

.style.height

работает, только если вы установили свойство в первую очередь. Не очень полезно!

139 голосов
/ 26 января 2015

NON JQUERY , поскольку в верхней части этих ответов было несколько ссылок, использующих elem.style.height ...

ВНУТРЕННЯЯ ВЫСОТА:
https://developer.mozilla.org/en-US/docs/Web/API/Element.clientHeight

document.getElementById(id_attribute_value).clientHeight;

НАРУЖНАЯ ВЫСОТА:
https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.offsetHeight

document.getElementById(id_attribute_value).offsetHeight; 

Или одна из моих любимых ссылок: http://youmightnotneedjquery.com/

45 голосов
/ 30 января 2013

Вы можете использовать .outerHeight() для этой цели.

Это даст вам полную визуализацию высоты элемента. Кроме того, вам не нужно устанавливать css-height элемента. В качестве меры предосторожности вы можете оставить его высоту auto , чтобы он мог отображаться в соответствии с высотой содержимого.

//if you need height of div excluding margin/padding/border
$('#someDiv').height();

//if you need height of div with padding but without border + margin
$('#someDiv').innerHeight();

// if you need height of div including padding and border
$('#someDiv').outerHeight();

//and at last for including border + margin + padding, can use
$('#someDiv').outerHeight(true);

Для ясного просмотра этих функций вы можете перейти на сайт jQuery или подробный пост здесь .

очистит разницу между .height() / innerHeight() / outerHeight()

27 голосов
/ 12 февраля 2017
style = window.getComputedStyle(your_element);

тогда просто: style.height

23 голосов
/ 12 сентября 2018

Я использую это:

document.getElementById('someDiv').getBoundingClientRect().height

Это также работает, когда вы используете виртуальный DOM . Я использую его в Vue так:

this.$refs['some-ref'].getBoundingClientRect().height
15 голосов
/ 13 февраля 2009

Обязательно используйте

$('#someDiv').height()   // to read it

или

$('#someDiv').height(newHeight)  // to set it

Я публикую это как дополнительный ответ, потому что есть пара важных вещей, которые я только что выучил.

Я чуть не попал в ловушку использования offsetHeight. Вот что произошло:

  • Я использовал старый добрый прием использования отладчика, чтобы «посмотреть», какие свойства имеет мой элемент
  • Я увидел, какое из них имеет значение, близкое к ожидаемому
  • Это был offsetHeight - так что я использовал это.
  • Тогда я понял, что это не работает со скрытым DIV
  • Я пытался скрыться после вычисления maxHeight, но это выглядело неуклюже - попало в беспорядок.
  • Я выполнил поиск - обнаружил jQuery.height () - и использовал его
  • обнаруженная высота () работает даже на скрытых элементах
  • просто для удовольствия я проверил реализацию jQuery высота / ширина

Вот только часть этого:

Math.max(
Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]),
Math.max(document.body["offset" + name], document.documentElement["offset" + name])
) 

Да, это выглядит как ОБА прокрутки и смещения. Если это не удается, это выглядит еще дальше, учитывая проблемы совместимости браузера и CSS. Другими словами, ПОТЕРЯ, КОТОРЫЕ Я НЕ ЗАБЛЮДАЮ - или хочу.

Но мне не нужно. Спасибо jQuery!

Мораль истории: если у jQuery есть метод для чего-то, то это, вероятно, по уважительной причине, вероятно, связано с совместимостью.

Если вы недавно не читали список jQuery методов , я предлагаю вам взглянуть.

12 голосов
/ 31 июля 2012

Я сделал простой код, который даже не нуждается в JQuery и, вероятно, поможет некоторым людям. Получает общую высоту 'ID1' после загрузки и использует ее на 'ID2'

function anyName(){
    var varname=document.getElementById('ID1').offsetHeight;
    document.getElementById('ID2').style.height=varname+'px';
}

Тогда просто установите тело для загрузки

<body onload='anyName()'>
8 голосов
/ 25 марта 2018

Хм, мы можем получить геометрию элемента ...

var geometry;
geometry={};
var element=document.getElementById(#ibims);
var rect = element.getBoundingClientRect();
this.geometry.top=rect.top;
this.geometry.right=rect.right;
this.geometry.bottom=rect.bottom;
this.geometry.left=rect.left;
this.geometry.height=this.geometry.bottom-this.geometry.top;
this.geometry.width=this.geometry.right-this.geometry.left;
console.log(this.geometry);

Как насчет этого простого JS?

8 голосов
/ 29 июня 2011

Так это ответ?

"Если вам нужно что-то вычислить, но не показать, установите элемент на visibility:hidden и position:absolute, добавьте его в дерево DOM, получите offsetHeight и удалите его. (Это то, что делает библиотека прототипов строки в прошлый раз, когда я проверял). "

У меня та же проблема с рядом элементов. На сайте нет ни jQuery, ни прототипов, но я полностью поддерживаю заимствование техники, если она работает. В качестве примера некоторых вещей, которые не работали, после чего я сделал следующий код:

// Layout Height Get
function fnElementHeightMaxGet(DoScroll, DoBase, elementPassed, elementHeightDefault)
{
    var DoOffset = true;
    if (!elementPassed) { return 0; }
    if (!elementPassed.style) { return 0; }
    var thisHeight = 0;
    var heightBase = parseInt(elementPassed.style.height);
    var heightOffset = parseInt(elementPassed.offsetHeight);
    var heightScroll = parseInt(elementPassed.scrollHeight);
    var heightClient = parseInt(elementPassed.clientHeight);
    var heightNode = 0;
    var heightRects = 0;
    //
    if (DoBase) {
        if (heightBase > thisHeight) { thisHeight = heightBase; }
    }
    if (DoOffset) {
        if (heightOffset > thisHeight) { thisHeight = heightOffset; }
    }
    if (DoScroll) {
        if (heightScroll > thisHeight) { thisHeight = heightScroll; }
    }
    //
    if (thisHeight == 0) { thisHeight = heightClient; }
    //
    if (thisHeight == 0) { 
        // Dom Add:
        // all else failed so use the protype approach...
        var elBodyTempContainer = document.getElementById('BodyTempContainer');
        elBodyTempContainer.appendChild(elementPassed);
        heightNode = elBodyTempContainer.childNodes[0].offsetHeight;
        elBodyTempContainer.removeChild(elementPassed);
        if (heightNode > thisHeight) { thisHeight = heightNode; }
        //
        // Bounding Rect:
        // Or this approach...
        var clientRects = elementPassed.getClientRects();
        heightRects = clientRects.height;
        if (heightRects > thisHeight) { thisHeight = heightRects; }
    }
    //
    // Default height not appropriate here
    // if (thisHeight == 0) { thisHeight = elementHeightDefault; }
    if (thisHeight > 3000) {
        // ERROR
        thisHeight = 3000;
    }
    return thisHeight;
}

, который в основном пытается что-нибудь и все, только чтобы получить нулевой результат. ClientHeight без каких-либо последствий. С проблемными элементами я обычно получаю NaN в базе и ноль в высотах смещения и прокрутки. Затем я попытался добавить решение DOM и clientRects, чтобы посмотреть, работает ли оно здесь.

29 июня 2011 г., Я действительно обновил код, чтобы попробовать добавить DOM и clientHeight с лучшими результатами, чем я ожидал.

1) clientHeight также был равен 0.

2) Дом на самом деле дал мне высоту, которая была великолепна.

3) ClientRects возвращает результат, почти идентичный методу DOM.

Поскольку добавленные элементы являются текучими по своей природе, когда они добавляются к в противном случае пустому элементу Temp DOM, они отображаются в соответствии с шириной этого контейнера. Это странно, потому что это на 30 пикселей короче, чем в итоге получается.

Я добавил несколько снимков, чтобы проиллюстрировать, как высота рассчитывается по-разному. Menu block rendered normally Menu block added to DOM Temp element

Различия в высоте очевидны. Я, конечно, мог бы добавить абсолютное позиционирование и скрытое, но я уверен, что это не будет иметь никакого эффекта. Я продолжал убеждаться, что это не сработает!

(отступаю дальше) Высота получается (отображается) ниже, чем истинная отображаемая высота. Эту проблему можно решить, установив ширину элемента DOM Temp в соответствии с существующим родителем, и теоретически это можно сделать довольно точно. Я также не знаю, что произойдет, если удалить их и добавить обратно в их существующее местоположение. Поскольку они пришли через метод innerHTML, я буду искать, используя этот другой подход.

* ОДНАКО * Ничего из этого не было необходимо. Фактически это работало как рекламировалось и возвратило правильную высоту !!!

Когда я смог снова удивительно увидеть меню, DOM вернул правильную высоту в соответствии с макетом флюида в верхней части страницы (279 пикселей). Приведенный выше код также использует getClientRects, которые возвращают 280px.

Это показано на следующем снимке (взято из Chrome после работы.)
enter image description here

Теперь у меня нет идеи, почему этот трюк с прототипом работает, но, похоже, это так. Кроме того, getClientRects также работает.

Я подозреваю, что причиной всех этих проблем с этими конкретными элементами было использование innerHTML вместо appendChild, но на данный момент это чистое предположение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...