一、写在前面

在阅读本文前,希望大家能针对每个属性亲手测试,网上现有的大量相关博客都有不等的概念错误,毕竟亲手实践才能更好的掌握这些概念。

1.pageX,clientX,screenX与offsetX

先统一了解下这四个概念,理解不透没关系,咱们把概念相近的对比着一一细说。

pageX:鼠标指针距离文档左侧边缘的距离,随滚动条变化而变化

clientX:鼠标指针距离可视窗口左侧边缘的距离,不随滚动条变化而变化

screenX:鼠标指针距离屏幕的距离(包括浏览器工具栏之类),不随滚动条变化而变化

offsetX:鼠标指针距离当前绑定元素左侧距离

我们先来看看pageX与clientX无滚动条的对比效果

<div class="one"></div>
var Div = document.querySelector('.one');
Div.onmousemove = (e) => {
var X1 = e.pageX;
var Y1 = e.pageY;
var X2 = e.clientX;
var Y2 = e.clientY;
Div.innerHTML = `pageX:${X1},pageY:${Y1},clientX:${X2},clientY:${Y2}`
}

由图可见,在无滚动条的情况下,pageX与clientX,pageY与clientY是完全相同的。

试着给div增加一个margin-left:1600px;让页面出现滚动条,我们将可视窗口滚动到最右侧,再来对比pageX与clientX

可以看到,在页面X轴出现滚动条后,pageX始终要比clientX要大,那是因为clientX无论滚动条滚动多少,它始终只计算鼠标到可视窗口左侧的距离,而pageX则还要加上滚动的距离

pageX = 鼠标到可视窗口左侧距离+滚动条滚动距离(如果有滚动条)

clientX = 鼠标到可视窗口左侧距离

如果没有滚动条,这两者的距离是完全相同的。

我们再结合前者,加上screenYoffsetY的对比,请看图

为了方便对比,这里我们拿Y轴做对比。

offsetY是相对绑定事件的元素,这里是相对div,所以相比另外三个,Y轴的数值永远是最小的。

pageY和clientY在无滚动条的情况下是完全相同的,相对文档和可视窗口区域。这里因为没有滚动条,所以是完全相同的。

screen是相对屏幕,包含了浏览器任务栏,书签栏的高度,所以它永远是最高的。

关于这四个的兼容问题,由于浏览的不断更新,比如offsetX很多博客都说是IE独有的,结果上图我全是在谷歌测试的,也是支持的,所以这样的说法过于绝对,是不完全正确的。

2.  offsetLeft与style.left

下面概念中的position值为非static时,可以理解为position为relative,absolute,fixed其一

2.1  offsetLeft:

元素相对其定位父级(offsetParent)的左偏移量。

简单去理解,就是距离元素最近且position值非static父级元素的左偏移量,如果向上一直未找到,则相对body。

假设此时一个父级div包含一个子级div,均未定位,父级margin-left为20px,子级margin-left为30px,且父级border为2px

我们上面说了,从子级开始往上找定位父级,但是未找到,那么此时就相对body

那么子级的offsetLeft = 父级左偏移量20px+子级30px+父级边框2px

我们尝试给父级div添加一个position:absolute属性,其余属性全部不做改变,此时子级的定位父级就是自己的上级div,因此offsetLeft为30px

2.2  style.left:

获取元素相对其定位父级的左偏移,且元素本身position值为非static。

简单去理解,style.left只有元素自身进行定位才会有效,否则是无法取到的。

2.3  为什么style.left取不到?

首先元素本身要进行定位,其次,其left属性为内部样式时才能获取。

<div style='left=20px'></div>

2.4   offsetLeft与style.left的区别

1.获取offsetLeft属性的元素自身不用定位,但获取style.left的元素必须定位

2.offsetLeft是只读的,style.left是读写的

3.offsetLeft返回的是数字,不带单位,style.left 返回的是字符串,带单位

4.style.left 只能获取定义在html中的内部样式属性,而offsetLeft并没有这个限制

2.5  同时存在margin-left与left时的offsetLeft

<div class="parent"><div class="child" style='left:20px'></div></div>

需要注意的是,当margin与left,外边距与定位偏移量同时存在时,它们是累加的,并不会发生重叠。

3.  offsetHeight,clientHeight与scrollHeight

我们先来看看这三者的含义

offsetHeight:获取元素的宽度,包含border,padding,不包含margin。

clientHeight:获取元素内容区域的宽度,包括padding与元素的width,不包含border与margin,一般用于获取视窗高度,不包括溢出不可见部分的高度。

scrollHeight:只读属性是一个元素内容高度的度量,包括由于溢出导致的视图中不可见内容包含padding和width,不包含border与margin

4.clientTop,scrolleTop

scrolleTop:获取元素滚动后的距离文档顶部的距离,也就是滚动条滚动的距离。

clientTop:获取元素边框的厚度,也就是border的宽度。

有个公式:element.scrollHeight - element.scrollTop === element.clientHeight用于判断滚动条是否滚动到底。

offsetHeight,scrollHeight,clientHeight,scrollTop以及pageX,clientX,offsetX,screenX,offsetLeft,style.left等的区别以及使用详解的更多相关文章

  1. pageX,clientX,offsetX,screenX,offsetLeft,style.left,offsetWidth,scrollWidth的区别以及使用详解

    https://www.cnblogs.com/echolun/p/9231760.html

  2. pageX,clientX,offsetX,layerX的区别

    pageX,clientX,offsetX,layerX的区别 在各个浏览器的JS中,有很多个让你十分囧的属性,由于各大厂商对标准的解释和执行不一样,导致十分混乱,也让我们这些前端攻城狮十分无语和纠结 ...

  3. 一张图轻松搞懂javascript event对象的clientX,offsetX,screenX,pageX区别

    总是会被javascript的event对象的clientX,offsetX,screenX,pageX 弄得头晕,于是决定做个图来区分一下(画得我手那个酸呀....) 先总结下区别: event.c ...

  4. pageX,clientX,offsetX,layerX的那些事

    在各个浏览器的JS中,有很多个让你十分囧的属性,由于各大厂商对标准的解释和执行不一样,导致十分混乱,也让我们这些前端攻城狮十分无语和纠结>_< John Resig大神说过,动态元素有3个 ...

  5. event对象的clientX,offsetX,screenX,pageX和offsetTop,offsetHeight等等

    先总结下区别: event.clientX.event.clientY 鼠标相对于浏览器窗口可视区域的X,Y坐标(窗口坐标),可视区域不包括工具栏和滚动条.IE事件和标准事件都定义了这2个属性 eve ...

  6. jQuery中 pageX,clientX,offsetX,layerX的区别

    一.PageX和clientXPageX和clientX ,这个两个比较容易搞混,PageX:鼠标在页面上的位置,从页面左上角开始,即是以页面为参考点,不随滑动条移动而变化.可以理解为:相对#(0.0 ...

  7. event对象的clientX,offsetX,screenX,pageX

    chrome: e.pageX——相对整个页面的坐标 e.layerX——相对当前坐标系的border左上角开始的坐标 e.offsetX——相对当前坐标系的border左上角开始的坐标 e.clie ...

  8. ev的offsetX,pageX,clientX和screenX

    event.offsetX.event.offsetY(相对事件发生的具体元素左上角的定位) 鼠标相对于事件源元素(srcElement)的X,Y坐标,只有IE事件有这2个属性,标准事件没有对应的属性 ...

  9. clientX,offsetX,screenX,pageX 区别!

    先总结下区别: event.clientX.event.clientY 鼠标相对于浏览器窗口可视区域的X,Y坐标(窗口坐标),可视区域不包括工具栏和滚动条.IE事件和标准事件都定义了这2个属性 eve ...

随机推荐

  1. DataStage 的优化原则

    DataStage Job优化指导原则之一:算法的优化.        任何程序的优化,第一点首先都是算法的优化.当然这一点并不仅仅局限于计算机程序的优化,实际生活中也处处可以体现这一点.条条大路通罗 ...

  2. hdu 3030

    这道题主要就是问你,长度为n的序列,有多少种上升的子序列 当前点的情况种数等于前面所有小于它的点的种数相加 + 1 1就是只有这一个点的时候的序列 那就是要多次查询前面比它小的点的种数的和 那么就是区 ...

  3. Android中的假TabHost-只是在上层覆盖了一层TabWidget

    TabHost是整个Tab的容器,包含TabWidget和FrameLayout两个部分,TabWidget是每个Tab的表情,FrameLayout是Tab内容. 实现方法:继承TabActivit ...

  4. AngularJs 指令中 的Scope属性

    一.概念说明 可以是true. false .哈希对象 {} 1.true 新创建了一个作用域,且继承了父作用域:在初始化的时候,用了父作用域的属性和方法去填充我们这个新的作用域.它和父作用域不是同一 ...

  5. inline&friend&操作符重载

    (1).inline:是一种以空间换时间的做法省去调用函数的额外开销,提高程序的运行效率,它对于编译器而言只是一种建议 (2).友元函数:是可以直接访问类的private成员的非成员函数.它是定义在类 ...

  6. EBS-如何查看非自己提交的请求的结果

    http://www.cnblogs.com/quanweiru/p/4692071.html 如何查看非自己提交的请求的结果定位要找的请求SQL举例:SELECT req.request_id,   ...

  7. Android GridView 滑动条设置一直显示状态

    模拟GridView控件: <GridView android:id="@+id/picture_grid" android:layout_width="match ...

  8. C# 读取资源文件.resx 中的xml资源

    主要是以字符串的形式来读取xml,然后通过遍历读取节点,通过节点属性名称获取属性值 /// <summary> /// 初始化OPC参数配置 /// </summary> // ...

  9. 操作Checkbox标签

    在前端开发中,少不了对Checkbox的操作. 常用的的方法有2个:.is()和.prop()方法.前者是判断 checkbox的状态,选不是未选.而后者为checkbox设置一个值,可以设置chec ...

  10. 【转】OAuth的改变

    原文地址:http://huoding.com/2011/11/08/126 去年我写过一篇<OAuth那些事儿>,对OAuth做了一些简单扼要的介绍,今天我打算写一些细节,以阐明OAut ...