Как получить высоту DIV, рассмотрев поля внутреннего элемента?

Рассмотрите de после разметки:

<div id="outerElement">
    <div id="innerElement" style="border: 1px solid blue; background-color: #f0f3f5; margin-top: 100px">  
        TESTE
    </div>
</div>

Я хочу получить фактическую конечную высоту outerElement использование JavaScript. Я заметил это, если я удаляю вертикальные поля из innerElement Я могу получить то, что я хочу, но я не могу изменить стили из outerElement.

Как я делаю это?

Obs: Я уже попробовал высоту, scrollheight и offsetHeight во всех браузерах. Chrome дает мне математическое ожидание (включая поля внутреннего элемента) для scrollHeight. Весь другой сбой браузеров.

11
задан André Pena 31 March 2010 в 17:13
поделиться

8 ответов

Я бы использовал jQuery. Попробуйте использовать

$("#myelementId").height()

и посмотрите, помогает ли это.

1
ответ дан 3 December 2019 в 13:09
поделиться

вы можете использовать jQuery:

$('#outerElement').height(); // gets the height of the div
$('#outerElement').outerHeight(); // gets the height of the div including margins and padding
$('#outerElement').innerHeight(); // gets the height of the div including padding

один из них должен работать.

0
ответ дан 3 December 2019 в 13:09
поделиться

Попробуйте использовать clientHeight

var outerElement = document.getElementById("outerElement");
if(outerElement.clientHeight) {
alert("Height is "+outerElement.clientHeight+"px");
}
else { alert("Old browser?"); }

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

var outerElement = document.getElementById("outerElement");
outerElement.style.border = "1px solid black";
var height = outerElement.clientHeight;
outerElement.style.border = "none";
alert("Height is "+height+"px");

Не самое красивое решение, но оно работает, и если вы сможете понять, почему это работает (я точно не знаю :P), вы можете приблизиться к хорошему решению...

Некоторые старые браузеры могут не поддерживать это, хотя... вам придется поискать; я не могу их перечислить.

0
ответ дан 3 December 2019 в 13:09
поделиться

ок, тоже не очень красиво, но вот как я это делаю (отказ от ответственности: я украл это откуда-то однажды)

var height = elem.clientHeight + getBufferHeight(elem, true);

function getBufferHeight(elem, includeMargins) {
    if (!elem.visible()) {
        return 0;
    }
    //do new Number instead of parseFloat to avoid rounding errors 
    var result = 0;
    if (includeMargins) {
        result =   
            new Number(elem.getStyle('marginTop').replace(/[^\d\.]/g, '')).ceil() +  
            new Number(elem.getStyle('marginBottom').replace(/[^\d\.]/g, '')).ceil();
    }     
    result +=
        new Number(elem.getStyle('borderBottomWidth').replace(/[^\d\.]/g, '')).ceil() +
        new Number(elem.getStyle('borderTopWidth').replace(/[^\d\.]/g, '')).ceil() +    
        new Number(elem.getStyle('paddingTop').replace(/[^\d\.]/g, '')).ceil() +
        new Number(elem.getStyle('paddingBottom').replace(/[^\d\.]/g, '')).ceil();                        
    return result;
}
0
ответ дан 3 December 2019 в 13:09
поделиться

Это непростой вопрос: какую высоту вы считаете «подходящей»? Высота содержимого внутри, включая границы, как насчет заполнения или фактического использования полей? В целом браузер действует довольно последовательно по большинству вещей, но quirksmode может прояснить, что вам нужно. (В качестве подсказки, если вам нужна фактическая маржа, это будет больно).

0
ответ дан 3 December 2019 в 13:09
поделиться

Этот ответ может быть несколько очевиден, но если вы уже знаете поле, почему бы просто не добавить его вручную к высоте?

-3
ответ дан 3 December 2019 в 13:09
поделиться

Думаю, вам следует бросить все свойства элемента и составить сумму только таким образом, чтобы вы могли точно знать высоту ... но в случае, если высота задается, например, clear: both property Я не думаю возможно узнать высоту элемента.

Трехсекундное мышление может выглядеть примерно так:

var o document.getElementById ('id'). Style;

    var total = ((o.height.split("px")[0] == "") ? 0 : o.height.split("px")[0]) +
 ((o.marginTop.split("px")[0] == "") ? 0 : o.marginTop.split("px")[0]) + 
((o.marginBottom.split("px")[0] == "") ? 0 : o.marginBottom.split("px")[0]) + 
((o.paddingTop.split("px")[0] == "") ? 0 : o.paddingTop.split("px")[0]) +
    ((o.borderTop.split("px")[0] == "") ? 0 : o.borderTop.split("px")[0]) +
 ((o.borderBottom.split("px")[0] == "") ? 0 : o.borderBottom.split("px")[0])

Но я думаю, вы должны включить также значение document.getElementById ('id'). Height если у вас есть .... это сложно, но может помочь ..

лучше всего =)

0
ответ дан 3 December 2019 в 13:09
поделиться

ПРЕДУПРЕЖДЕНИЕ ПРЕДУПРЕЖДЕНИЕ clientHeight почти работает, но не включает поля: (

Просто подумал, что добавлю, что пробовал это сегодня, и хотя nahumsilva и plodder почти правы (версия nahumsilva, похоже, более кроссбраузерна {plodder, похоже, не работает в Chrome / WebKit, но я не эксперт в этих вещах}), они оба пропустили это у элемента могут быть вычисленные элементы стиля, которые не определены его собственным стилем.

Это сводило меня с ума - мне было интересно, где мои

элементы получали дополнительные 16 пикселей высоты поля - пока я не понял, что это исходит из вычисляемого стиля.

Итак, короче говоря, подход вроде nahumsilva / plodder работал у меня с добавленной оговоркой, что вы должны получить вычисляемый стиль элемента с окном .getComputedStyle (element, null) , который возвращает объект CSSStyleDeclaration (например, element.style ). element.offsetHeight / element.clientHeight должен дать вам высоту без полей, поэтому все будет выглядеть так:

var cstyle = window.getComputedStyle( element, null );
var elementHeight = element.offsetHeight +
Number( cstyle.marginBottom.replace(/[^\d\.]/g, '') ) +
Number( cstyle.marginTop.replace(/[^\d\.]/g, '') );
0
ответ дан 3 December 2019 в 13:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: