clientX,offsetX,layerX,pageX,screenX,X鼠标位置全解

Chrome下(测试版本为51.0.2704.106 ):

  由上图可见题目中的6种属性可分为三大类:

  1.鼠标指针相对于屏幕的坐标:screenX/Y

  2.相对于页面且不考虑滚动条是否滚动:clientX/Y,X/Y

  3.相对于页面且考虑滚动条:pageX/Y,layerX/Y,offsetX/Y

  下面着重讨论2,3。

  红色对应上文的2类。div3设置了50px的border,可以看到offsetX的数值未包含左边框的50px。下面看一个行内块的:

  可见offsetX/Y为鼠标指针相对于当前元素(块级或行内块)且不包含边框的坐标,行内元素则无效(返回父级的坐标)。(51版本的chrome下)

  其他浏览器的情况怎么样呢?

火狐下(测试版本为47.0.1):

  

  47版本的火狐不支持x/y,其他表现与51版本的chrome相同。

Safari(测试版本为5.1.7)下:

  Safari(5.1.7)下offsetX/Y为鼠标指针相对于当前元素(块级或行内块)且包含边框的坐标。

IE11

  IE11下layerX/Y未包括滚动条距离;pageX/Y与clientX/Y精确到了小数。offsetY出现小数大概是因为dddd的line-height设置为45px。

  另:Opera(版本38.0.2220.41)表现与chrome一致。

  下面是w3c关于各属性的解释:

  pageX/Y被划到了jq里:

  没找到layerX/Y的官方文档。

  总结:

  推荐使用:

  screenX/Y:鼠标位置相对于屏幕的坐标

  pageX/Y:相对于文档边缘(包含滚动条距离)

  clientX/Y:相对于当前页面且不包含滚动条距离

  offsetX/Y:相对于当前元素(块或行内块),除safari外不包含边框。

  其他:

  X/Y:与clientX/Y相同,firefox不支持

  layerX/Y:除IE外与pageX/Y相同,IE11下与clientX/Y相同。非官方属性。

  测试代码:

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
    <style>
        body {
            margin: 0;
            padding: 0;
        }
        .div {
            text-align: center;
            font-size: 24px;
            height: 300px;
            width: 1300px;
            line-height: 300px;
            color: yellow;
        }

        #d1 {
            background-color: #FF3B2F;
        }

        #d2 {
            background-color: #4CDA64;
        }

        #d3 {
            background-color: #007AFF;
            border: 50px solid #004400;
            width: 500px;
            display: inline-block;
        }
        #d3-2{
            background-color: #FF2C55;
            width: 500px;
            border: 10px solid #019EE4;
            display: inline-block;
        }

        #d4 {
            position: absolute;
            background-color: #FFCC00;
            height: 340px;
            width: 120px;
            top: 0;
            bottom: 0;
            left: 50px;
            margin: auto 0;
            font-family: "arial";
            font-size: 16px;
        }
    </style>
    <script type="text/javascript">

        $(function () {

            window.onscroll = function () {
                $("#d4").css("top", getScrollTop());
            };

            document.onmousemove = function (e) {
                if (e == null) {
                    e = window.event;
                }
                var html = "<span style=‘color:#000‘>screenX:" + e.screenX + "</span><br/>";
                html += "<span style=‘color:#000‘>screenY:" + e.screenY + "</span><br/><br/>";

                html += "<span style=‘color:#f00‘>clientX:" + e.clientX + "</span><br/>";
                html += "<span style=‘color:#f00‘>clientY:" + e.clientY + "</span><br/><br/>";
                  html += "<span style=‘color:#f00‘>x:" + e.x + "</span><br/>";
                html += "<span style=‘color:#f00‘>y:" + e.y + "</span><br/><br/>";

                html += "<span style=‘color:#00f‘>layerX:" + e.layerX + "</span><br/>";
                html += "<span style=‘color:#00f‘>layerY:" + e.layerY + "</span><br/><br/>";
                html += "<span style=‘color:#00f‘>pageX:" + e.pageX + "</span><br/>";
                html += "<span style=‘color:#00f‘>pageY:" + e.pageY + "</span><br/><br/>";

                html += "<span style=‘color:#070‘>offsetX:" + e.offsetX + "</span><br/>";
                html += "<span style=‘color:#070‘>offsetY:" + e.offsetY + "</span><br/>";
                $("#d4").html(html);
            };
        });

        function getScrollTop() {
            var top = (document.documentElement && document.documentElement.scrollTop) ||
              document.body.scrollTop;
            return top;
        }
    </script>
</head>
<body>
    <div id="d1" class="div">div1 height:300px width:1300px</div>
    <div id="d2" class="div">div2 height:300px width:1300px</div>
    <div id="d3" class="div">div3 height:300px width:500px</div>
    <div id="d3-2" class="div">div3-2 height:300px width:500px <span style="width:50px;height:50px;background:#000;display: inline-block;border: 5px solid #fff;line-height: 45px;">dddd</span></div>
    <div id="d4"></div>
</body>
</html>

  没优化,根据这个里面的改的:screenX clientX pageX的区别

  其他参考:HTML DOM Event 对象

  五年前的兼容情况:各浏览器的鼠标位置测试

时间: 2024-10-11 23:38:16

clientX,offsetX,layerX,pageX,screenX,X鼠标位置全解的相关文章

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

一.PageX和clientXPageX和clientX ,这个两个比较容易搞混,PageX:鼠标在页面上的位置,从页面左上角开始,即是以页面为参考点,不随滑动条移动而变化.可以理解为:相对#(0.0)坐标绝对定位clientX:鼠标在页面上可视区域的位置,从浏览器可视区域左上角开始,即是以浏览器滑动条此刻的滑动到的位置为参考点,随滑动条移动 而变化.可以理解为:相对可视化左上角坐标绝对定位 如图:(小黑点为点击坐标) 二.screenXscreenX:鼠标在屏幕上的位置,从屏幕左上角开始,这个

pageX,clientX,offsetX,layerX的区别

在各个浏览器的JS中,有很多个让你十分囧的属性,由于各大厂商对标准的解释和执行不一样,导致十分混乱,也让我们这些前端攻城狮十分无语和纠结>_< John Resig大神说过,动态元素有3个至关重要的元素,位置,尺寸和可见性.所以,今天,先拿几个页面位置属性开刀. 一.PageX和clientX PageX和clientX ,这个两个比较容易搞混,PageX:鼠标在页面上的位置,从页面左上角开始,即是以页面为参考点,不随滑动条移动而变化clientX:鼠标在页面上可视区域的位置,从浏览器可视区域

e.pageX;event.clientX,event.clientY,scrollLeft,clientLeft获取鼠标位置

示例一: x方向没有滚动 var mx=0,my=0; function mouseMove(ev){Ev=ev||window.event;var mousePos=mouseCoords(Ev);mx=mousePos.x;my=mousePos.y;} function mouseCoords(ev){ if(ev.pageX||ev.pageY){ return{x:ev.pageX,y:ev.pageY}; } return{x:ev.clientX,y:ev.clientY+$(do

原生js获取鼠标坐标方法全面讲解:clientX/Y,pageX/Y,offsetX/Y,layerX/Y,screenX/Y

简介 关于js鼠标事件综合各大浏览器能获取到坐标的属性总共以下五种: event.clientX/Y event.pageX/Y event.offsetX/Y event.layerX/Y event.screenX/Y clientX/Y: clientX/Y获取到的是触发点相对浏览器可视区域左上角距离,不随页面滚动而改变 兼容性:所有浏览器均支持 pageX/Y: pageX/Y获取到的是触发点相对文档区域左上角距离,会随着页面滚动而改变 兼容性:除IE6/7/8不支持外,其余浏览器均支持

pageX, clientX ,screenX, offsetX, layerX, ,x的区别

事件对象event的位置属性,这些参数比较容易混淆 1. pageX,pageY :IE不识别的,鼠标在页面上的位置,从页面左上角开始,即是以页面为参考点,不随滑动条移动而变化,其实就是clientY+scrollTop,参考点是页面 2. clientX ,clientY: 鼠标在页面上可视区域的位置,从浏览器可视区域左上角开始,即是以浏览器滑动条此刻的滑动到的位置为参考点,随滑动条移动而变化. 这是一个变化的,是以浏  览器左上角为参考点 3. screenX, screenY : 鼠标相对

clientX/Y pageX/Y offsetX/Y layerX/Y screenX/Y

关于js鼠标事件综合各大浏览器能获取到坐标的属性总共以下五种 event.clientX/Y event.pageX/Y event.offsetX/Y event.layerX/Y event.screenX/Y clientX/Y: clientX/Y获取到的是触发点相对浏览器可视区域左上角距离,不随页面滚动而改变 兼容性:所有浏览器均支持 pageX/Y: pageX/Y获取到的是触发点相对文档区域左上角距离,会随着页面滚动而改变 兼容性:除IE6/7/8不支持外,其余浏览器均支持 off

图解Js event对象offsetX, clientX, pageX, screenX, layerX, x区别

通过 3 张图和 1 张表格,轻松区别 JavaScript Event 对象中的offsetX, clientX, pageX, screenX, layerX, x等属性. 一.测试代码如下: <!DOCTYPE HTML> <html lang="zh-cn"> <head> <meta charset="utf-8" /> <title>Javascript</title> <st

页面元素坐标和偏移(clientX/pageX/screenX/layerX/offsetWidth/scrollWidth/clientWidth等)相关...

鼠标事件都是在特定位置发生的,我们可以通过event事件对象的各种属性来获得事件发生的坐标位置,有相对于视口的,有相对于整个文档的,同样页面元素的位置也有相对视口的,也有滚动后的,这些都比较容易混淆,所以整理在这里,备忘,待查. 1.客户区坐标位置(clientX/clientY) 我们可以通过event事件对象的clientX/clientY属性获得事件发生时鼠标指针在视口中的水平和垂直坐标. 示意图: 2.屏幕坐标位置(screenX/scrennY) 通过event事件对象的screenX

页面元素坐标和偏移(clientX/pageX/screenX/layerX/offsetWidth/scrollWidth/clientWidth等)相关整理

鼠标事件都是在特定位置发生的,我们可以通过event事件对象的各种属性来获得事件发生的坐标位置,有相对于视口的,有相对于整个文档的,同样页面元素的位置也有相对视口的,也有滚动后的,这些都比较容易混淆,所以整理在这里,备忘,待查. 1.客户区坐标位置(clientX/clientY) 我们可以通过event事件对象的clientX/clientY属性获得事件发生时鼠标指针在视口中的水平和垂直坐标. 示意图: 2.屏幕坐标位置(screenX/scrennY) 通过event事件对象的screenX