C1:DOM 元素的尺寸和位置
DOM元素的尺寸和位置
DOM 元素的尺寸
DOM.offsetWidth/offsetHeight:
包括内容区宽/高,padding,border,不包括margin.
如果元素的box-sizeing是border-box,那么此时设置的style.width/style.height就是该元素的offsetWidth/offsetHeight.也就是等于内容区的宽/高 + padding + border + 滚动条。
DOM.clientWidth/clientHeight:
包括内容区宽/高,padding,不包括border 和margin.
在box-sizing:border-box的情况下,等于style.width/height - border的宽度。
这里还有另外一种换算方法:clientWidth/clientHeight = offsetWidth/height - border - 滚动条的宽/高
DOM.scrollWidth/scrollHeight:
包括内容区的宽/高,padding,以及子元素超出的宽/高,不包括border.
就是clientWidth / clientHeight 加上其子元素超出的宽/高。
box-sizing:border-box的情况也是一样。
值得注意的是:这里 DOM的子元素超出部分 的计算随着DOM的overflow的取值不同而略有不同。
如下:绿色盒子宽高100px,padding:20px;box-sizing:content-box里面有一个高度为200px的红色盒子
当绿色盒子的overflow为默认值的时候,绿色盒子的scrollHeight = 上边距 20px + 红色盒子的高度 = 220px
当绿色盒子的overflow属性为auto,scroll,hidden中的任意一个的时候,其scrollHeight = 上边距 + 下边距 + 红色盒子的高度 = 20 + 20 +200 = 240px
DOM.style.width/style.height:
返回style属性中的width和height。这两个值根据box-sizing 的取值不同所表示的范围也不同。
使用DOM.style.width/height 这种方式只能取到行内样式,而取不到CSS样式中的属性值。更多时候,我们可能需要的是这个方法:
window.getComputedStyle(DOM) 返回一个DOM元素计算后的style对象。
当box-sizing:content-box的时候,style.width/height = offsetWidth/height - 滚动条的宽/高 - border - 内边距。
当box-sizing :border-box的时候,style.width/height 就等于offsetWidth / offsetHeight
<html> 和<body> 的尺寸
<html> 的clientHeight 和clientWidth 永远等于viewport - 滚动条的宽度/高度(移动端除外),不论box-sizing的取值是什么。
<body> 的尺寸计算方式和普通的DOM元素是一样的。
Element.getBoundingClientRect()
返回一个DOMRect对象,包含left ,top,width,height 四个属性的边框集合
其中的left ,top 是相对于视口左上角而言的。如果元素滚动了,left,top值也是变化的。width/height就是元素的盒子模型(border + padding + content + 滚动条)的计算宽度和高度。对于html和body同样适用。
DOM元素的位置
使用element.getBoundingClientRect()我们可以得到元素相对于viewport的位置。
还有一种方法可以得到元素相对于最近定位的祖先元素的位置,就是使用element.offsetTop和element.offsetLeft 属性。
这里有另外一个可以得到元素相对于根元素(通常情况下根元素指的是视口),根据element.offsetParent 一直向上查找,直到element.offsetParent == null。html,body的offsetParent都为null.
let current = element.offsetParent
let top = element.offsetTop
while(current){
top = current.offsetTop
current = current.offsetParent
}
值得注意的是,element.offsetTop/offsetLeft的计算的是element元素外边框到包含它的元素的内边框之间的距离。所以严格上来说,应该还要依据情况加上边框的宽度的。但是边框一般不会很大,最多1px 2px,所以可以忽略。
click 事件中鼠标指针的位置
在PC,移动端的click事件中mouseEvent 都会包含以下信息:
e.clientX/e.clientY:
返回鼠标指针相对与浏览器窗口客户区的坐标。
e.pageX/e.pageY:
返回鼠标指针相对于整个文档的坐标。浏览器没有滚动条的时候,这个值和e.clientX/e.clientY 是一样的。但是有滚动条的时候,这个值就会比e.clientX/e.clientY大。
e.screenX/e.screenY
返回鼠标指针相对于整个屏幕的坐标。哪怕此时你的浏览器被你缩小了移动到了角落,它的计算基准都是物理屏幕的左上角。
e.offsetX/e.offsetY
返回鼠标指针相对于e.target的坐标,这一点要区别于e.currentTarget。由于事件的冒泡,所以当底层的元素点击事件冒泡到顶层的时候,在顶层事件处理函数中的event 对象中的offsetX/offsetY 还是相对于最初触发的底层元素。
如果祖先元素有translate,scale貌似这个值获取不对。。。
换一种方法获取吧,e.clientX,e.clientY配合element.getBoundingClientRect()
function getOffset(e){
let target = e.currentTarget
let rect = target.getBoundingClientRect()
return {
x: e.clientX - rect.left,
y: e.clientY - rect.top
}
}
这样子不管其祖先元素有没有设置transform,都可以在点击的时候获得鼠标指针位置相对于e.currentTarget的相对坐标。
移动端touch事件中一些关于位置的有用信息
移动端的touch 事件我们也能得到许多类似的信息,这些信息存在e.touches 的touch对象中。
touch.screenX/touch.screenY:
返回相对于屏幕边沿的坐标。
touch.clientX/touch.clientY:
返回相对于viewport边沿的坐标。
touch.pageX/touch.pageY:
返回相对于文档边沿的坐标。和clientX/clientY的区别跟上面差不多。
应该来说,这三个值在移动端很多时候都是相等的。
C1:DOM 元素的尺寸和位置的更多相关文章
- DOM元素的大小和位置
HTML: <div id="parent"> <div id="box"> 测试测试测试测试测试测试测试测试测试测试测试测试测试测试测 ...
- DOM元素的位置、尺寸及更多的信息
一.基本概念 document.documentElement是整个DOM树的根节点,对应的元素就是html.下面将其称作根元素或根节点. document.body,对应的元素是body 二.浏览器 ...
- jacascript 判断元素尺寸和位置
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! getBoundingClientRect() 判断一个元素的尺寸和位置是简单的方法就是使用 obj.ge ...
- web前端开发中常用的尺寸和位置
我们在日常web前端开发过程中,会经常用到各种尺寸和位置.通常是js做动画的时候.轮播图,滚屏动画,粒子,碰撞检测,拖拽,滚动加载等等.这里我将常用的尺寸和位置的获取进行总结,不包括canvas,SV ...
- JavaScript获取DOM元素位置和尺寸大小
在一些复杂的页面中经常会用JavaScript处理一些DOM元素的动态效果,这种时候我们经常会用到一些元素位置和尺寸的计算,浏览器兼容性问题也是不可忽略的一部分,要想写出预想效果的JavaScri ...
- 获取DOM元素位置和尺寸大小
JavaScript获取DOM元素位置和尺寸大小 在一些复杂的页面中经常会用JavaScript处理一些DOM元素的动态效果,这种时候我们经常会用到一些元素位置和尺寸的计算,浏览器兼容性问题也是不可忽 ...
- 深入学习jQuery元素尺寸和位置操作
× 目录 [1]尺寸设置 [2]位置设置 前面的话 对于javascript来说,元素尺寸有scroll.offset.client三大属性,以及一个强大的getBoundingClientRect( ...
- 使用html元素的getBoundingClientRect来获取dom元素的时时位置和大小
使用: var section = $('.section'):这是jquery包装的dom元素,其他前端框架返回的可能也是一个包装元素, 我们需要获得的是里面的html的dom元素 然后:secti ...
- vue 组件传递值以及获取DOM元素的位置信息
1.父组件 select_li.vue 1.1 父组件模板 <template> <div id='selectLi' ref="selectLi"> &l ...
随机推荐
- UI测试
先是从一张图开始,让大家看看这个图里有什么不妥: 接着告诉大家具体有哪些不妥: 然后结合这个找茬的过程分享下界面测试的概念和方法. 界面测试:简称UI测试,测试功能模块界面上看到的所有元素(包括空文字 ...
- Java---- 静态内部类与非静态内部类的区别
静态类(只有内部类才能被声明为静态类,即静态内部类)1.只能在内部类中定义静态类 2.静态内部类与外层类绑定,即使没有创建外层类的对象,它一样存在. 3.静态类的方法可以是静态的方法也可以是非静态的方 ...
- JQ向上取整 和向下取整 四舍五入
向上取整 var a = 23.2325236 var abc = Math.ceil(a); //注意:Math.ceil(a)不要单独写一行,否则向上取整失败 abc = 24; ...
- 移动端 app
上传到蒲公英
- 搭建私有CA并基于OpenSSL实现双向身份认证
0x00 前言 互联网上的Web应用由于用户数目广泛,都是采用单向身份认证的,只需要客户端验证服务端的身份.但如果是企业内部的应用对接,客户端数量有限,可能就会要求对客户端也做身份验证,这时就需要一个 ...
- mysql数据库查询过程探究和优化建议
查询过程探究 我们先看一下向mysql发送一个查询请求时,mysql做了什么? 如上图所示,查询执行的过程大概可分为6个步骤: 客户端向MySQL服务器发送一条查询请求 服务器首先检查查询缓存,如果命 ...
- Delphi 适合于文本文件的基本操作
- 学习Linux让我进入了知名企业 原
说起我学习Linux的原因是多方面的,大学时我学的是物理学师范专业,有部分计算机课程,但我觉得这些课程没什么实际作用,我自己对计算机比较感兴趣,我利用业余时间学习了很多计算机技术.在大学期间我参加了很 ...
- PHP7安装redis扩展
PHP7安装redis扩展优秀开源项目:http://github.crmeb.net/u/liaofeiyum -y install git git clone https://github.com ...
- 更换Red Hat Enterprise Linux 7 64位的yum为centos的版本
查看redhat原有的yum包有哪些: [root@localhost ~]# rpm -qa|grep yum yum-utils-1.1.31-24.el7.noarch yum-langpack ...