Як ви отримуєте відображену висоту елемента?


405

Як ви отримуєте відображену висоту елемента?

Скажімо, у вас є <div>елемент з деяким вмістом всередині. Цей вміст всередині буде розтягувати висоту <div>. Як ви отримуєте "візуалізовану" висоту, якщо ви чітко не встановили висоту. Очевидно, я намагався:

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

Чи є хитрість робити це? Я використовую jQuery, якщо це допомагає.


см ця відповідь stackoverflow.com/questions/19581307 / ...
KarSho

Відповіді:


183

Це просто повинно бути

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

з jQuery. Це отримує висоту першого елемента у загорнутому наборі у вигляді числа.

Намагаються використовувати

.style.height

працює, лише якщо ви встановили властивість в першу чергу. Не дуже корисно!


1
Одне слово - приголомшливо! Дякуємо за участь усіх. Багато корисної інформації про цю тему. Це дозволить мені зосереджувати сторінки за допомогою CSS, але використовувати jQuery, щоб зробити загальну висоту поділу "контейнер" правильним, не впадаючи в CSS hackville. Знову дякую.
BuddyJoe

3
навіть якщо ви НЕ використовуєте jQuery або нахил або не хочете, я настійно пропоную будь-кому реалізувати це, використовуючи просто offsetHeight продовжує і завантажує джерело jQuery і шукає "висоту", щоб знайти код, який вони використовують. там багато божевільних речей!
Simon_Weaver

1
@matejkramny - це питання та відповідь було понад 5 років тому . ОП вже використовував jQuery на своєму сайті, а не повторно реалізував ту саму / подібну логіку сам, чому б не використати функцію jQuery з однією лінією, яка вже це робить? Я погоджуюся, що jQuery є надмірним для багатьох речей, і я не боюся ванілі JS, але коли в бібліотеці є функція, яка робить саме те, що вам потрібно, здається нерозумним не використовувати її, особливо з причин з "Not Invented Here"
Russ Cam

3
@matejkramny Намір ОП, коли задавали питання, полягав у тому, щоб отримати виведений висоту елемента, а не зрозуміти, що відбувається в DOM та поза лаштунками; якщо це був їхній намір, вони задали неправильне запитання. Я погоджуюся, що люди повинні схильні розуміти бібліотеки та рамки, якими вони користуються, знання - це сила і все таке, але іноді просто хочеться відповісти на конкретне питання. Дійсно, наведені вище коментарі пропонують переглянути код jQuery, щоб зрозуміти, що відбувається за кадром.
Russ Cam

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

1219

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

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

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

offsetHeight включає висоту, вертикальну прокладку та вертикальні межі.

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


3
Дякую, я не знав про цю власність. Це IE8 + сумісний також.
любето

Я здивований значенням clientHeight. У мене є елемент div, який містить купу p елементів, і вміст виходить далеко за межі видимої області браузера вниз. І я очікував, що клієнтська висота надасть відтворену висоту, а прокрутка висота - на повну довжину. Але вони майже рівні (відрізняються лише запасом, прокладкою тощо).
бахти

10
@bahti, якщо вона сама не має обмеженої висоти та переповнення: прихована або якась форма переповнення: прокрутка, елемент розшириться (на ваш погляд чи ні), щоб відобразити весь вміст, а прокручуванняHeight та clientHeight будуть рівними.
Улад Касач

4
Чудова відповідь, але логічно, що межі, що впливають на висоту елемента, - це верхня і нижня межі, які є горизонтальними. Ця відповідь позначає їх як "вертикальні межі". Просто подумав, що я
скину

1
Як я знаю, .clientWidth/.clientHeight НЕ включайте ширину прокрутки, якщо відображається прокрутка. Якщо ви хочете, щоб ширина прокрутки була включена, можете використовувати element.getBoundingClientRect().width замість цього
Дмитро Гончар

151

НЕ ЖИТТЯ, оскільки 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/


49

Ви можете використовувати .outerHeight()для цієї мети.

Це дасть вам повну відтворену висоту елемента. Крім того, вам не потрібно встановлювати жоден css-heightелемент. З метою обережності ви можете зберегти його висоту автоматично, щоб її можна було відображати відповідно до висоти вмісту.

//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()


1
Дякую. У роботі з поплавками у мене було багато проблем з автоматичним висотою, але тоді я був недосвідчений. Я, як правило, не встановлював висоту, за винятком деяких складних сценаріїв компонування, де я спочатку очищав поле, але встановлював його рівним для кожного блоку (Div), який закінчується тим самим верхом. Навіть різниця в один піксель між блоками може накрутити макет під час зміни вікон.
DHorse

1
BTW, я вважаю, що в офсетному режимі є певне використання браузера, що стосується меж, які це виключає.
DHorse

2
Питання не вимагає jQuery. Тьфу.
dthree

1
@dthree Я думаю, що він чітко зазначив, що він використовує jQuery. (також включений у Теги) :)
відкрито та безкоштовно

44

Я використовую це для отримання висоти елемента (повертає float) :

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

Він також працює, коли ви використовуєте віртуальний DOM . Я використовую його у Vue так:

this.$refs['some-ref'].getBoundingClientRect().height

1
getBoundingClientRect (). висота повертає число з плаваючою комою (а інші повертають ціле число), приємно :)
Арі


14

Однозначно використовувати

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

або

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

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

Я ледве не потрапив у пастку саме зараз, використовуючи офсетHeight. Ось що сталося:

  • Я використав старий добрий трюк використання налагоджувача, щоб "спостерігати", які властивості має мій елемент
  • Я побачив, яке з них має значення навколо значення, яке я очікував
  • Це було компенсованоВисотою - тому я цим скористався.
  • Тоді я зрозумів, що це не працює з прихованим 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, пропоную вам поглянути.


Ви побачили ваш інший коментар на рівні запитання. Мене продають на jQuery. Були трохи. Але це уклало угоду. Я закоханий у те, що ця проста річ вирішить для мене проблеми з компонуванням 100-ти (переважно на Інтранет-сайтах, де я знаю, що працює JavaScript).
BuddyJoe

13
document.querySelector('.project_list_div').offsetHeight;

4
додати пояснення до свого рішення
фрілансер

потім зсувВисота
Рітвік

6
Ця властивість округлятиме значення до цілого числа . Якщо вам потрібно значення float , використовуйтеelem.getBoundingClientRect().height
Penny Liu

12

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

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

Потім просто встановіть тіло для завантаження

<body onload='anyName()'>

Це корисно, і я використовую щось подібне у більш складному коді.
DHorse

10

Гм, ми можемо отримати геометрію Елемента ...

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?


1
var geometry; geometry={};може бути простоvar geometry={};
Марк Шультейс

10

Я думаю, що найкращий спосіб зробити це у 2020 році - це використовувати звичайні js та getBoundingClientRect().height;

Ось приклад

let div = document.querySelector('div');
let divHeight = div.getBoundingClientRect().height;

console.log(`Div Height: ${divHeight}`);
<div>
  How high am I? 🥴
</div>

На додаток до heightцього способу, ми також маємо доступ до ряду інших матеріалів про div.

let div = document.querySelector('div');
let divInfo = div.getBoundingClientRect();

console.log(divInfo);
<div>What else am I? 🥴</div>


8

Так це відповідь?

"Якщо вам потрібно щось обчислити, але не показати, встановіть елемент 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) висота клієнта також була 0.

2) Дом фактично дав мені висоту, яка була великою.

3) ClientRects повертає результат, майже ідентичний техніці DOM.

Оскільки додані елементи мають рідкий характер, коли вони додаються до інакше порожнього елемента DOM Temp, вони надаються відповідно до ширини цього контейнера. Це стає дивно, тому що це на 30 пікселів коротше, ніж у підсумку.

Я додав кілька знімків, щоб проілюструвати, як висота обчислюється по-різному. Блок меню відображається нормально Блок меню додано до елемента Temp DOM

Перепади висот очевидні. Я, безумовно, можу додати абсолютне позиціонування та приховане, але впевнений, що це не матиме ефекту. Я продовжував переконатися, що це не вийде!

(Я відступаю далі) Висота виходить (робить) нижчою за справжню виведену висоту. Це можна вирішити, встановивши ширину елемента Temp DOM відповідно до існуючого батьківського, і це можна зробити досить точно теоретично. Я також не знаю, що може призвести до їх видалення та додавання назад у існуюче місце. Коли вони приїхали за допомогою методу InternalHTML, я буду дивитись, використовуючи цей інший підхід.

* ТАКОЖ * Нічого цього не було необхідним. Насправді він працював як рекламується і повертає правильну висоту !!!

Коли мені вдалося знову побачити меню, дивним чином DOM повернув правильну висоту на макет рідини вгорі сторінки (279 пікселів). Вищевказаний код також використовує getClientRects, які повертають 280px.

Це проілюстровано на наступному знімку (зробленому з Chrome колись працюючи.)
введіть тут опис зображення

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

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


6

offsetHeight, зазвичай.

Якщо вам потрібно щось обчислити, але не показати, встановіть елемент visibility:hiddenі position:absoluteдодайте його до дерева DOM, отримайте offsetHeightта видаліть його. (Ось що робила бібліотека-прототип поза кадром востаннє, коли я перевіряв).


цікаво. я ніколи не перевіряв прототип. будь-яка ідея, чому jQuery не робить цього за кадром?
Simon_Weaver

Я бачив, що, коли виникли труднощі і перевірив цю техніку, вона спрацювала досить просто в JavaScript
DHorse

5

Іноді offsetHeight поверне нуль, оскільки створений вами елемент ще не відображався в Dom. Я написав цю функцію для таких обставин:

function getHeight(element)
{
    var e = element.cloneNode(true);
    e.style.visibility = "hidden";
    document.body.appendChild(e);
    var height = e.offsetHeight + 0;
    document.body.removeChild(e);
    e.style.visibility = "visible";
    return height;
}

вам потрібно клонувати елемент, інакше він буде видалений повністю з dom повністю, здається, з вашого коду ось що і станеться.
панкбіт

Цей код не призначений для збереження елемента в DOM. Він призначений ввести його в DOM лише коротко (досить довго, щоб зробити його і отримати висоту), після чого він виймає його. Ви можете пізніше поставити елемент в купол в іншому місці (знаючи, яка його висота буде перед вами). Зауважте назву функції "getHeight"; це все, що код має намір зробити.
Lonnie Best

@punkbit: Я бачу, що ти маєш на увазі. Ваш елемент вже в домі. Я написав код для елемента, якого ще немає в DOM. Як ви кажете, клонування було б краще, тому що не має значення, є елемент в куполі чи ні.
Lonnie Best

@punkbit: Я змінив код використання клонування, але не перевірив його.
Lonnie Best

так, це було моє значення. Мені здалося, що він каже "елемент" для існуючого елемента в DOM. Але все добре! Не зрозумійте це неправильно
панкбіт

4

Якщо ви вже використовуєте jQuery, ваша найкраща ставка - .outerHeight()або .height(), як було зазначено.

Без jQuery ви можете перевірити розмір поля та використовувати додані різні прокладки + рамки + clientHeight, або ви можете скористатися getComputedStyle :

var h = getComputedStyle (document.getElementById ('someDiv')). висота;

h тепер буде такий рядок, як "53.825px".

І я не можу знайти посилання, але я думаю, що я чув, що це getComputedStyle()може бути дорогим, тому, ймовірно, це не те, що ви хочете зателефонувати на кожній window.onscrollподії (але тоді, і це не jQuery height()).


Коли ви отримаєте висоту getComputedStyle, використовуйте parseInt(h, 10)для отримання цілого числа для обчислень.
РоданV5500


1

Якби я правильно зрозумів ваше запитання, можливо, щось подібне допоможе:

function testDistance(node1, node2) {
    /* get top position of node 1 */
    let n1Pos = node1.offsetTop;
    /* get height of node 1 */
    let n1Height = node1.clientHeight;
    /* get top position of node 2 */
    let n2Pos = node2.offsetTop;
    /* get height of node 2 */
    let n2Height = node2.clientHeight;

    /* add height of both nodes */
    let heightTogether = n1Height + n2Height;
    /* calculate distance from top of node 1 to bottom of node 2 */
    let actualDistance = (n2Pos + n2Height) - n1Pos;

    /* if the distance between top of node 1 and bottom of node 2
       is bigger than their heights combined, than there is something between them */
    if (actualDistance > heightTogether) {
        /* do something here if they are not together */
        console.log('they are not together');
    } else {
        /* do something here if they are together */
        console.log('together');
    } 
}

-4

Ви конкретно встановили висоту в css? Якщо у вас немає, вам потрібно offsetHeight;скоріше використовуватиheight

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

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