zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    WCF 第六章 序列化和编码 使用IExtensibleDataObject 的双向序列化
    如何获取SQLite最新版本及SQLite数据库中的SQL语句解说
    WCF 第六章 序列化与编码 编码选择
    WCF 第七章 寄宿 定义服务和终结点地址
    WCF 第七章 寄宿 总结
    WCF 第六章 序列化和编码 为自定义序列化使用XmlSerializer
    常用的Vi命令 记得:* . / 需要转义
    25日
    一张图 拯救你的 .net 调用Excel
    切莫误人子弟
  • 原文地址:https://www.cnblogs.com/huangcy/p/9475185.html
Copyright © 2011-2022 走看看