美文网首页
封装推拽对象

封装推拽对象

作者: hanahaha | 来源:发表于2017-09-26 17:09 被阅读0次

    一、HTML

    <!DOCTYPE html>
    <html>
      <head>
        <title>drag demo</title>
        <style>
          #drag{
            width: 400px;
            height: 400px;
            background-color:green;
          }
        </style>
      </head>
      <body>
        <div id="drag"></div>
        <script type="text/javascript" src="./drag.js"></script>
        <script type="text/javascript"> 
           new Drag('drag');
        </script>
      </body>
    </html>
    

    二、javascript

    (function(){
        //私有变量transform
        var transform=getTransform();
        //获取浏览器支持的transform写法
        function getTransform(){
            var tranform='';
            var divStyle=document.createElement('div').style;
            var transformArr=['transform','webkitTransform','MozTransform','msTransform'];
            var len=transformArr.length;
            for(var i=0;i<len;i++){
                if(transformArr[i] in divStyle){
                    return transform=transformArr[i];
                }
            }
            return transform;
        }
        //构造函数
        function Drag(selector){
            //每个实例单独拥有的属性
            this.elem = typeof selector=='Object' ? selector : document.getElementById(selector);
            this.startX=0;
            this.startY=0;
            this.targetX=0;
            this.targetY=0;
            this.init();   //初始化,主要给drag对象添加mousedown事件监听
        }
        Drag.prototype={
            constructor:Drag,
            init:function(){
                this.setDrag();
            },
            //获取元素某个样式
            getStyle:function(property){
                return document.defaultView.getComputedStyle ?document.defaultView.getComputedStyle(this.elem,false)[property] : this.elem.currentStyle[property]
            },
            //获取元素当前位置
            getPosition:function(){
                var pos={x:0,y:0};
                if(transform){             //浏览器支持transform
                    var transformValue=this.getStyle(transform);
                    if(transformValue=="none"){              //如果没有transform的值
                        this.elem.style[transform]='translate(0,0)';
                        return pos;
                    }
                    else{
                        var tmp=transformValue.match(/-?\d+/g);
                        return pos={
                            x:parseInt(tmp[4].trim()),
                            y:parseInt(tmp[5].trim())
                        }
                    }
                }
                else{           //浏览器不支持transform
                    if(getStyle(elem,'position')=='static'){    //如果是静态定位,变为relative定位
                        elem.style.position='relative';
                        return pos;
                    }
                    else{
                        var x=parseInt(getStyle(elem,'left') ? getStyle(elem,'left') : 0);
                        var y=parseInt(getStyle(elem,'top') ? getStyle(elem,'top') : 0);
                        return pos={
                            x : x,
                            y : y
                        }
                    }
                }
            },
            // 用来设置当前元素的位置
            setPosition:function(pos){
                if(transform){
                    this.elem.style[transform]='translate('+pos.x+'px,'+pos.y+'px)';
                }
                else{
                    this.elem.style.left=pos.x+'px';
                    this.elem.style.top=pos.y+'px';
                }
            },
            // 用来绑定事件
            setDrag:function(){
                var self=this;   //将this保存起来,因为在addEventListener的回调函数中,this指向的target,而IE9以前this指向的是window
                this.elem.addEventListener('mousedown',start,false);
                function start(event){
                    //获取鼠标的初始位置
                    self.startX=event.pageX;
                    self.startY=event.pageY;
                    //获取目标元素的初始位置
                    var pos=self.getPosition();
                    self.targetX=pos.x;
                    self.targetY=pos.y;
                    document.addEventListener('mousemove',move,false);
                    document.addEventListener('mouseup',stop,false);
                }
                function move(event){
                    //获取鼠标的当前位置
                    var currentX=event.pageX;
                    var currentY=event.pageY;
                    //计算差值
                    var distanceX=currentX-self.startX;
                    var distanceY=currentY-self.startY;
                    //设置元素的当前位置
                    self.setPosition({
                        x:(self.targetX+ distanceX).toFixed(),
                        y:(self.targetY+distanceY).toFixed()
                    });
                }
                function stop(event){
                    document.removeEventListener('mousemove',move);
                    document.removeEventListener('mouseup',stop);
                }
            }
        }
        window.Drag = Drag;
    })();
    

    缺点:mousemove触发的事件函数move()应该节流

    相关文章

      网友评论

          本文标题:封装推拽对象

          本文链接:https://www.haomeiwen.com/subject/ygteextx.html