javascript中元素的尺寸和位置

78 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

1. 可视宽高 clientWidth/clientHeight

说明:包含 content + padding
只读属性,属性值的类型数字
如果内容溢出造成滚动条,会相应减去滚动条的宽度

    div {
      box-sizing: border-box;
      width: 400px;
      height: 300px;
      border: 20px solid burlywood;
      background-color: antiquewhite;
      overflow: auto;
    }
 <div> </div>
  var div = document.querySelector('div');
  console.log(div.clientWidth); //360
  console.log(div.clientHeight); //260

8e4f12a904ae06bc53806c1632b84d5.png

当在div内加一个宽高都比自己多的元素,再看一下他的clientWidth和clientHeight如图

<style>
  section {
      width: 1000px;
      height: 1000px;
      background-color: aquamarine
    }
</style>
  <div>
    <section></section>
  </div>
  <script>
  console.log(div.clientWidth); //343
  console.log(div.clientHeight); //243
  </script>

fa740987ae6fb482894b0700a358483.png

由此可见获取到的clienWidth和clientHeight时,如果内容溢出造成滚动条,会相应减去滚动条的宽度

clientWidth和clientHeight常用于获取浏览器窗口大小,还可监听浏览器窗口变化

  var html = document.documentElement;
    window.onresize = function () {
        console.log('大小正在变化');
        console.log(html.clientWidth, html.clientHeight);
    };

2. 实际宽高 offsetWidth/offsetHeight

说明:包含 border + padding + content
和内容大小无关
只读属性,属性值的类型 数字

console.log(div.offsetWidth, div.offsetHeight);//400 300

6428928775032cfb8ff82ba96170694.png

f0580407547a3c06dfdc6f0eacd48d6.png 由上面两图看出offsetWidth和offsetHeight是包含border的,且就算内容超出显示滚动条,也不会改变offsetWidth和offsetHeight的值,所以和内容的大小无关

3.左边框厚度clientLeft和上边框厚度clientTop

说明:只读属性,属性值的类型 数字
更改div的border宽度,打印可得出左边框厚度和上边框厚度

  div {
       border-width: 10px 20px 30px 40px;
    }
  <script>
  console.log(div.clientLeft, div.clientTop);//40 10
  </script>

4.内容宽高 scrollWidth/scrollHeight

说明:如果没有内容溢出,则等同于 clientWidth/clientHeight
如果存在内容溢出,是内部元素空间的大小,包含内边距区域且不包含滚动条,只读属性;

091543fa23cd5ac9b1becd1ed281ed8.png

console.log(div.scrollWidth, div.scrollHeight); //360 260 

由此可见如果没有内容溢出,scrollWidth/scrollHeight等同于 clientWidth/clientHeight

当元素超出又会怎么打印

 <style>
    section {
      width: 1000px;
      height: 1000px;
      background-color: aquamarine;
      padding: 20px 30px 40px 50px;
    }
 </style>
  <div>
    <section></section>
  </div>

6b3b89b5a34eeca4db1644e84548413.png
由图可见如果存在内容溢出,是内部元素空间的大小,包含内边距区域且不包含滚动条

5.搭配绝对定位属性的 offsetLeft/offsetTop

说明:包含元素的 left/top 样式值 + 自身左侧/上方外边距
只读属性

<style>
      div {
      box-sizing: border-box;
      width: 400px;
      height: 300px;
      border: 20px solid burlywood;
      background-color: antiquewhite;
      overflow: auto;
      position: absolute;
      left: 300px;
      top: 100px;
      margin: 10px 20px 30px 40px;
    }
</style>
<script>
console.log(div.offsetLeft, div.offsetTop);
</script>

4695b5dfdaf048eac56f8d601d4aca2.png

由上图显示的打印值可见:offsetLeft/offsetTop包含元素的 left/top 样式值 + 自身左侧/上方外边距

6.滚动距离 scrollTop/scrollLeft

说明:监听滚动事件,动态获取滚动过的距离
可读写

  div.onscroll = function () {
        console.log(div.scrollTop, div.scrollLeft);
        if (div.scrollTop > 200) {
            div.scrollTop = 200;
        }
    }

2230b8f5a6d90456e1403dc0b8d3f95.png

通过div的onscroll事件获取当前的scrollTop/scrollLeft,并且当scrollTop大于200时,修改scrollTop为200,由上图可知scrollTop/scrollLeft具有读写属性,而且scrollTop常用于返回顶部,scrollTop也可实现类似于聊天室,微信来新信息向上弹出!