JavaScript에서 DOM 요소 크기 및 위치 가져 오기

이 경우 사용되는 브라우저는 Chrome입니다.

1. 요소의 CSS 크기 얻기

1.1 요소의 인라인 스타일 얻기

<script>
  function boxInfo(){
    
    
    let box = document.getElementById('box');
    let w = box.style.width;
    let h = box.style.height;
    console.log(w,h) // 700px 800px
  }
</script>

<body>
  <div id="box" style="width: 700px;height:800px; background-color: pink;"></div>
  <button onclick="boxInfo()">测试</button>
</body>

스타일 속성에 값을 표시하기 만하면됩니다.

1.2 계산 된 스타일 얻기

<style>
  #box{
    
    
    width: 700px;
    height: 800px;
    padding: 10px;
    background-color: pink;
    border: 1px solid red;
  }
</style>

<script>
  function boxInfo(){
    
    
    var style = window.getComputedStyle ? window.getComputedStyle(box,null) : null || box.currentStyle;
    let w = style.width;
    let h = style.height;
    console.log(w,h) // 700px 800px
  }
</script>

<body>
  <div id="box" ></div>
  <button onclick="boxInfo()">测试</button>
</body>

참고 : 요소의 너비와 높이를 설정하지 않으면 기본 너비와 높이가 IE가 아닌 브라우저에서 반환되고 자동 문자열이 IE에서 반환됩니다.

1.3 <link> 및 <style> 태그로 작성된 스타일 가져 오기

<style>
  #box{
    
    
    width: 700px;
    height: 800px;
    padding: 10px;
    background-color: pink;
    border: 1px solid red;
  }
</style>

<script>
  function boxInfo(){
    
    
    var sheet = document.styleSheets[0];
    var rule = (sheet.cssRules || sheet.rules)[0];
    let w = rule.style.width;
    let h = rule.style.height;
    console.log(w,h) // 700px 800px
  }
</script>

<body>
  <div id="box" ></div>
  <button onclick="boxInfo()">测试</button>
</body>

cssRules (또는 규칙)는 인라인 및 링크 스타일의 너비와 높이 만 가져올 수 있지만 인라인 및 계산 된 스타일은 가져올 수 없습니다.

getComputedStyle과 element.style의 유사점 및 차이점 :

같은 점 :

  • 반환되는 모든 것은 CSSStyleDeclaration 객체입니다. 해당 속성이 취해지면 CSS camel case 쓰기 방법이 채택되고 float 속성에주의를 기울여야합니다.

차:

  • element.style은 요소의 인라인 스타일, 즉 요소 의 스타일 속성에 작성된 스타일 만 읽고 getComputedStyle에서 읽은 스타일은 인라인 스타일, 포함 된 스타일 및 외부 스타일을 포함한 최종 스타일 입니다.
  • element.style은 읽기와 쓰기를 모두 지원하지만 getComputedStyle은 읽기만 지원하고 쓰기는 지원하지 않습니다.

getComputedStyle을 사용하여 스타일을 읽고 element.style로 스타일을 수정할 수 있습니다.

요약 : 요소 크기를 얻기위한 위의 세 가지 CSS 방법은 요소의 CSS 크기 만 얻을 수 있지만 요소 자체의 실제 크기는 얻을 수 없습니다. 예를 들어, 패딩, 스크롤 막대, 테두리 등을 추가합니다.

2. 요소의 실제 크기 얻기

2.1 clientWidth 및 clientHeight

이 속성 그룹은 요소의 시각적 영역 크기와 요소 콘텐츠 및 내부 여백이 차지하는 공간의 크기를 가져올 수 있습니다.
요소 크기가 반환되지만 단위가 없습니다. 기본 단위는 px입니다. 100em과 같이 강제로 단위를 설정하면 여전히 px 크기를 반환합니다.
요소의 실제 크기에 대해 clientWidth 및 clientHeight는 다음과 같이 이해됩니다.

  • 프레임을 늘리고 변경하지 마십시오.
  • b. 변경하지 않고 바깥 쪽 여백을 늘리십시오.
  • c. 내부 여백을 늘리면 최종 값이 원래 크기에 안쪽 여백의 크기를 더한 값이됩니다.
  • d. 스크롤 막대를 늘리면 최종 값은 원래 크기에서 스크롤 막대 크기를 뺀 값과 같습니다.
<style>
  #box{
    
    
    background-color: green;
    width: 200px;
    height: 200px;
    border: solid 5px red;  /* 对应a理解,结果:200,200 */
    margin: 10px;           /* 对应b理解,结果:200,200*/
    padding: 20px;          /* 对应c理解,结果:240,240*/
    overflow: scroll;       /* 对应d理解,结果:223,223,223=200(css大小)+40(两边内边距)-17(滚动条宽度)*/
  }
</style>

<script>
  function boxInfo(){
    
    
    var box = document.getElementById("box");
    let w = box.clientWidth;
    let h = box.clientHeight;
    console.log(w,h) // 223 223
  }
</script>

<body>
  <div id="box" ></div>
  <button onclick="boxInfo()">测试</button>
</body>

참고 : CSS 너비와 높이를 설정하지 않으면 IE가 아닌 브라우저는 스크롤 막대와 패딩의 계산 된 크기를 계산하고 IE 브라우저는 0을 반환합니다 (IE8이 수정 됨).

2.2 scrollWidth 、 scrollHeight

scrollWidth : 오버플로로 인해 웹 페이지에 표시 할 수없는 보이지 않는 부분을 포함하여 요소의 전체 너비를 반환합니다.
scrollHeight : 오버플로로 인해 웹 페이지에 표시 할 수없는 보이지 않는 부분을 포함하여 요소 의 전체 높이를 반환합니다.

요소의 실제 크기에 대해 scrollWidth 및 scrollHeight는 다음과 같이 이해됩니다.

  1. 테두리를 늘리면 브라우저마다 해석이 다릅니다 (다음은 IE8에서 정상적으로 작동하고 IE6는 제대로 작동하지 않음) :
    a. Firefox 및 Opera 브라우저는 테두리 크기를 늘
    립니다 . b. IE, Chrome 및 Safari 브라우저는 크기를 무시합니다. 테두리]
    . C IE 브라우저 만의 독창적 인 콘텐츠의 높이를 표시;
  2. 안쪽 여백을 늘리면 최종 값은 원래 크기에 안쪽 여백 크기를 더한 값이됩니다.
  3. 스크롤 막대를 늘리면 최종 값은 원래 크기에서 스크롤 막대의 크기를 뺀 값이됩니다.
  4. 외부 여백을 늘리고 변경 사항은 없습니다.
  5. 콘텐츠 오버플로를 늘리면 Firefox, Chrome 및 IE가 실제 콘텐츠 높이를 얻고 Opera는 처음 세 브라우저에서 얻은 높이보다 작고 Safari는 처음 세 브라우저에서 얻은 높이보다 큽니다.
<style>
  #wrap{
    
    
    width: 200px;
    height: 200px;
    background-color: blue;
    padding: 20px;
    overflow: auto;
    border: 1px solid green; 
  }
  #box{
    
    
    width: 400px;
    height: 400px;
    padding: 10px;
    background-color: pink;
    border: 1px solid red;
    margin: 20px;                 
  }
</style>

<script>
  function boxInfo(){
    
    
    let box = document.getElementById("box");
    console.log(box.scrollWidth,box.scrollHeight) // 420 420
  }
</script>

<body>
  <div id="wrap">
    <div id="box"></div>
  </div>
  <button onclick="boxInfo()">测试</button>
</body>

2.3 offsetWidth 、 offsetHeight

이 속성 집합은 테두리, 패딩 및 스크롤 막대를 포함하여 요소의 실제 크기를 반환 할 수 있습니다. 요소 크기가 반환됩니다. 기본 단위는 px입니다. CSS 너비와 높이가 설정되지 않은 경우 계산 된 너비와 높이를 가져옵니다.
요소의 실제 크기에 대해 offsetWidth 및 offsetHeight는 다음과 같이 이해됩니다.

  1. 테두리를 늘리면 최종 값은 원래 크기에 테두리 크기를 더한 값이됩니다.
  2. 안쪽 여백을 늘리면 최종 값은 원래 크기에 안쪽 여백 크기를 더한 값이됩니다.
  3. 외부 여백을 늘리고 변경 사항은 없습니다.
  4. 스크롤 막대를 늘리면 변경 사항이 없으며 감소하지 않습니다.

요소의 크기를 얻으려면 일반적으로 블록 수준 (블록) 요소이며 CSS 크기가 설정된 요소를 사용하는 것이 더 편리합니다.
인라인 요소이거나 크기가 설정되지 않은 요소 일 경우 특히 번거롭기 때문에 사용시주의하는 것이 좋습니다.

<style>
  #box{
    
    
    background-color: green;
    width: 200px;
    height: 200px;
    border: solid 5px red;       /*结果:210,210*/
    margin: 10px;                /*结果:210,210(无变化)*/
    padding: 20px;              /*结果:250,250*/
    overflow: scroll;          /*结果:250,250(无变化)*/
  }
</style>

<script>
  function boxInfo(){
    
    
    var box = document.getElementById("box");
    let w = box.offsetWidth;
    let h = box.offsetHeight;
    console.log(w,h) // 250 250
  }
</script>

<body>
  <div id="box" ></div>
  <button onclick="boxInfo()">测试</button>
</body>

3. 요소의 주변 크기 (위치)를 가져옵니다.

3.1 clientLeft 、 clientTop

요소에서 설정 한 왼쪽 및 위쪽 테두리의 크기를 가져옵니다 (설정되지 않은 경우 0 반환). 현재는 왼쪽 및 위쪽 그룹 만 제공되고 오른쪽 및 아래쪽은 제공되지 않습니다.
네 변의 너비가 다른 경우 계산 된 스타일에서 직접 얻거나 위의 세 그룹에서 요소의 크기를 빼서 얻을 수 있습니다.

右边框的宽度:div.offsetWidth - div.clientWidth - div.clientLeft
底边框的宽度:div.offsetHeight - div.clientHeight - div.clientTop
<style>
  #box{
    
    
    width: 200px;
    height: 200px;
    border-top: solid 10px red;
    border-right: solid 20px #00ff00;
    border-bottom: solid 30px blue;
    border-left: solid 40px #808080;
  }
</style>

<script>
  function boxInfo(){
    
    
    var box = document.getElementById("box");
    console.log(box.clientLeft,box.clientTop) // 40 10
  }
</script>

<body>
  <div id="box" ></div>
  <button onclick="boxInfo()">测试</button>
</body>

3.2 offsetLeft 、 offsetTop

이 속성 세트는 상위 요소에 상대적인 현재 요소의 위치를 ​​가져올 수 있습니다. 위치 : 절대 위치로 설정하는 것이 가장 좋습니다. 그렇지 않으면 브라우저마다 해석이 다릅니다.

<style>
  #box{
    
    
    width: 200px;
    height: 200px;
    background-color: pink;
    position: absolute;        /* 将 position 设置为 absolute,则所有浏览器返回一样的值 */
    left: 30px;
    top: 20px;
    padding: 10px;            /* 30 20 加上内边距,不会影响它的位置 */
    border: 1px solid red;    /* 30 20 加上边框,不会影响它的位置 */
    margin: 50px;             /* 80 70 加上外边距,位置值会累加 */
  }
</style>

<script>
  function boxInfo(){
    
    
    var box = document.getElementById("box");
    console.log(box.offsetLeft, box.offsetTop) // 80 70
  }
</script>

<body>
  <div id="box" ></div>
  <button onclick="boxInfo()">测试</button>
</body>

3.3 scrollTop 、 scrollLeft

scrollLeft : 읽기-쓰기 요소의 왼쪽에서 스크롤 된 거리, 즉 요소의 왼쪽 가장자리와 요소에서 현재 보이는 콘텐츠의 가장 왼쪽 끝 사이의 거리;
scrollTop : 상단의 스크롤 된 거리 읽기-쓰기 요소, 즉 요소의 위쪽 가장자리와 요소 사이의 거리 현재 보이는 콘텐츠의 위쪽 사이의 거리.

  • 이 두 속성은 요소에 오버플로가 설정된 CSS 스타일에서만 사용할 수 있습니다. 그렇지 않으면이 두 속성은 의미가 없으며 오버플로 값은 visiblehidden, auto, scroll입니다.
  • 이 두 매개 변수의 값을 설정할 때 숫자를 직접 사용하십시오. 그렇지 않으면 작동하지 않습니다.
<style>
  #wrap{
    
    
    width: 300px;
    height: 300px;
    background-color: blue;
    padding: 20px;
    overflow: auto;
    border: 1px solid green; 
  }
  #box{
    
    
    width: 400px;
    height: 400px;
    background-color: pink;
    padding: 10px;    
    border: 1px solid red;    
    margin: 50px;            
  }
</style>

<script>
  function boxInfo(){
    
    
    var wrap = document.getElementById("wrap");
    wrap.scrollLeft = 100;  // 设置盒子左边滚出区域宽度为100像素
    wrap.scrollTop = 100;   // 设置盒子顶部滚出区域高度为100像素
    console.log(wrap.scrollLeft, wrap.scrollTop)  // 100 100
  }
</script>

<body>
  <div id="wrap">
    <div id="box" ></div>
  </div>
  <button onclick="boxInfo()">测试</button>
</body>

3.4 offsetParent

부모 요소를 가져
옵니다. 부모 요소 자체가 <body>이면 비 IE는 본문 개체를 반환하고 IE (IE6)는 html 개체를 반환합니다.
두 요소가 중첩 된 경우 부모 요소가 위치 지정 위치를 사용하지 않는 경우 : 절대 , offsetParent는 body 객체 또는 html 객체를 반환합니다.
따라서 offsetLeft 및 offsetTop을 가져올 때 CSS 위치 지정이 매우 중요합니다.

많은 수준에서 외부 레이어가 배치되었습니다. 내부 요소와 본문 또는 html 요소 사이의 거리를 어떻게 얻습니까?
즉, 페이지에서 요소의 위치를 ​​가져옵니다. 그런 다음 지속적으로 역 추적하고 누적하여 실현할 수있는 함수를 작성할 수 있습니다.

<style>
  #wrap{
    
    
    width: 300px;
    height: 300px;
    background-color: blue;
    padding: 20px;
    border: 1px solid green; 
    position: absolute;
    top:50px;
    left: 10px;
  }
  #box{
    
    
    width: 100px;
    height: 100px;
    background-color: pink;   
    border: 1px solid red;               
  }
</style>

<script>
  function boxInfo(){
    
    
    var box = document.getElementById("box");
    var left = box.offsetLeft;          // 得到第一层距离
    var parent = box.offsetParent;     // 得到第一个父元素
    while (parent !== null) {
    
             // 如果还有上一层父元素
      left += parent.offsetLeft;      // 把本层的距离累加
      parent = parent.offsetParent;  // 得到本层的父元素
    }
    console.log(left) // 30
    return left;
  }
</script>

<body>
  <div id="wrap">
    <div id="box"></div>
  </div>
  <button onclick="boxInfo()">测试</button>
</body>

3.5 getBoundingClientRect ()
는 네 가지 속성 (left, top, right, bottom)을 포함하는 직사각형 객체를 반환합니다. 각각 요소의 각면과 페이지의 상단 및 왼쪽 사이의 거리를 나타냅니다.
참고 : IE, Firefox3 +, Opera9.5, Chrome, Safari 지원. IE에서 기본 좌표는 (2,2)에서 계산되므로 최종 거리가 다른 브라우저보다 2 픽셀 더 길어집니다. 호환되어야합니다.

<style>
  *{
    
    
    margin:0px;
  }
  #box{
    
    
    width: 100px;
    height: 100px;
    padding: 10px;
    margin: 10px;
    background-color: pink;   
    border: 1px solid red;               
  }
</style>

<script>
  function boxInfo(){
    
    
    let box = document.getElementById("box");
    let top = box.getBoundingClientRect().top;           // 元素上边距离页面上边的距离
    let bottom = box.getBoundingClientRect().bottom;     // 元素下边距离页面上边的距离
    let left = box.getBoundingClientRect().left;         // 元素左边距离页面左边的距离
    let right = box.getBoundingClientRect().right;       // 元素右边距离页面左边的距离
    
    console.log(top,bottom,left,right) // 10 132 10 132
  }
</script>

<body>
  <div id="box"></div>
  <button onclick="boxInfo()">测试</button>
</body>

추천

출처blog.csdn.net/ZYS10000/article/details/113859389