js获取元素宽高、位置相关知识汇总
常见clientWidth、clientHeight、offsetWidth、offsetLeft,clientX、scrollTop等词语,比较混乱,现在总结下他们的区别。
1. clientWidth:元素的宽度(width+padding),offsetWidth相比clientWidth,多个border的值 ( width+padding+border)。clientHeight 、 offsetHeight略
- //某个元素的宽度和高度
- var div1 = document.getElementById('div1');
- console.log('元素的宽width+padding', div1.clientWidth );
- //body的宽度
- console.log('body的宽',document.body.clientWidth);
- //可视区的宽度,也就是html的宽度
- console.log('可视区的宽', document.documentElement.clientWidth );
- //可视区的宽度高度:你可以调整浏览器窗口大小调整的,body的高度不设置的话是根据内容来的,内容少,浏览器不出现滚动条,body的高度小于可视区高度,内容多,浏览器出现滚动条,body的高度大于可视区高度。
但是css3有个属性:box-sizing
- box-sizing: content-box|border-box|inherit
比如,div1设置
- <style type="text/css">
- #div1 {
- width: 200px;
- height: 200px;
- padding: 50px;
- border: 10px solid #000000;
- }
- </style>
box-sizing默认是content-box,就是width不包含padding和border的模式,测试,IE7+及其他浏览器正常,显示 clientWidth为50+200+50=300,offsetWidth为10+50+200+50+10=320,多了2边的border。
IE6下clientWidth为180,offsetWidth为200,因为6下的width是包含padding和border的,但是没人用ie6了,不细说
但是说明一个问题,clientWidth显示的很准确,就是实际width+padding的值,ie6下这个值比较小,也显示小了。
div1加上 box-sizing:border-box;再看看什么反应,IE7不认识 box-sizing:border-box; 出现结果和不加 box-sizing:border-box;一样,其他浏览器都是 clientWidth为180,offsetWidth为200。
结论就是:
1.clientWidth的值挺准确的,去掉边框的“盒子”占多少像素就显示多少像素。box-sizing的设置影响到了实际显示,也自然的影响到了clientWidth的值。
2.offsetWidth就是clientWidth加上两边border
3.clientWidth的值可以读,但是不能写。例如写: div1.clientWidth = 500; div1并不会变大,有些浏览器报警告或错误。
2. clientX,clientY是事件中的概念, 鼠标点击时候距离可视区的左侧和上侧坐标,数据是在事件的细节的event对象中
- document.onclick = function (ev) {
- //IE和谷歌用window.event
- //火狐等用事件函数的第一个参数
- var ev = ev || window.event;
- console.log(ev.clientX,ev.clientY);
- }
3.scrollTop、scrollLeft 是指页面内容太长,有滚动条了,已经滚动的距离。上面clientX和clientY都是针对可视区的,但是很多时候,我们想知道的是针对页面内容的距离,才方便我们下一步定位等操作,所以要结合scrollTop、scrollLeft使用
但是,但是,要注意:scrollTop它们存在兼容性问题。
浏览器出现滚动条是谁的? 答:只有谷歌浏览器认为滚动条是body的(document.body.scrollTop),其他浏览器都认为是html的,也就是可视区的(document.documentElement.scrollTop),为了在有限的范围显示大页面,才出现的滚动条。为了兼容,代码如下:
- //有scrollTop和scrollLeft,没有scrollBottom和scrollRight
- document.onscroll = function(){
- var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
- console.log(scrollTop);
- }
4. 待续
js获取元素宽高、位置相关知识汇总的更多相关文章
- JS获取元素宽高的两种情况
JS获取元素宽高分两种情况, 一.内联样式,也就是直接把width和height写在HTML元素中的style里: 这种情况使用 document.getElementById('xxx'). ...
- 原生JS获取元素宽高实践详解
开篇的话 任何不是亲身实践中求得的知识,都不是属于你的.任何求得的知识不去时常温习运用,也不是属于你的. 记录由来 在做个上拉广告功能中遇到了一个"理所当然"觉得对的用法,慢慢才排 ...
- js 获取元素宽高
可以用源生js的.offsetHeight .offsetWidth属性 document.getElementById("temp_form").offsetHeight // ...
- js 获取元素宽
第一种情况就是宽高都写在样式表里,就比如#div1{width:120px;}.这中情况通过#div1.style.width拿不到宽度,而通过#div1.offsetWidth才可以获取到宽度. 第 ...
- JS获取网页宽高方法集合
JS获取网页宽高等方法的集合:document.body.clientWidth - 网页可见区域宽document.body.clientHeight - 网页可见区域高 document.body ...
- 原生js获取元素的各种位置(大全)
加给元素: offsetLeft (距离定位父级的距离) offsetTop (距离定位父级的距离) offsetWidth (可视宽度) offsetHeight (可视高度) clientLeft ...
- 微信小程序之动态获取元素宽高
我以前一直以为微信小程序不能动态获取view元素的宽高.但是自从看到: wx.createSelectorQuery() 这个api接口,以前的某些问题就能得到解决了... 那么,这个api接口怎么用 ...
- 滚动加载图片(懒加载)实现原理(这是旧实现,仅做为获取元素宽高api的参考)
https://www.cnblogs.com/flyromance/p/5042187.html 本文主要通过以下几方面来说明懒加载技术的原理,个人前端小菜,有错误请多多指出 一.什么是图片滚动加载 ...
- js获取各种宽高方法
屏幕的有效宽高: window.screen.availHeightwindow.screen.availWidth 网页可见区域宽:document.body.clientWidth 网页可见区域高 ...
随机推荐
- Java的二分搜索树
定义 二分搜索树是二叉树(不包含重复元素). 二分搜索树的每个节点的值,大于左子树的所有节点的值,小于其右子树的所有节点的值. 每一棵子树也是二分搜索树. 二叉树搜索树必须要有比较,继承Compara ...
- 数据库~dotnetcore连接Mysql插入中文失败
到目录 在dotnetcore里,连接mysql数据,插入中文时出现无法识别,并提示插入失败的情况,分析后得知它是编码问题,即数据库编码问题,你的中文在数据表里无法被识别! 解决方法(一) 进行mys ...
- C#语法——事件,逐渐边缘化的大哥。
事件是C#的基础之一,学好事件对于了解.NET框架大有好处. 事件最常见的比喻就是订阅,即,如果你订阅了我的博客,那么,当我发布新博客的时候,你就会得到通知. 而这个过程就是事件,或者说是事件运行的轨 ...
- Python两步实现关联规则Apriori算法,参考机器学习实战,包括频繁项集的构建以及关联规则的挖掘
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
- [转]使用nodejs-koa2-mysql-sequelize-jwt 实现项目api接口
本文转自:https://blog.csdn.net/yibowanbo/article/details/80521849 nodejs-koa2-mysql-sequelize-jwt技术栈:nod ...
- wkhtmltox实现网页转换成图片或pdf
1.先下载http://download.gna.org/wkhtmltopdf/obsolete/windows/wkhtmltox-0.11.0_rc1-installer.exe,安装 2.在命 ...
- webpack 单独打包指定JS文件(CopyWebpackPlugin)
背景: 不确定打出的前端包所访问的后端IP,需要对项目中IP配置文件单独拿出来,方便运维部署的时候对IP做修改.因此,需要用webpack单独打包指定文件.npm install --save-dev ...
- IGP和BGP路由协议配合降低非核心路由器的路由容量的实验与总结
IGP和BGP路由协议配合降低非核心路由器的路由容量的实验与总结 一.结论 通过eBGP协议,可以显著降低对非核心路由器的路由容量要求,因为核心路由器的数量明显少于非核心路由器,所以,通过此措施既可以 ...
- 高通MSM8998 ABL的调试
高通在MSM8998上引入了UEFI,用来代替LK(Little Kernel).高通UEFI由XBL和ABL两部分组成.XBL负责芯片驱动及充电等核心应用功能.ABL包括芯片无关的应用如fastbo ...
- Android探究之Gson@SerializedName
@SerializedName注解的意义 当我们使用Gson解析Json数据时都会创建一个对应实体类,有时候Json数据里面的字段是Java关键词或者Json数据里面的字段太简单,我们想在实体类中自定 ...