DOM 元素“大小”

杨济
• 阅读 1135

一、偏移量 (offset dimension)

元素的偏移量

偏移量,包括元素在屏幕上占用的所有可见空间。元素的可见大小由其高度、宽度决定,包括内容 content 大小、内边距 padding、滚动条 scrollbar 大小、边框 border 大小,不包括外边距 margin

通过下列 4 个属性可以取得元素的偏移量:

  • offsetHeight :元素在垂直方向上占用的空间大小,以像素计算。包括元素的高度、(可见的)水平滚动条的高度、上下边框高度。
  • offsetWidth :元素在水平方向上占用的空间大小,以像素计算。包括元素的宽度、(可见的)垂直滚动条的高度、左右边框的宽度。
  • offsetLeft :元素的左外边框至包含元素 offsetParent 的左内边框之间的像素距离。
  • offsetTop :元素的上外边框至包含元素 offsetParent 的上内边框之间的像素距离。

其中,MDN 对 offsetParent 的定义是:

HTMLElement.offsetParent 是一个只读属性,返回一个指向最近的(指包含层级上的最近)包含该元素的定位元素或者最近的 table,td,th,body元素。当元素的 style.display 设置为 "none" 时,offsetParent 返回 nulloffsetParent 很有用,因为 offsetTopoffsetLeft 都是相对于其内边距边界的。

需要补充的是,元素的 positionfixed 时,offsetParent 也返回 null。元素 body 的 offsetParent 也返回 null

DOM 元素“大小”

元素在整个页面上的偏移量:相对于文档的坐标

想要获取元素在页面上的偏移量,即元素在页面上的绝对横纵坐标,可以通过累加该元素及其各层包含元素的 offsetTopoffsetLeft 即可。示例代码如下:

function getElementLeft(element) {
    var actualLeft = element.offsetLeft;
    var current = element.offsetParent;

    while (current !== null) {
        actualLeft += current.offsetLeft;
        current = current.offsetParent;
    }

    return actualLeft;
}

function getElementTop(element) {
    var actualTop = element.offsetTop;
    var current = element.offsetParent;

    while (current !== null) {
        actualTop += current.offsetTop;
        current = current.offsetParent;
    }

    return actualTop;
}

需要注意的是,对于使用表格和内嵌框架布局的页面,由于不同浏览器实现这些元素的方式不同,因此得到的值不一定可信。另外,如果其中一层包含元素出现滚动条,这两个函数计算的值也不可用。

只读

所有的偏移量属性都是只读的,而且每次访问它们都需要重新计算。因此,我们应该尽量避免重复访问这些属性,以降低浏览器性能负担。在元素内容稳定的情况下,如果需要重复访问当中的某些属性值,我们应当将其保存为局部变量以提高性能。

二、客户区大小 (client dimension)

元素的客户区大小,指的是元素内容 content 及其内边距 padding 所占据的空间大小,不包括滚动条占用的空间

有关客户区大小的属性值有两个:

  • clientWidth :是元素内容区宽度加左右内边距的宽度。
  • clientHeight :是元素内容区高度加上下内边距的高度。

DOM 元素“大小”

需要注意的是,客户区大小的属性与偏移量一样都是只读属性,并且每次访问都会重新计算。

三、滚动大小 (scroll dimension)

元素的滚动大小,指的是包含滚动内容的元素大小。以下是 4 个与滚动大小相关的属性:

  • scrollHeight :在没有滚动条的情况下,元素内容的总高度。
  • scrollWidth :在没有滚动条的情况下,元素内容的总宽度。
  • scrollLeft :被隐藏在内容区域左侧的像素数。通过设置这个属性可以改变元素的左右滚动位置。
  • scrollTop :被隐藏在内容区域上方的像素数。通过设置这个属性可以改变元素的上下滚动位置。

DOM 元素“大小”

举个例子来说明:
带滚动条时,以上图为例,设置了 overflow: auto 的元素是带滚动条的、黑色边框的元素 parent,内部灰色元素是 child。parent.clientHeight 的值为 parent 的内容高度和上下内边框高度之和。但 parent.scrollHeight 等于其内部元素 child 的客户区高度即 child.clientHeight

四、确定元素大小

现代浏览器为每个元素都提供了一个便捷的方法 getBoundingClientRect() 来获取元素的大小及位置信息。这个方法返回一个矩形对象 DOMRect。其中包含属性元素左上角的视口坐标 x y、元素四边的视口位置 left top right bottom、元素偏移量大小 width height

请注意区分上文提到的文档坐标和视口坐标的区别:

  • 文档坐标指的是相对于整个页面文档的坐标位置。
  • 视口坐标指的是相对于浏览器窗口可见视口的坐标位置。
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皮卡皮卡皮 皮卡皮卡皮
4年前
javaScript. Dom 基本操作
DOM节点查找jsdocument.getElementById()//通过id查找document.getElementsByTagName()//通过标签名document.getElementsByName()//通过name名查找document.getElementsByClassName("类名")//通过类名获取元素对象documen
秃头王路飞 秃头王路飞
2年前
总结前端元素的各种高度(上)
HTMLElement.clientHeight只读属性Element.clientHeight对于没有定义CSS或者内联布局盒子的元素为0;否则,它是元素内部的高度(以像素为单位),包含内边距,但不包括边框、外边距和水平
Wesley13 Wesley13
3年前
03. react 初次见面
    与浏览器的DOM元素不同,React当中的元素事实上是普通的对象,ReactDOM可以确保浏览器DOM的数据内容与React元素保持一致。1、将元素渲染到DOM中    首先我们在一个HTML页面中添加一个id"root" 的<div:<divid"root"
Stella981 Stella981
3年前
Python+Selenium自动化篇
本篇文字主要学习selenium定位页面元素的集中方法,以百度首页为例子。0.元素定位方法主要有:id定位:find\_element\_by\_id('')name定位:find\_element\_by\_name('')class定位:find\_element\_by\_class\_name(''
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
CSS 分类 (Classification)
★★CSS分类属性(Classification)★★⑴CSS分类属性允许你控制如何显示元素,设置图像显示于另一元素中的何处,相对于其正常位置来定位元素,使用绝对值来定位元素,以及元素的可见度。⑵下面是常用的属性以及描述:!(https://oscimg.oschina.net/oscnet/00cb565
分布式系统的主键生成方案对比 | 京东云技术团队
UUID​UUID(通用唯一识别码)是由32个十六进制数组成的无序字符串,通过一定的算法计算出来。为了保证其唯一性,UUID规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素,以及从这些元素生成UUID的算法。