offsetX、clientX、screenX、pageX、layerX

pageX/Y

原点相对于文档窗口左上角。

offsetX/Y

原点相对于触发事件元素的左上角,需要注意的是,offset是有负值的,如果你的元素有边框,那么offset会是负值。

(黑色为鼠标点击点)

(测试了IE11、Opera54.0.2952.71、Chrome68.0.3423.2、Firefox61.0.2中offset均不含边框的宽度)

clientX/Y

原点相对于可视窗口左上角

screenX/Y

原点相对于屏幕左上角

layerX/Y

原点相对于position为absolute或relative的父元素的左上角。

图1中粉色DIV并没有设置position,所以默认为static,此时layerX/Y的原点为上层父元素灰色DIV的左上角。

图2中粉色DIV设置了position为relative,所以此时layerX/Y的原点为粉色DIV的左上角。

pageX/Y、clientX/Y区分

当可视窗口与文档窗口重叠,pageX等于clientX, pageY等于clientY。 但是如果缩小浏览器窗口直到浏览器出现滚动条。此时可视窗口左上角位置不变,但文档窗口左上角位置发生变化。

如图2所示,此时文档窗口的原点如图中红线所示在页面的上方。

总体理解一下

其中有一个我很在意的问题,为什么pageY、offsetY、clientY、layerY总有一个2px或1px的多余?

因为我可得出鼠标相对于触发事件元素的原点,现在设置为中心点(25,25),那么从layerY-offsetY=border+粉色文字所占大小=>文字所占高度为21px。

所以猜测难道是文字大小所导致的?

于是设置文字大小。

计算图1灰色文字所占高度+文档窗口左上角到灰色DIV的高度=192-71=121px;

图1粉色文字所占高度=21px

因为两个文字大小一致,所以文档窗口左上角到灰色DIV的高度=121-21=100px;

设置图2灰色DIV文字大小为25px,粉色DIV文字大小为30px。

计算灰色文字所占高度+文档窗口左上角到灰色DIV的高度=223-90-100=33px

粉色文字所占高度=90-25-25=40px

经过多此实验和计算。。发现Chrome每次修改文字大小,文字所占高度没有规律。。

特别的13px大小文字占高17px,12px文字大小占高16px,14px占高19,15px占高20,16px占高21,20占26,30占40,40占52,50占66,60占79。。。

(我也不知道原理是什么,Firefox和Chrome数值还不一样,因为Firefox不限制文字大小,Chrome最小文字大小为12px,所以文字最小占高19px)

测试代码如下

<script type="text/javascript">
    $(document).ready(function () {
        $("#test").click(function (e) {
            console.log(e);
            $("#pX").html(e.pageX);
            $("#pY").html(e.pageY);
            $("#oX").html(e.offsetX);
            $("#oY").html(e.offsetY);
            $("#cX").html(e.clientX);
            $("#cY").html(e.clientY);
            $("#sX").html(e.screenX);
            $("#sY").html(e.screenY);
            $("#lX").html(e.originalEvent.layerX);
            $("#lY").html(e.originalEvent.layerY);

        });
    })
</script>
<style>
    *{
        margin: 0px;
        padding: 0px;
    }
    #demo{
        background-color: #777777;
        height: 400px;
    }
    #data{
        position: absolute;
        top:100px;
        left: 500px;
        width: 200px;
        height: 300px;
        background-color: #1b6d85;
    }
    #test{
        width: 50px;
        height: 50px;
        border: 25px solid darkred;
        background-color: #985f0d;
        top:100px;
        left: 100px;
        margin: 0 auto;
    }
    #testCContainer{
        width: 300px;
        height: 300px;
        position: absolute;
        top: 100px;
        left: 100px;
        background-color: #2b333f;
    }
    #testContainer{
        width: 150px;
        height: 150px;
        background-color: #ce8483;
        margin: 0 auto;
        position: relative;
    }
</style>
<body>

<div id="demo"></div>
    <div id="testCContainer">
    absolute300*300
    <div id="testContainer">
        rela150*150
        <div id="test"></div>
    </div>
</div>
<div id="data">
    pageX:<span id="pX"></span><br/>
    pageY:<span id="pY"></span><br/>
    offsetX:<span id="oX"></span><br/>
    offsetY:<span id="oY"></span><br/>
    clientX:<span id="cX"></span><br/>
    clientY:<span id="cY"></span><br/>
    screenX:<span id="sX"></span><br/>
    screenY:<span id="sY"></span><br/>
    layerX:<span id="lX"></span><br/>
    layerY:<span id="lY"></span>
</div>
</body>
</html>
原文地址:https://www.cnblogs.com/huangcy/p/9475185.html