简述浏览器中的clientTop/Height/X、offsetTop/Height/X、scrollTop/Height/X

216 阅读2分钟

背景

本人最近在公司中接触到了一个低代码的BI可视化项目,因此涉及到很多拖拽相关的知识,难免会与浏览器中元素的宽高距离打交道,在此之前一直对各种宽高距的概念很模糊,故在此已较为精简文字加以总结,以备后续查阅。如有错误的地方也欢迎指正。

一、width/height

1. clientWidth/clientHeight

clientWidth/clientHeight为元素不包含边框的宽高,也就是元素的内容宽高,因此其计算方式可根据元素box-sizing分为两种情况:

  • box-sizingborder-box时:

    • clientWidth = width - 左border - 右border
    • clientHeight = height - 上border - 下border
  • box-sizingcontent-box时:

    • clientWidth = width + 左paddig + 右padding
    • clientHeight = height + 上paddig + 下padding

2. offsetWidth/offsetHeight:

offsetWidth/offsetHeightclientWidth/clientHeight刚好相反,其为元素总的宽高,即包含边框的宽高,其计算方式也可根据元素box-sizing分为两种情况:

  • box-sizingborder-box时:

    • offsetWidth = width
    • offsetHeight = height
  • box-sizingcontent-box时:

    • clientWidth = width + 左border + 右border
    • clientHeight = height + 上border + 下border

3. scrollWidth/scrollHeight:

offsetWidth/offsetHeight除了可视内容(clientWidth/clientHeight)以外,还包括由于overflow属性的设置溢出而在屏幕上不可见的内容。因此它也分为两种情况:

  • 当在内容区没有溢出时:

    • scrollWidth = clientWidth
    • scrollHeight = clientHeight
  • 在内容区发生溢出并且设置了overflow:scroll等属性时:

    • scrollWidth = clientWidth + 溢出的内容区的宽度
    • scrollHeight = clientHeight + 溢出的内容区的高度

注意这里的宽高也不包含边框

二、left/top

1. clientLeft/clientTop:

clientLeft/clientTop为元素的左/上边框宽度,即:

  • clientLeft = 左boder
  • clientTop = 上boder

2. offsetLeft/offsetTop:

offsetLeft/offsetTop为自身边框到最近的带有定位属性的父元素的左/上边框(不含边框)的距离

3. scrollLeft/scrollHeight:

scrollLeft/scrollHeight 为内容区到溢出部分左边或上边的距离(包括边框),即滚动条滚动距离

  • scrollLeft = 左boder + 溢出的内容区的宽度
  • scrollTop = 上boder + 溢出的内容区的高度

三、X/Y

  • ScreenX/ScreenY: 距离屏幕左/上边的距离

  • LayerX/LayerY: 距离最近的带有定位属性的父元素左/上边的距离(包括父元素边框)

  • ClientX/ClientY: 距离浏览器视口左/上边的距离,不考虑溢出部分的宽/高

  • PageX/PageY: 距离浏览器视口左边的距离(ClientX/ClientY) + 溢出部分的距离(滚动条滚动的距离)

  • OffsetX/OffsetY: 距离当前容器左边的距离(不包括容器的边框)