javascript拖动(拖拽)之我见 - 简约版

javascript

RT,拖动可能是时下比较流行的一个js效果之一,在感叹创造者的神奇之外,我怀作好奇,也来尝试了一把(当然,是在欣赏了不少拖动代码的基础上,并妄想通过最简单的办法实现)。

其实,拖动特效可以由3个主要部分组成,开始拖动,拖动,结束拖动。

哎,不说这么多了(摄影的朋友肯定要说, 怎么还不上图了...呵呵),好,我就来点代码吧。

开始拖动之前,先上2个简单的工具方法:

 1   var  Utils  =    {
 2     " getTarget " : function (ev)  {
 3         //  获得当前的目标源对象
 4         ev  =  ev  ||  window.event;
 5         var  tget  =  ev.target  ||  ev.srcElement;
 6         return  tget;
 7   } ,
 8     " getPosition " : function (ev)  {
 9         //  设置坐标
10          //  模拟一个鼠标跟随的效果
11         ev  =  ev  ||  window.event;
12          return    {top:document.body.scrollTop  +  ev.clientY  +   10 ,
13                        left:document.body.scrollLeft  +  ev.clientX  +   10 } ;
14   }
15 }
比较简单,相信大家看完注释都能明白。

下面,开始本章的重要部分,拖动。还是先看代码吧:
<div id="container1" container="true" style="width:200px;height:300px;background-color:FFFff2;float:left"><div id="test1" dragable="true" style="width:200px;background-color:FF00F0;cursor:pointer" >111</div><div id="test2" dragable="true" style="width:200px;background-color:FFAAF0;cursor:pointer">222</div><div id="test3" dragable="true" style="width:200px;background-color:FF76AF;cursor:pointer">333</div><div id="test4" dragable="true" style="width:200px;background-color:FFA770;cursor:pointer">444</div><div id="test5" dragable="true" style="width:200px;background-color:a90aF0;cursor:pointer">555</div></div><div id="container3" align="center" style="width:100px;height:300px;float:left"> </div><div id="container2" container="true" style="width:200px;height:300px;background-color:FFFff2;float:left"><div id="test6" dragable="true" style="width:200px;background-color:b22002;cursor:pointer" >666</div><div id="test7" dragable="true" style="width:200px;background-color:b2FF02;cursor:pointer">777</div><div id="test8" dragable="true" style="width:200px;background-color:b2AA02;cursor:pointer">888</div><div id="test9" dragable="true" style="width:200px;background-color:b2BBC2;cursor:pointer">999</div><div id="test10" dragable="true" style="width:200px;background-color:b22AAA;cursor:pointer">1010</div></div><script language="javascript">var Drag = {"moveDiv":null,"dragObj":null,"draging":false,"start":function(ev){Drag.dragObj = Utils.getTarget(ev);if(Drag.isdragable()){Drag.createDiv();Drag.draging = false;}return false;},"draging":function(ev){if(!Drag.isdragable() || Drag.moveDiv == null){return;}// 设置被选定对象的鼠标跟随效果if(!Drag.draging){var move = Drag.dragObj.cloneNode(true);Drag.moveDiv.appendChild(move);}Drag.moveDiv.style.top  = (Utils.getPosition(ev)).top;Drag.moveDiv.style.left = (Utils.getPosition(ev)).left;// 使用DOM操作,替换拖动过程中元素的位置var mouseOverObj = Utils.getTarget(ev);if(mouseOverObj.getAttribute("dragable") || mouseOverObj.getAttribute("container")){if(Drag.dragObj.parentNode != mouseOverObj.parentNode){if(mouseOverObj.nextSibling){mouseOverObj.parentNode.insertBefore(Drag.dragObj,mouseOverObj);}else{mouseOverObj.parentNode.appendChild(Drag.dragObj);}}else{if(mouseOverObj.nextSibling){Drag.dragObj.parentNode.insertBefore(Drag.dragObj,mouseOverObj);}else{Drag.dragObj.parentNode.appendChild(Drag.dragObj);}}}// 设置状态为拖动中Drag.draging = true;return false;},"end":function(){Drag.dragObj = null;Drag.removeDiv();Drag.draging = false;return false;},"removeDiv":function(){// 移除拖动时跟随鼠标移动的虚拟DIV层if(Drag.moveDiv != null){Drag.moveDiv.style.display = "none";Drag.moveDiv.parentNode.removeChild(Drag.moveDiv);Drag.moveDiv = null;}},"createDiv":function(){// 初始化拖动时跟随鼠标移动的虚拟DIV层Drag.removeDiv();Drag.moveDiv = document.createElement("div");Drag.moveDiv.style.cssText = "position:absolute;z-index:10;";document.body.appendChild(Drag.moveDiv);},"isdragable":function(){// 验证当前对象是否为可拖动的对象if(Drag.dragObj == null || !Drag.dragObj.getAttribute("dragable")){return false;}return true;}}var Utils = {"getTarget":function(ev){// 获得当前的目标源对象ev = ev || window.event;var tget = ev.target || ev.srcElement;return tget;},"getPosition":function(ev){// 设置坐标// 模拟一个鼠标跟随的效果ev = ev || window.event;return {top:document.body.scrollTop + ev.clientY + 10,left:document.body.scrollLeft + ev.clientX + 10};}}document.onmousemove = Drag.draging;document.onmouseup   = Drag.end;document.onmousedown = Drag.start;</script>
(如果你想看到深动的效果,可以单击此处运行)
 1var Drag = {
 2    "moveDiv":null,
 3    "dragObj":null,
 4    "draging":false,
 5  "start":function(ev){
 6      Drag.dragObj = Utils.getTarget(ev);
 7      if(Drag.isdragable()){
 8        Drag.createDiv();
 9        Drag.draging = false;
10      }
11    return false;
12  },
13  "draging":function(ev){
14      if(!Drag.isdragable() || Drag.moveDiv == null){
15          return;
16      }
17     
18      // 设置被选定对象的鼠标跟随效果
19      if(!Drag.draging){
20          var move = Drag.dragObj.cloneNode(true);
21          Drag.moveDiv.appendChild(move);
22      }
23    Drag.moveDiv.style.top  = (Utils.getPosition(ev)).top;
24        Drag.moveDiv.style.left = (Utils.getPosition(ev)).left;
25       
26        // 使用DOM操作,替换拖动过程中元素的位置
27        var mouseOverObj = Utils.getTarget(ev);       
28        if(mouseOverObj.getAttribute("dragable") || mouseOverObj.getAttribute("container")){
29            if(Drag.dragObj.parentNode != mouseOverObj.parentNode){
30                if(mouseOverObj.nextSibling){
31                    mouseOverObj.parentNode.insertBefore(Drag.dragObj,mouseOverObj);
32              }else{
33                mouseOverObj.parentNode.appendChild(Drag.dragObj);
34              }
35            }else{
36                if(mouseOverObj.nextSibling){
37                    Drag.dragObj.parentNode.insertBefore(Drag.dragObj,mouseOverObj);
38              }else{
39                Drag.dragObj.parentNode.appendChild(Drag.dragObj);
40              }
41      }
42    }
43   
44    // 设置状态为拖动中
45    Drag.draging = true;
46    return false;
47  },
48  "end":function(){
49    Drag.dragObj = null;
50    Drag.removeDiv();
51    Drag.draging = false;
52    return false;
53  },
54  "removeDiv":function(){
55      // 移除拖动时跟随鼠标移动的虚拟DIV层
56    if(Drag.moveDiv != null){
57          Drag.moveDiv.style.display = "none";
58          Drag.moveDiv.parentNode.removeChild(Drag.moveDiv);
59        Drag.moveDiv = null;
60      }
61  },
62  "createDiv":function(){
63       // 初始化拖动时跟随鼠标移动的虚拟DIV层
64       Drag.removeDiv();
65     Drag.moveDiv = document.createElement("div");
66     Drag.moveDiv.style.cssText = "position:absolute;z-index:10;";
67     document.body.appendChild(Drag.moveDiv);
68  },
69  "isdragable":function(){
70      // 验证当前对象是否为可拖动的对象
71    if(Drag.dragObj == null || !Drag.dragObj.getAttribute("dragable")){
72          return false;
73      }
74      return true;
75  }
76}

有点多哟,呵呵~~
先看“start”方法,首先获得事件源,然后判断是否当前对象可以拖动,如果可以拖动,则调用Drag.createDiv(),设置一个虚拟的DIV,用来显示当前对象跟随鼠标移动的效果,然后Drag.draging = false
设置当前拖动状态为未拖动。最后一个,return false,别忘记了,不写在FF里会出点小问题。

然后再看“draging”方法,同样首先判断当前对象是否可以拖动,然后判断当前拖动状态,如果为FALSE,则复制当前被拖动的对象,并添加到跟随鼠标移动的DIV里,这样,跟随鼠标移动的才是当前对象。其实,后面的代码就比较简单了,主要就是进行元素位置替换(nextSibling仿佛在FF不能使用,所以,FF中最后一个对象向下移动会有点问题)。但是在拖动过程中,需要注意的一个问题,就是当前跟随鼠标移动的DIV层千万不要挡住光标,如果挡住光标,则不能通过简单的srcElement方法取到当前的元素,你可能就只有通过坐标判断等办法去实现了.........就有点复杂了。

"end"方法,其实就更简单了,差不多都是些清理的操作。

最后,别忘记了加上事件监控和HTML代码。
1document.onmousemove = Drag.draging;
2document.onmouseup   = Drag.end;
3document.onmousedown = Drag.start;1<div id="container1" container="true" style="width:200px;height:300px;background-color:FFFff2;float:left">
2  <div id="test1" dragable="true" style="width:200px;background-color:FF00F0;cursor:pointer" >111</div>
3  <div id="test2" dragable="true" style="width:200px;background-color:FFAAF0;cursor:pointer">222</div>
4  <div id="test3" dragable="true" style="width:200px;background-color:FF76AF;cursor:pointer">333</div>
5  <div id="test4" dragable="true" style="width:200px;background-color:FFA770;cursor:pointer">444</div>
6  <div id="test5" dragable="true" style="width:200px;background-color:a90aF0;cursor:pointer">555</div>
7</div>

over,我这个仅仅是个简易的拖动效果,呵呵!希望大家能发现更简单的办法。

 

时间: 2024-10-30 08:02:31

javascript拖动(拖拽)之我见 - 简约版的相关文章

draggabilly一款功能强大的拖动拖拽元素插件

draggabilly一款功能强大的拖动拖拽元素插件:http://download.csdn.net/detail/cometwo/9411895 支持移动触摸设备的纯js元素拖放插件 :http://download.csdn.net/detail/cometwo/9411907 :"` <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" con

利用JavaScript实现拖拽改变元素大小_javascript技巧

大致介绍 拖拽改变元素大小是在模拟拖拽上增加了一些功能 拖拽改变元素大小原理 首先这个方块得知道我们想要改变这个它的大小,所以我给它设定一个范围,当点击这个范围时表明我们想要改变它的大小 当我们点击方块的这些红色区域时,方快就知道我们想要改变它的大小 代码实现: // 获取event对象,兼容性写法 var ev = ev || event; // 鼠标按下时的位置 var mouseDownX = ev.clientX; var mouseDownY = ev.clientY; // 方块上下

JavaScript实现拖拽网页内元素的方法_javascript技巧

本文实例讲述了JavaScript实现拖拽网页内元素的方法.分享给大家供大家参考.具体如下: 这段代码详细讲述了JS拖拽的原理和方法,值得学习和借鉴. /** * 跨平台的事件监听函数 * @param {Node} node 需要监听事件的DOM节点 * @param {String} eventType 需要监听的事件类型 * @param {Function} callback 事件监听回调函数 * @type Function 返回值为函数类型 * @return 返回监听回调函数的引用

JavaScript实现拖拽元素对齐到网格(每次移动固定距离)_javascript技巧

这几天在做一个拖拽元素的附加功能,就是对齐到网格,实际上就是确定好元素的初始位置,然后拖拽元素时,每次移动固定的距离.让元素都可以在网格内对齐.先上效果图,然后在详细说明一下细节问题 做了一个gif图,可以看到,每次元素的移动都是按照最小单位距离移动的.且每次元素都是对齐到网格的. 先根据demo说明一下思路和细节,后面会给出demo代码. 1. 确定元素的每次移动的最小单位(demo中为10px和10px),也就是每次水平或垂直的位移量都是10px.铺上一层网格背景是为了帮助我们更好的看到效果

怎么用javascript进行拖拽

javascript Javascript的特点是dom的处理与网页效果,大多数情况我们只用到了这个语言的最简单的功能,比如制作图片轮播/网页的tab等等,这篇文章将向你展示如何在自己的网页上制作拖拽. 有很多理由让你的网站加入拖拽功能,最简单的一个是数据重组.例如:你有一个序列的内容让用户排序,用户需要给每个条目进行输入或者用select选择,替代前面这个方法的就是拖拽.或许你的网站也需要一个用户可以拖动的导航窗口!那么这些效果都是很简单:因为你可以很容易的实现! 网页上实现拖拽其实也不是很复

JavaScript实现拖拽网页内元素的方法

 这段代码详细讲述了JS拖拽的原理和方法,值得学习和借鉴. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 7

javascript完美拖拽的实现方法_javascript技巧

HTML代码: 复制代码 代码如下: <!DOCTYPE HTML><html lang="en-US"><head><meta charset="UTF-8"><title></title><link rel="stylesheet" href="style.css" /><script type="text/javascri

javascript简单拖拽效果代码

原生javascript效果:简单拖拽 mming 简单拖拽示例

怎么用javascript进行拖拽第1/2页_javascript技巧

样例- 拖拽页面元素 Item #1 Item #2 Item #3 Item #4 Item #5 Item #6 Item #7 Item #8 Item #9 Item #10 Item #11 Item #12