jQuery使用drag效果实现自由拖拽div
偶然间看到了以前做的一个简洁的div拖拽效果,修改了一下加点注释,经测试完美通过firefox/chrome/ie6-11,现拿来分享一下。
先说一下实现原理及要点,最主要的有三步。第一步是mousedown事件,鼠标mousedown的时候记录此时的鼠标X轴和Y轴以及拖拽框的left和top,并且给拖拽标记赋值true,代表拖拽动作就绪。第二步是mousemove事件,此时动态获取鼠标的X轴和Y轴,然后计算出来拖拽框新的left和top并赋值使其实现拖拽效果。第三步是mouseup事件,鼠标弹起时给拖拽标记赋值false,拖拽动作完成。
html代码如下:
<divclass="divWrap"id="move1"style="width:200px;height:200px;background:Green;border:1pxsolidred;position:absolute;top:100px;left:100px;cursor:move;-moz-user-select:none;-webkit-user-select:none;"></div> <divclass="divWrap"style="width:200px;height:200px;background:brown;border:1pxsolidred;position:absolute;top:300px;left:100px;"> <h3id="move2"style="height:45px;line-height:45px;font-size:18px;background:red;margin:0;cursor:move;-moz-user-select:none;-webkit-user-select:none;">Title--Move</h3> </div>
js代码如下:
(function($){ $.fn.dragDiv=function(divWrap){ returnthis.each(function(){ var$divMove=$(this);//鼠标可拖拽区域 var$divWrap=divWrap?$divMove.parents(divWrap):$divMove;//整个移动区域 varmX=0,mY=0;//定义鼠标X轴Y轴 vardX=0,dY=0;//定义div左、上位置 varisDown=false;//mousedown标记 if(document.attachEvent){//ie的事件监听,拖拽div时禁止选中内容,firefox与chrome已在css中设置过-moz-user-select:none;-webkit-user-select:none; $divMove[0].attachEvent('onselectstart',function(){ returnfalse; }); } $divMove.mousedown(function(event){ varevent=event||window.event; mX=event.clientX; mY=event.clientY; dX=$divWrap.offset().left; dY=$divWrap.offset().top; isDown=true;//鼠标拖拽启动 }); $(document).mousemove(function(event){ varevent=event||window.event; varx=event.clientX;//鼠标滑动时的X轴 vary=event.clientY;//鼠标滑动时的Y轴 if(isDown){ $divWrap.css({"left":x-mX+dX,"top":y-mY+dY});//div动态位置赋值 } }); $divMove.mouseup(function(){ isDown=false;//鼠标拖拽结束 }); }); }; })(jQuery); // $(document).ready(function(){ $("#move1").dragDiv();//拖拽整个div $("#move2").dragDiv(".divWrap");//拖拽div头部 });
最后要说明一下,在开始拖拽动作之前,要禁止选中内容,否则影响拖拽效果。firefox和chrome可以通过css来设置:{-moz-user-select:none;-webkit-user-select:none;},ie本来也可以直接在html里写一个onselectstart="returnfalse",但似乎chrome受了点影响,所以决定取消这个写法,然后在js里为ie浏览器写一个onselectstart事件。
这个小插件只是简单实现拖拽效果,但兼容性很好,里面也用到了一些知识点和技巧。当然也可以借助这个插件或里面的思想继续扩展,写一个比较完善的拖拽插件(如:Draggable和Droppable)。
以上所述就是本文的全部内容了,希望大家能够喜欢。