偶然间看到了以前做的一个简洁的div拖拽效果,修改了一下加点注释,经测试完美通过firefox/chrome/ie6-11,现拿来分享一下。
先说一下实现原理及要点,最主要的有三步。第一步是mousedown事件,鼠标mousedown的时候记录此时的鼠标x轴和y轴以及拖拽框的left和top,并且给拖拽标记赋值true,代表拖拽动作就绪。第二步是mousemove事件,此时动态获取鼠标的x轴和y轴,然后计算出来拖拽框新的left和top并赋值使其实现拖拽效果。第三步是mouseup事件,鼠标弹起时给拖拽标记赋值false,拖拽动作完成。
html代码如下:
title--move
js代码如下:
(function($) { $.fn.dragdiv = function(divwrap) { return this.each(function() { var $divmove = $(this);//鼠标可拖拽区域 var $divwrap = divwrap ? $divmove.parents(divwrap) : $divmove;//整个移动区域 var mx = 0, my = 0;//定义鼠标x轴y轴 var dx = 0, dy = 0;//定义div左、上位置 var isdown = false;//mousedown标记 if(document.attachevent) {//ie的事件监听,拖拽div时禁止选中内容,firefox与chrome已在css中设置过-moz-user-select: none; -webkit-user-select: none; $divmove[0].attachevent('onselectstart', function() { return false; }); } $divmove.mousedown(function(event) { var event = event || window.event; mx = event.clientx; my = event.clienty; dx = $divwrap.offset().left; dy = $divwrap.offset().top; isdown = true;//鼠标拖拽启动 }); $(document).mousemove(function(event) { var event = event || window.event; var x = event.clientx;//鼠标滑动时的x轴 var y = 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=return false,但似乎chrome受了点影响,所以决定取消这个写法,然后在js里为ie浏览器写一个onselectstart事件。
这个小插件只是简单实现拖拽效果,但兼容性很好,里面也用到了一些知识点和技巧。当然也可以借助这个插件或里面的思想继续扩展,写一个比较完善的拖拽插件(如:draggable和droppable)。
以上所述就是本文的全部内容了,希望大家能够喜欢。
