요소의 렌더링 된 높이를 어떻게 얻습니까?


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을 통하지 않고 "컨테이너"div의 전체 높이를 올바르게 만들 수 있습니다. 다시 감사합니다.
BuddyJoe

3
jQuery를 사용하지 않거나 사용할 수 없거나 원하지 않는 경우에도 offsetHeight를 사용하여 구현하는 사람은 계속해서 jQuery 소스를 다운로드하고 "높이"를 검색하여 사용하는 코드를 찾으십시오. 거기에 미친 물건이 많이 있습니다!
Simon_Weaver

1
@matejkramny-이 질문과 답변은 5 년 전에 끝났습니다 . OP는 사이트에서 이미 jQuery를 사용하고 있었기 때문에 동일한 / 유사한 로직을 다시 구현하는 대신 이미 한 줄의 jQuery 함수를 사용하지 않는 이유는 무엇입니까? 나는 jQuery가 많은 것들에 대해 과잉이며 바닐라 JS를 두려워하지 않는다는 데 동의하지만 라이브러리에 필요한 것을 정확하게 수행하는 함수가있을 때 특히 이유 때문에 그것을 사용하지 않는 것은 바보 같은 Not Not Here here
Russ Cam

3
@matejkramny 질문을 할 때 OP의 의도는 DOM에서와 장면 뒤에서 일어나는 일을 이해하지 않고 요소의 렌더링 된 높이를 얻는 것이 었습니다. 그것이 그들의 의도라면, 그들은 잘못된 질문을했다. 나는 사람들이 그들이 사용하는 라이브러리와 프레임 워크를 이해하고, 지식은 힘과 그 모든 것을 이해하는 경향이 있음에 동의하지만 때로는 특정 질문에 대한 답변을 원하기도합니다. 실제로, 위의 의견은 이미 jQuery 코드를 살펴보고 뒤에서 일어나는 일을 이해하는 것을 제안합니다.
Russ Cam

21
OP의 경우 jQuery를 사용하는 것이 올바른 답변입니다. 그 이후로 이것을 보는 세계의 다른 사람들에게는 jQuery가 아닌 답변이 가장 좋습니다. 아마도 SO는 그 현실에 적응할 필요가있을 것입니다. 아마도 가장 높은 투표 응답은 어떤 방식 으로든 허용 된 것보다 강조되어야합니다.
Dimitris

1219

다음 중 하나를 시도하십시오.

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

clientHeight 높이와 수직 패딩을 포함합니다.

offsetHeight 높이, 세로 패딩 및 세로 테두리가 포함됩니다.

scrollHeight 포함 된 문서의 높이 (스크롤의 경우 높이보다 커야 함), 세로 패딩 및 세로 테두리가 포함됩니다.


3
고마워요,이 부동산에 대해 몰랐어요 IE8 + 와도 호환됩니다.
lyubeto '12

나는 clientHeight의 의미에 당황했습니다. p 요소가 많은 div 요소가 있으며 내용은 브라우저의 볼 수있는 영역을 훨씬 뛰어 넘습니다. 그리고 clientHeight가 렌더링 된 높이를 제공하고 scrollHeight가 전체 길이를 제공하도록 기대했습니다. 그러나 그것들은 거의 동일합니다 (여백, 패딩 등에 의해서만 다릅니다).
bahti

10
@bahti 자체의 높이가 제한되어 있고 overflow : hidden 또는 overflow : scroll 형식이 아닌 한 요소는 모든 내용을 표시하도록 확장되며 (스크롤에 관계없이) scrollHeight와 clientHeight는 동일합니다.
Ulad Kasach

4
큰 대답이지만 논리적으로 요소의 높이에 영향을 미치는 테두리는 위쪽 및 아래쪽 테두리이며 가로입니다. 이 답변은 그것들을 "수직 테두리"라고합니다. 방금 내가 2 센트 떨어 뜨릴 줄 알았는데
Kehlan Krumme

1
내가 아는 것에서 스크롤이 표시되면 스크롤 .clientWidth/.clientHeight 너비를 포함시키지 마십시오 . 당신이 포함되어야 스크롤 폭을하려는 경우, 사용할 수있는 element.getBoundingClientRect().width 대신에
드미트리 Gonchar

151

이 답변의 맨 위에 사용 되는 링크가 많기 때문에 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/


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)에 대해 동일하게 설정하는 복잡한 레이아웃 스크립트를 제외하고는 높이를 설정하지 않았습니다. 블록 사이의 1 픽셀 차이조차도 창 크기를 조정할 때 레이아웃을 망칠 수 있습니다.
DHorse

1
BTW, 오프셋은 이것이 제거하는 마진과 관련하여 브라우저 버전에 따라 일부 사용되는 것으로 생각합니다.
DHorse

2
질문은 jQuery를 요구하지 않습니다. 어.
dthree

1
@dthree 나는 그가 jQuery를 사용하고 있다고 분명히 언급했다고 생각한다. (또한 Tags에 포함됨) :)
공개 및 무료

44

이것을 사용하여 요소의 높이를 얻습니다 (float 반환) :

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

가상 DOM 을 사용할 때도 작동 합니다 . Vue에서 다음과 같이 사용합니다.

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

1
getBoundingClientRect (). height는 부동 소수점 숫자를 반환하고 (다른 정수는 정수를 반환) nice :)
Ari


14

확실히 사용

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

또는

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

방금 배운 몇 가지 중요한 사항이 있기 때문에 이것을 추가 답변으로 게시하고 있습니다.

나는 offsetHeight를 사용하여 거의 함정에 빠졌습니다. 이것이 일어난 일입니다.

  • 디버거를 사용하는 좋은 오래된 트릭을 사용하여 요소의 속성을 '보고'
  • 나는 내가 기대했던 가치를 중심으로 가치가있는 것을 보았습니다.
  • 그것은 offsetHeight였습니다-그래서 나는 그것을 사용했습니다.
  • 그런 다음 숨겨진 DIV와 함께 작동하지 않는다는 것을 깨달았습니다.
  • maxHeight를 계산 한 후에 숨기려고했지만 어색해 보였습니다.
  • 검색을 수행하고 jQuery.height ()를 발견하여 사용했습니다.
  • 숨겨진 요소에서도 작동하는 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
솔루션에 설명 추가
Freelancer

then offsetHeight
Ritwik

6
이 속성은 값을 정수로 반올림 합니다. 부동 값 이 필요한 경우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={};
마크 Schultheiss

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:hiddenand로 설정하고 position:absoluteDOM 트리에 추가하고 offsetHeight를 가져 와서 제거하십시오 (이것은 프로토 타입 라이브러리가 마지막으로 확인했을 때 줄 뒤에서 수행하는 작업입니다)."

여러 요소에 대해 동일한 문제가 있습니다. 사이트에서 사용할 jQuery 또는 Prototype은 없지만 작동하는 경우 기술을 빌리는 것을 선호합니다. 작동하지 않은 몇 가지 예를 들어 다음과 같은 코드가 있습니다.

// 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이 오프셋 및 스크롤 높이에서 0이됩니다. 그런 다음 Add DOM 솔루션과 clientRects를 사용하여 여기에서 작동하는지 확인했습니다.

2011 년 6 월 29 일, 필자는 예상 한 것보다 더 나은 결과로 DOM과 clientHeight에 모두 추가하기 위해 실제로 코드를 업데이트했습니다.

1) clientHeight도 0이었습니다.

2) 돔은 실제로 나에게 키를 주었다.

3) ClientRects는 DOM 기술과 거의 동일한 결과를 반환합니다.

추가 된 요소는 본질적으로 유동적이기 때문에 빈 DOM Temp 요소에 추가 될 때 해당 컨테이너의 너비에 따라 렌더링됩니다. 결국 이상으로 30px 더 짧기 때문에 이상합니다.

높이를 다르게 계산하는 방법을 보여주기 위해 몇 가지 스냅 샷을 추가했습니다. 정상적으로 렌더링되는 메뉴 블록 DOM 임시 요소에 추가 된 메뉴 블록

높이 차이는 분명합니다. 절대 위치를 추가하고 숨길 수는 있지만 아무런 영향을 미치지 않습니다. 나는 이것이 작동하지 않을 것이라고 확신했다!

(더 멀어짐) 높이는 실제 렌더링 높이보다 낮습니다 (렌더링). 이것은 기존의 부모와 일치하도록 DOM Temp 요소의 너비를 설정하여 해결할 수 있으며 이론적으로 상당히 정확하게 수행 할 수 있습니다. 또한 제거하고 기존 위치에 다시 추가하여 어떤 결과가 발생하는지 알 수 없습니다. 그들이 innerHTML 기술을 통해 도착했을 때 나는이 다른 접근법을 사용하여 찾고 있습니다.

* 그러나 * 그 중 어느 것도 필요하지 않았습니다. 실제로 그것은 광고 된대로 작동하고 올바른 높이를 반환했습니다!

메뉴를 다시 표시 할 수 있었을 때 DOM은 페이지 상단의 유동적 레이아웃 당 올바른 높이 (279px)를 반환했습니다. 위의 코드는 280px를 반환하는 getClientRects도 사용합니다.

다음 스냅 샷에 설명되어 있습니다 (한 번 작업 한 후에 Chrome에서 가져옴).
여기에 이미지 설명을 입력하십시오

이제 프로토 타입 트릭이 왜 작동하는지 전혀 알지 못합니다. 또는 getClientRects도 작동합니다.

이러한 특정 요소에 대한이 모든 문제의 원인은 appendChild 대신 innerHTML을 사용하는 것으로 의심되지만이 시점에서는 순수한 추측입니다.


6

offsetHeight보통.

무언가를 계산해야하지만 표시하지 않으면 요소를 visibility:hiddenand로 설정 position:absolute하고 DOM 트리에 추가하고를 가져 와서 offsetHeight제거하십시오. (마지막으로 확인했을 때 프로토 타입 라이브러리가 장면 뒤에서 수행하는 작업입니다).


흥미 롭군 프로토 타입을 확인한 적이 없습니다. 왜 jQuery가 배후에서 그렇게하지 않는지 아십니까?
Simon_Weaver

어려움을 겪고 그 기술을 테스트했을 때 일반 JavaScript에서 잘 작동했습니다.
DHorse

5

사용자가 만든 요소가 아직 Dom에서 렌더링되지 않았기 때문에 offsetHeight가 0을 반환하는 경우가 있습니다. 그런 상황 에서이 기능을 작성했습니다.

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;
}

요소를 복제해야합니다. 그렇지 않으면 요소에서 완전히 제거되어 코드에서 발생하는 것으로 보입니다.
punkbit

이 코드는 요소를 DOM에 유지하기위한 것이 아닙니다. DOM에 짧게 (렌더링하여 높이를 얻을 수있을 정도로) DOM에 넣은 다음 꺼내야합니다. 나중에 요소를 나중에 다른 곳의 돔에 넣을 수 있습니다 (작업 전에 높이가 무엇인지 알고 있음). 함수 이름 "getHeight"에 주목하십시오. 그것이 코드가 의도 한 전부입니다.
Lonnie Best

@punkbit : 무슨 말인지 알겠습니다. 당신의 요소는 이미 돔에 있습니다. 내가 작성한 코드는 아직 DOM에없는 요소를위한 것입니다. 요소가 돔에 있는지 여부는 중요하지 않기 때문에 복제는 더 좋을 것입니다.
Lonnie Best

@punkbit : 코드 사용 복제를 수정했지만 테스트하지는 않았습니다.
Lonnie Best

그래, 내 요점이었다. 그가 DOM의 기존 요소에 대해 "요소"라고 말합니다. 그러나 모두 좋다! 잘못 이해하지 마십시오.
punkbit

4

이미 jQuery를 사용하고 있다면 가장 좋은 방법은 .outerHeight()또는 .height()입니다.

jQuery가 없으면 사용중인 상자 크기를 확인하고 다양한 패딩 + 테두리 + clientHeight를 추가 하거나 getComputedStyle을 사용할 수 있습니다 .

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

h 이제 "53.825px"와 같은 문자열이됩니다.

그리고 참조를 찾을 수는 없지만 getComputedStyle()비용이 많이들 수 있다고 생각 하므로 각 window.onscroll이벤트 에서 호출하려는 것이 아닐 수도 있습니다 (그러나 jQuery도 마찬가지입니다 height()).


의 높이가 getComputedStyle되면을 사용 parseInt(h, 10)하여 계산을위한 정수를 얻습니다.
RhodanV5500


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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.