常见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获取元素宽高、位置相关知识汇总的更多相关文章

  1. JS获取元素宽高的两种情况

    JS获取元素宽高分两种情况, 一.内联样式,也就是直接把width和height写在HTML元素中的style里: 这种情况使用     document.getElementById('xxx'). ...

  2. 原生JS获取元素宽高实践详解

    开篇的话 任何不是亲身实践中求得的知识,都不是属于你的.任何求得的知识不去时常温习运用,也不是属于你的. 记录由来 在做个上拉广告功能中遇到了一个"理所当然"觉得对的用法,慢慢才排 ...

  3. js 获取元素宽高

    可以用源生js的.offsetHeight .offsetWidth属性 document.getElementById("temp_form").offsetHeight // ...

  4. js 获取元素宽

    第一种情况就是宽高都写在样式表里,就比如#div1{width:120px;}.这中情况通过#div1.style.width拿不到宽度,而通过#div1.offsetWidth才可以获取到宽度. 第 ...

  5. JS获取网页宽高方法集合

    JS获取网页宽高等方法的集合:document.body.clientWidth - 网页可见区域宽document.body.clientHeight - 网页可见区域高 document.body ...

  6. 原生js获取元素的各种位置(大全)

    加给元素: offsetLeft (距离定位父级的距离) offsetTop (距离定位父级的距离) offsetWidth (可视宽度) offsetHeight (可视高度) clientLeft ...

  7. 微信小程序之动态获取元素宽高

    我以前一直以为微信小程序不能动态获取view元素的宽高.但是自从看到: wx.createSelectorQuery() 这个api接口,以前的某些问题就能得到解决了... 那么,这个api接口怎么用 ...

  8. 滚动加载图片(懒加载)实现原理(这是旧实现,仅做为获取元素宽高api的参考)

    https://www.cnblogs.com/flyromance/p/5042187.html 本文主要通过以下几方面来说明懒加载技术的原理,个人前端小菜,有错误请多多指出 一.什么是图片滚动加载 ...

  9. js获取各种宽高方法

    屏幕的有效宽高: window.screen.availHeightwindow.screen.availWidth 网页可见区域宽:document.body.clientWidth 网页可见区域高 ...

随机推荐

  1. Linux配置成网关

    之前按照诸葛建伟的metasploit魔鬼训练营搭了个简单的内网环境,其中就是一台linux作为内网网关.但是虚拟机开启的时候经常出现包不能转发的情况,也就是网关没有配置好. 在网上找了好几个才找到适 ...

  2. 【Python3爬虫】使用异步协程编写爬虫

    一.基本概念 进程:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动.进程是操作系统动态执行的基本单元. 线程:一个进程中包含若干线程,当然至少有一个线程,线程可以利用进程所拥有的资源.线程 ...

  3. Linux相关学习笔记-文件系统

    在Linux的文件系统中, 相应的文件都按其作用分门别类地放在相关的目录中 以下是最近整理学习的一些, linux中的文件存放 /bin 二进制可执行命令 /dev 设备特殊文件  // 外部设备文件 ...

  4. SiftGPU在Ubuntu和Windows下的编译与使用

    Sift特征应该是使用最多的局部特征了,但是相比其他的一些特征描述符,计算sift特征描述符的时间较长.Changchang Wu使用GPU加速,实现了GPU版的sift特征提取SiftGPU. Si ...

  5. 为 Eureka 服务注册中心实现安全控制

    上一篇Eureka 实现微服务注册发现讲了用 Eureka 实现单体版的服务注册与发现.因为本篇是在上一篇的基础上的一点扩充,所以读此篇之前要保证看了上一篇. Eureka 如果不加安全控制,会存在下 ...

  6. C#面向对象(1)

    一.面向对象(OOP) 面向过程 面向过程就是分析出解决问题的所需要的步骤,然后每个步骤使用函数实现,使用时将函数依次调用即可 C语言 面向对象 对象:生活中真实存在的事物(电脑.手机.草.树.... ...

  7. Xamarin 开发Android应用简易教程(1)

    最近领导又安排了新的项目需求,只好学习学习如何在.net环境下开发APP(原来没有接触过App开发)! 1.安装VS2017移动应用开发模块. 2.使用VS2017,主要是便利,无需配置环境等一系列麻 ...

  8. 由于服务主机:DCOM服务进程占用过多CPU,导致系统卡死

    最近在使用电脑的时候,总是出现电脑死机,而且鼠标也是经常卡在那里不动了,开始以为是鼠标的问题,还换了个鼠标(飙泪中),这还是一个血的教训啊!!!之后打开任务管理器发现CPU占用已经达到100%,而且一 ...

  9. jenkins实现以gitlab为代码仓库的构建

    简介 前一篇随笔是安装jenkins的过程,比较简单,这一次说一下用jenkins配置以gitlab为代码管理仓库的maven项目的完整个构建过程,以及我碰到的一些问题.由于是maven项目,所以我们 ...

  10. 中文代码示例之5分钟入门TypeScript

    "中文编程"知乎专栏原文 Typescript官方文档起的这个噱头名字: TypeScript in 5 minutes, 虽然光看完文章就不止5分钟...走完整个文档流水账如下( ...