HTML 요소의 실제 너비와 높이를 어떻게 검색합니까?


892

<div>브라우저의 디스플레이 (뷰포트)를 중심으로하고 싶다고 가정하십시오 . 그렇게하려면 <div>요소 의 너비와 높이를 계산해야합니다 .

무엇을 사용해야합니까? 브라우저 호환성에 대한 정보를 포함하십시오.


9
모든 방법을 통해 요소의 높이를 얻는 것은 브라우저가 페이지에서 모든 요소의 위치를 ​​다시 계산하도록하기 때문에 항상 성능에 영향을 미칩니다 (리플 로우). 따라서 너무 많이하지 마십시오. 체크 아웃 이 목록 종류의 것들의 리플 로우를 트리거 무엇에 대한합니다.
Marcelo Lazaroni

답변:


1285

.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,
}

174
조심해! 최근에 요소에 대해 특정 DOM 수정을 수행 한 경우 offsetHeight / offsetWidth는 0을 반환 할 수 있습니다. 요소를 수정 한 후 setTimeout 호출에서이 코드를 호출해야 할 수도 있습니다.
Dan Fabulich


30
어떤 상황에서 0을 반환합니까?
치타

46
@JDandChips : offsetWidth요소가 display:none인 경우 0이 되고,이 경우 계산 된 값 width은 여전히 ​​양수입니다. visibility:hidden에 영향을 미치지 않습니다 offsetWidth.
MrWhite

20
@Supuhstar는 서로 다른 의미를 가지고 있습니다. offsetWidth내용, 패딩 및 테두리를 포함한 "전체"상자를 반환합니다. while clientWidth은 내용 상자의 크기 만 반환하므로 요소에 0이 아닌 패딩 및 / 또는 테두리가있을 때마다 더 작은 값을 갖습니다. (명확성을 위해 편집 된 모드)
Edurne Pascual

200

살펴보십시오 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 참고 : IE8 이하에서는 getBoundingClientRect높이와 너비를 반환하지 않습니다 . *

IE8을 지원 해야하는 경우 .offsetWidthand를 사용하십시오 .offsetHeight.

var height = element.offsetHeight;
var width = element.offsetWidth;

이 메소드에 의해 리턴 된 Object가 실제로는 정상적인 오브젝트 가 아님을 주목할 가치가 있습니다. 속성을 열거 할 수 없습니다 (예 : 기본적으로Object.keys 작동하지 않음).

여기에 대한 자세한 정보 : ClientRect / DomRect를 일반 객체로 변환하는 가장 좋은 방법

참고:


8
getboundingClientRect ()는 반면, CSS로 스케일링 요소의 실제 폭과 높이를 반환 offsetHeight하고 offsetWidth있지 않습니다.
Luke

66

참고 : 이 답변은 2008 년에 작성되었습니다. 당시 대부분의 사람들에게 최고의 크로스 브라우저 솔루션은 실제로 jQuery를 사용하는 것이 었습니다. 나는 후손을 위해 여기에 답을 남기고 있으며, jQuery를 사용하는 경우 이것이 좋은 방법입니다. 다른 프레임 워크 또는 순수한 JavaScript를 사용하는 경우 받아 들일 수있는 대답 일 것입니다.

jQuery를 1.2.6의로서 당신은 핵심 중 하나를 사용할 수 있습니다 CSS 기능 , heightwidth(또는 outerHeightouterWidth적절하게).

var height = $("#myDiv").height();
var width = $("#myDiv").width();

var docHeight = $(document).height();
var docWidth = $(document).width();

45

누군가에게 유용한 경우를 대비하여 텍스트 상자, 버튼 및 div를 모두 동일한 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>

크롬, 파이어 폭스 및 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

1
분명히하기 위해 ... 브라우저 중 어떤 것이 서로 다르게 작동합니까? 나는 또한, 나는 다운 투표 (아직) 아니에요 ... 차이를 찾을 수 있지만, 이것은하지 않습니다 정말 이 쉽게 그렇게 할 편집 해 할 수 있지만 직접 질문에 대답.
Zach Lysobey

1
질문에 대답하는 것이 목표가 아니 었습니다. 이미 답변되었습니다. 유용한 정보와 모든 최신 최신 버전 브라우저가 이러한 값에 동의합니다. 이는 좋은 일입니다.
Graham

3
의도 인 경우 음 ... 없는 질문에 대답하기 위해, 다음이 정말 (에 "답"으로) 여기에 속해 있지 않습니다. 나는 이것을 외부 리소스 (GitHub 요지 또는 블로그 게시물)에 넣고 원래 질문에 대한 의견이나 답변 중 하나에 링크하는 것을 고려할 것입니다.
Zach Lysobey

21
@ZachLysobey 모든 규칙에는 예외가 있습니다. 이것은 시원하고 유용한 것입니다.
Dan Nissenbaum

16

MDN 에 따르면 : 요소의 크기 결정

offsetWidthoffsetHeight"가시 콘텐츠의 폭, 스크롤바, 패딩 및 경계를 포함하여, 요소가 차지하는 공간의 총량의"을 반환

clientWidth그리고 clientHeight"얼마나 많은 공간이 실제 표시 내용이 테두리, 여백, 스크롤바를 차지 패딩을 포함하지만 포함하지 않음"을 반환

scrollWidth그리고 scrollHeight"그것의 많은 부분이 현재 표시 방법에 관계없이, 내용의 실제 크기의"를 반환

따라서 측정 된 내용이 현재 볼 수있는 영역을 벗어날 것으로 예상되는지 여부에 따라 다릅니다.


5

IE7 및 이전 버전에서만 계산해야합니다 (콘텐츠의 크기가 고정되어 있지 않은 경우에만). CSS 조건을 지원하지 않는 오래된 IE로 해킹을 제한하기 위해 HTML 조건부 주석을 사용하는 것이 좋습니다. 다른 모든 브라우저의 경우 다음을 사용하십시오.

<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>모든 크기의 중심 에 있으며 내용물의 크기에 맞게 줄 바꿈합니다.


3

요소 스타일을 수정하는 것은 쉽지만 값을 읽는 것은 까다 롭습니다.

Javascript에서 내장 메소드 호출 getComputedStyle을 사용하지 않으면 JavaScript는 css (internal / external)에서 오는 요소 스타일 특성 (elem.style)을 읽을 수 없습니다.

getComputedStyle (요소 [, 의사])

요소 : 값을 읽을 요소입니다.
의사 : 필요한 경우 의사 요소입니다 (예 : :: before). 빈 문자열이거나 인수가 없으면 요소 자체를 의미합니다.

결과는 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>

너비 / 높이 또는 기타 속성을 얻으려는 요소의 getComputedStyle을 포함하도록 JavaScript 코드를 수정했습니다.

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 상속이 적용된 후의 값입니다. height : 1em 또는 font-size : 125 %처럼 보일 수 있습니다.

해석 된 스타일 값은 요소에 마지막으로 적용되는 값입니다. 1em 또는 125 %와 같은 값은 상대적입니다. 브라우저는 계산 된 값을 가져와 모든 단위를 고정 및 절대로 만듭니다 (예 : height : 20px 또는 font-size : 16px). 지오메트리 속성의 경우 확인 된 값은 width : 50.5px와 같은 부동 소수점을 가질 수 있습니다.

오래 전 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


1

이전 게시물에서 제안한대로 element.offsetWidth 및 element.offsetHeight가 수행해야합니다.

그러나 컨텐츠를 중앙에 배치하려는 경우 더 나은 방법이 있습니다. xhtml 엄격한 DOCTYPE을 사용한다고 가정합니다. body 태그에 margin : 0, auto 속성 및 px의 필요한 너비를 설정하십시오. 내용이 페이지 중앙에 정렬됩니다.


1
나는 그가 수직으로도 중심을 맞추기를 원한다고 생각합니다. 이는 특정 기준 (예 : 알려진 크기의 콘텐츠)을 충족시킬 수 없다면 CSS의 올바른 고통입니다.
Greg

1

... 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>

0

또한이 코드를 사용할 수 있습니다 :

var divID = document.getElementById("divid");

var h = divID.style.pixelHeight;

1
흠, Chrome 및 IE9에서 작동하지만 Firefox에서는 작동하지 않는 것 같습니다. 특정 문서 유형에서만 작동합니까?
BrainSlugs83

1
pixelHeight는 더 이상 사용해서는 안되는 Internet Explorer 발명품입니다. stackoverflow.com/q/17405066/2194590
HolgerJeromin

0

브라우저의 디스플레이 포트 중앙에 배치해야하는 경우 CSS로만 달성 할 수 있습니다

yourSelector {
    position: fixed;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
} 

-2

다음은 특정 Dom 요소의 높이를 결정하는 WKWebView 코드입니다 (전체 페이지에서 제대로 작동하지 않음).

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 {

        }
    }
}

분명히, 이것은 iOS swift코드입니다. JavaScript가 아닙니다. 나는 공감대를 버리고 있지만 (b / c 실제로 유용 할 수 있음) 이것은 질문에 대답 하지 않으며 iOS 고유의 다른 질문에 더 적합 할 것입니다. 이미 존재하지 않는 경우 하나를 요청하고 자체 응답을 고려하십시오.
Zach Lysobey 21시 19 분

-3

offsetWidth가 0을 반환하면 요소의 스타일 너비 속성을 가져 와서 숫자를 검색 할 수 있습니다. "100px"-> 100

/\d*/.exec(MyElement.style.width)

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