珠峰培训

JavaScript中原生的拖拽事件如何用

作者:

2016-06-24 18:42:49

155

在高版本的浏览器中,为方便DOM元素拖拽,实现了若干个和拖拽相关的事件,其中最关键的是“dragstart”、“drag”、“dragend”这三个事件,如果用DOM0级事件绑定的方法来处理,则是这样:

        
    ele.ondragstart=down;
    ele.ondrag=move;
    ele.ondragend=up;
    dragstart事件表示拖拽开始的阶段,就是鼠标按下去了,准备移动鼠标之前的这个阶段。在这个阶段需要把拖拽的准备工作做好。
    drag事件表示拖拽进行的阶段,就是鼠标按着呢,并且还在移动鼠标(mousedown和mousemove的结合),在这个阶段,随着鼠标的移动不断重新计算DOM元素的位置
    dragend事件表示拖拽结束的阶段,就是鼠标抬起来、并且DOM元素不再跟着鼠标的移动而移动。
    具体的代码实现如下:
        
         

CSS样式如下:

            
    *{ margin:0;
        padding:0;
        -webkit-user-select:none;
    }
    div{ width:100px;
        height:100px;
        background:red;
        position:absolute;
        top:0;
        left:0;
        cursor:move;
    }
            
        

HTML代码如下:

            
    <div id="div1" draggable="true"></div>
    注意:要把draggable属性设为true,要不然拖不动哦
            
            

JavaScript代码实现如下

            
    function start(e){//绑定到dragstart事件,表示拖拽开始。
        this.x=this.offsetLeft;//在拖拽开始的时候,把DOM元素的位置保存下来
        this.y=this.offsetTop;
        this.mx=e.pageX;//把鼠标的位置也保存下来,以备在drag(拖拽进行阶段)事件中重新计算位置
        this.my=e.pageY;
    }
    function move(e){//拖拽进行中
        //DOM元素的新位置=它的老位置+(鼠标移动的距离=鼠标现在的位置-鼠标原来的位置)
        this.style.top=this.y+e.pageY-this.my+"px";
        this.style.left=this.x+e.pageX-this.mx+"px";
    }
    function end(e){
        //还需要在拖拽结束的阶段,再重新确定一下DOM元素的位置
        this.style.left=this.x+e.pageX-this.mx+"px";
        this.style.top=this.y+e.pageY-this.my+"px";
    }
        //下面用DOM二级事件来绑定这三个方法
        ele.addEventListener("dragstart",start,false);
        ele.addEventListener("drag",move,false);
        ele.addEventListener("dragend",end,false);