前端:pageY、clientY、offsetY的区别&拖动效果优化

前言

之前我写过一篇html和JavaScript实现拖动效果的文章,这篇文章里面的东西实在是有些简单了,而且实际上会出现错误,错误效果如下:

这里写图片描述

同样的界面,我们滑动到最上面,效果却是正确的:

这里写图片描述

为什么呢,其实是因为位置的原因,当我们在最上面拖动时,拖动的空间距离顶部的距离是不变的,而当页面滑动到下方时,拖动的时候,页面的位置是不一样的,因此计算出来的也是错误的,引起错误的代码为这其中的clientY:

var list10 = document.getElementById('list10')
function fnMove(event,disX,disY,element){
    var l = event.clientX - disX,
        t = event.clientY - disY
    element.style.left=l+'px'
    element.style.top=t+'px'
}
list10.onmousedown = function(event) {
    event = event || window.event
    var disX = event.clientX - list10.offsetLeft,
    disY = event.clientY - list10.offsetTop;
    list10.style.position = 'fixed'
    document.onmousemove = function(event){
        event = event || window.event;
        fnMove(event,disX,disY,list10);
    }
    document.onmouseup = function(){
        document.onmousemove = null;
    }
}

这里就要讲解一下pageY、clientY、offsetY、layerY的区别了。

pageY、clientY、offsetY的区别

  1. pageY:鼠标在页面上的位置,从页面左上角开始,即是以页面为参考点,不随滑动条移动而变化;
  2. clientY:鼠标在页面上可视区域的位置,从浏览器可视区域左上角开始,即是以浏览器滑动条此刻的滑动到的位置为参考点;
  3. offsetY:IE特有,鼠标相比较于触发事件的元素的位置,以元素盒子模型的内容区域的左上角为参考点,如果有boder,可能出现负值。

这就是我们前面导致错误的原因了,因为我们是采用clientY来计算的,使用client计算的时候,就会由于页面的滚动而计算的位置有错,因此我们这里改为pageY来计算:

var list10 = document.getElementById('list10')
function fnMove(event,disX,disY,element){
    var l = event.clientX - disX,
        t = event.clientY - disY
    element.style.left=l+'px'
    element.style.top=t+'px'
}
list10.onmousedown = function(event) {
    event = event || window.event
    var disX = event.offsetX
    var disY = event.offsetY
    list10.style.left=event.clientX - disX,+'px'
    list10.style.top=event.clientY - disY+'px'
    list10.style.position = 'fixed'
    document.onmousemove = function(event){
        event = event || window.event;
        fnMove(event,disX,disY,list10);
    }
    document.onmouseup = function(){
        document.onmousemove = null;
    }
}

效果如下:

这里写图片描述

源代码

<!DOCTYPE html>
<html>
    <head>
        <title>title</title>
    </head>
    <body>
        <ul>
            <li id="list1">
                1
            </li>
            <li id="list2">
                2
            </li>
            ......
            <li id="list18">
                18
            </li>
            <li id="list19">
                19
            </li>
        </ul>
    </body>
    <script>
        var list10 = document.getElementById('list10')
        function fnMove(event,disX,disY,element){
            var l = event.clientX - disX,
                t = event.clientY - disY
            element.style.left=l+'px'
            element.style.top=t+'px'
        }
        list10.onmousedown = function(event) {
            event = event || window.event
            var disX = event.offsetX
            var disY = event.offsetY
            list10.style.left=event.clientX - disX,+'px'
            list10.style.top=event.clientY - disY+'px'
            list10.style.position = 'fixed'
            document.onmousemove = function(event){
                event = event || window.event;
                fnMove(event,disX,disY,list10);
            }
            document.onmouseup = function(){
                document.onmousemove = null;
            }
        }
    </script>
    <style>
        li {
            background-color: white;
            cursor: pointer;
            padding: 1rem;
            width: 10rem;
            box-shadow: 0px 0px 5px #ccc;
        }
    </style>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值