前言

很多年前有记入过一篇 box-sizing 和 dom width.

想想也挺可悲的, 那年我是负责后端的, 却要帮着前端去学习这些知识来解决问题...

也好, 现在 full stack, 也算没有浪费当年的努力. 这篇是翻新版本.

和 Dimension 相关的属性

我这里以 div height 作为例子. 你把它们都换成 width 理解也是一样的.

offset-height

client-height

height (getComputedStyle)

scroll-height

rect height (getBoundingClientRect)

以上就是常见的高度

影响 dimension 的属性

它们会被

box-sizing

border

padding

scale

有没有 scollbar 影响

但不受 margin, outline 影响 (许多人误以为会)

各个属性计算

offset-height

它是 border to border

border, padding, scrollbar, content 全算在内,除了 margin

红色是 border, 粉红色是 padding, 右边红线表示它计算的范围

client-height

它是 padding to padding 扣掉 scrollbar

padding, content 算,margin, border, scrollbar 不算。

scrollbar 一般上是在 padding 里面 (重叠的),如果没有 padding 或者 padding size 小于 scrollbar,那 content 会被挤压。

height (getComputedStyle)

height 的计算 depend on box-sizing

border-box 情况下, height 包括 border 和 padding.

content-box 情况下, heigth 不包括 padding 和 border (当然也不包括 scrollbar)

scroll-height (对标 client-height)

在 hug content 的情况下, scroll-height 和 client-height 始终是一致的.

只有在 overflow-y: auto 的情况下才会使用到 scroll-height. (注意: visiable 情况下 scroll-height 的计算和 auto 是不同的哦, 我也没有搞懂, 但一般场景都是 auto 嘛, 以后再研究呗)

当 overflow-y 的时候, client-height 就变小了.

这个时候通过 scroll-height 就可以拿到原本的 client-height 的尺寸.

容易混淆的情况:

假设出现了 horizontal scrollbar, 请问 scroll-height 和 client-height 一样吗?

答案是 yes. 因为那是 horizontal scrollbar, 仅代表 width 的内容超过了, height 并没有, 而 scroll-height 是看有没有 vertical scrollbar 的出现.

同时 client-height 会少算 horizontal scrollbar 同样的 scroll-height 也会少算 horizontal scrollbar.

rect height (getBoundingClientRect) (对标 offset-height)

在没有 scale 的情况下, 它和 offset-height 始终保持一致.

有 scale 的情况下, 它获取的是 scale 之后的高度. 比如 offset-height 是 100px, scale 1.5

那么 reat height 就是  100 x 1.5 = 150px

另外, rect height 比 offset-height 精准,因为 rect height 有小数点,而 offset-height 是 int 它会自动 rounding。

也可以参考这里

经典图片

MouseEvent 的 Coordinate

mouse event 里有 4 种 coordinate info.

分别是 page, screen, client, offset

场景说明:

2 个 section 2 个 box

offset coordinate

event.offsetX, event.offsetY

event listening 的 target element 和 mouse click 点之间的距离 (AKA target relative)

注意 parent child 冒泡的情况

假设 parent pink color div 有 mouseenter event

当 mouse 进入 parent pink color div。它的 offset 对标的是 parent div。上图的第一个红点。

当 mouse 进入 child blue color div。它的 offset 对标换成了 child div,不再是 parent div 了。

虽然 event 只绑定在 parent div,但是 offset x,y 认的是最靠近的 offset element。

另外一点需要注意,当有 transform 的时候

虽然 img 有 translate 了,但是 mouse click 图片左上角依然拿到 0,0

img scale(2),虽然 mouse click 的距离 actual 是 220,80 但是获取到的是 110, 40,因为放大了一倍,所以少了一半。

这就是它的效果。注意咯

screen coordinate

event.screenX, event.screenY

mouse click 点和 screen 的距离. 注意哦, 我的 browser 是缩小的, 它依然是计算到最外面 monitor screen 的距离. (AKA screen relative)

client coordinate

event.clientX, event.clientY

clientX, Y 是最常被使用到的. 它和 getBoundingClientRect x,y 一样. (AKA window relative)

page coordinate

page 和 client 类似, 只是它有算 scroll, 所以会比 client 多. (AKA document relative)

DOM – Dimension & Coordinate (offset, client, computed, rect)的更多相关文章

  1. JavaScript中的 offset, client,scroll

    在js 中我们要用到的 offset, client, scroll 在这我把自己理解的给大家分享一下. offset div.offsetTop 指div距离上方或上层控件的距离,单位像素 div. ...

  2. offset/client/scroll一些总结

    offset/client/scroll一些总结 1.offset 首先offset共有五个值 1.offsetParent 2.offsetTop 3.offsetLeft 4.offsetWidt ...

  3. js中 offset /client /scroll总结

    offset家族(只能读取,不能操作): offsetLeft:元素的边框的外边缘距离与已定位的父容器(offsetparent)的左边距离(就是子元素左边框到父元素左边框的距离). offsetTo ...

  4. js 元素offset,client , scroll 三大系列总结

    1,element.offsetWidth : 包括 padding 和 边框 2,element.clientWidth : 包括 padding ,不包含边框 , 内容超出会溢出盒子的时候,就用s ...

  5. offset client scroll

    offsetHeight offsetWidth返回为元素在屏幕上显示大小,不包括外边距 clientHeight clientWidht 和上面两个类似,不同的是,这两个不包括外边距高度. < ...

  6. js中常用的offset client screen对象

    javascript中offsetWidth.clientWidth.width.scrollWidth.clientX.screenX.offsetX.pageX offsetWidth //返回元 ...

  7. scroll offset & client总结

    oEvent.clientX 是指鼠标到可视区左边框的距离. oEvent.clientY 是指鼠标到可视区上边框的距离. clientWidth  是指可视区的宽度. clientHeight  是 ...

  8. Html 中scroll offset client 总结

    HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth scrollHeight: 获取对象的滚动高度. scrollLeft:设置或获取位于对 ...

  9. bom中的offset,client,scroll

    简单明了

  10. python 全栈开发,Day52(关于DOM操作的相关案例,JS中的面向对象,定时器,BOM,client、offset、scroll系列)

    昨日作业讲解: 京东购物车 京东购物车效果: 实现原理: 用2个盒子,就可以完整效果. 先让上面的小盒子向下移动1px,此时就出现了压盖效果.小盒子设置z-index压盖大盒子,将小盒子的下边框去掉, ...

随机推荐

  1. Asp .Net Core 系列:基于 T4 模板生成代码

    目录 简介 组成部分 分类 Visual Studio 中使用T4模板 创建T4模板文件 2. 编写T4模板 3. 转换模板 中心控制Manager 根据 MySQL 数据生成 实体 简介 T4模板, ...

  2. [oeasy]python020在游戏中体验数值自由_勇闯地下城_终端文字游戏

    继续运行 回忆上次内容 上次使用shell环境中的命令 命令 作用 cd 改变文件夹 pwd 显示当前文件夹 ls 列出当前文件夹下的内容 最终 进入 目录 找到 游戏   如果git clone 根 ...

  3. selenium屏蔽启动浏览器启动时的提示信息

    代码 from selenium import webdriver from selenium.webdriver import Remote from webdriver_helper import ...

  4. Spring 常用的三种拦截器详解

    前言 在开发过程中,我们常常使用到拦截器来处理一些逻辑.最常用的三种拦截器分别是 AOP. Interceptor . Filter,但其实很多人并不知道什么时候用AOP,什么时候用Intercept ...

  5. Apachepoi读写Excel实例

    /* * 通过poi创建Excel并写入内容 * */ public static void write() throws IOException { //在内存中创建excel XSSFWorkbo ...

  6. Python列表、元组、字典和集合的用法

    1.列表 标志符号是[],元素可以修改.删除和新增 1.1 提取元素(索引从0开始计算) testList=['A','B','C',1,'D'] print(testList[1]) #打印索引区间 ...

  7. 对比python学julia(第一章)--(第三节)山巅一寺一壶酒

    在小学阶段背过圆周率的同学对这节的标题应该不陌生.π(3.14159-)是大家熟悉的普通无理数,但也是非常神秘的一组数字,例如几个世纪以来,埃及考古学家和神秘主义追随者一直痴迷于胡夫金字塔暗藏的圆周率 ...

  8. 【VMware】将NAT虚拟机开放访问

    NAT模式下面需要将主机内的虚拟机提供给外部访问 这个设置可以通过开启端口来实现外部访问NAT虚拟机 主机端口 - 映射 虚拟机 IP 的端口,问题是有多少个虚拟机应用就需要开多少个端口...

  9. 【微信小程序】03 配置项

    全局配置项: https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/app.html 属性 类型 必填 描述 ...

  10. 硬盘测速工具中的队列深度是个什么东西——CrystalDiskMark中的Q32T16是什么意思

    ================================ 最近有使用CrystalDiskMark给自己的硬盘做测速,发现有个名词自己不是很理解,就是像Q32T16这样的词: 在网上找了好久, ...