原生Javascript之拖曳效果

用javascript写拖曳效果好像是阿里前端的一道面试题,前些天在看《javascript权威指南》一书时看到了实现这个功能的代码,就索性发扬了一下拿来主义。废话不多说,代码如下

<!DOCTYPE html>
<html lang="en">
<head>
        <meta charset="UTF-8">
        <title>drag</title>
        <style>
                body{
                        text-align:center;
                }
        </style>
</head>
<body>
        <img src="http://e.hiphotos.baidu.com/image/w%3D310/sign=ba2b0707f4246b607b0eb475dbf81a35/b3b7d0a20cf431adcfcd1a6d4936acaf2edd9842.jpg" alt="" style="position:absolute;left:100px;top:100px;" onmousedown = "drag(this,event);">
        <script>
                function drag(elementToDrag,event){
                        var scroll = getScrollOffsets();
                        var startX = event.clientX + scroll.x;
                        var startY = event.clientY + scroll.y;


                        var origX = elementToDrag.offsetLeft;
                        var origY = elementToDrag.offsetTop;
                        var deltaX = startX-origX;
                        var deltaY = startY-origY; //鼠标和元素左上角的距离


                        if(document.addEventListener){
                                document.addEventListener("mousemove",moveHandler,true);
                                document.addEventListener("mouseup",upHandler,true);
                        }else if(document.attachEvent){
                                elementToDrag.setCapture();
                                elementToDrag.attachEvent("onmousemove",moveHandler);
                                elementToDrag.attachEvent("onmouseup",upHandler);


                                elementToDrag.attachEvent("onlosecapture",upHandler);
                        }
                        if(event.stopPropagation) event.stopPropagation();
                        else event.cancelBubble = true;


                        if(event.preventDefault) event.preventDefault();
                        else event.returnValue=false; //阻止任何默认操作


                        function moveHandler(e){
                                if(!e) e = window.event;
                                var scroll = getScrollOffsets();
                                elementToDrag.style.left = (e.clientX+scroll.x - deltaX)+"px";
                                elementToDrag.style.top = (e.clientY+scroll.y-deltaY)+"px";
                                if(e.stopPropagation) e.stopPropagation();
                                else e.cancelBubble = true;
                        }


                        function upHandler(e){
                                if(!e) e=window.event;
                                if(document.removeEventListener){
                                        document.removeEventListener("mouseup",upHandler,true);
                                        document.removeEventListener("mousemove",moveHandler,true);
                                }else if(document.detachEvnet){
                                        elementToDrag.detachEvent("onlosecapture",upHandler);
                                        elementToDrag.detachEvent("onmouseup",upHandler);
                                        elementToDrag.detachEvent("onmousemove",moveHandler);
                                }
                                if(e.stopPropagation) e.stopPropagation();
                                else e.cancelBubble = true;
                        }


                }




                function getScrollOffsets(w){
                        w = w || window;
                        if(w.pageXOffset != null) return {x:w.pageXOffset,y:w.pageYOffset};
                        var d=w.document;
                        if(document.compatMode == "CSS1Compat")
                                return {x:d.documentElement.scrollLeft,y:d.documentElement.scrollTop};
                        return {x:d.body.scrollLeft,y:d.body.scrollTop};                
                }
        </script>
</body>
</html>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值