`
lylyb
  • 浏览: 90460 次
  • 性别: Icon_minigender_1
  • 来自: 烟台
社区版块
存档分类
最新评论

javascript拖动(拖拽)

    博客分类:
  • JS
阅读更多
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,我这个仅仅是个简易的拖动效果,呵呵!希望大家能发现更简单的办法。
分享到:
评论

相关推荐

    简易而又灵活的Javascript拖拽框架

    JavaScript拖拽框架是一种用于创建交互式用户界面的技术,它允许用户通过鼠标或其他输入设备将元素在屏幕上自由移动,常用于构建可自定义的GUI组件、拖放功能等。本篇文章将详细探讨“简易而又灵活的Javascript拖拽...

    JavaScript鼠标拖拽

    JavaScript鼠标拖拽功能是网页交互中的一个重要组成部分,它允许用户通过鼠标操作页面上的元素,例如移动、缩放或旋转对象。对于初学者来说,理解并实现这一功能是掌握JavaScript动态效果的一个重要步骤。 首先,...

    javascript拖拽图片到指定位置

    在JavaScript和jQuery的世界里,实现图片拖放至指定位置的功能是一项常见的交互设计,它能够提升用户的体验,使得操作更加直观和便捷。以下我们将详细探讨如何使用这两种技术来完成这一任务。 首先,我们需要理解...

    JQ JS javascript 拖拽 排序功能 列表排序 菜单排序 表格排序

    在本主题中,我们将深入探讨如何利用jQuery和JavaScript实现拖拽排序功能,适用于列表、菜单和表格等元素。 一、拖拽排序基础概念 拖拽排序是一种用户交互设计,允许用户通过鼠标拖动来改变元素的顺序。这种功能在...

    javascript拖拽翻页效果

    JavaScript拖拽翻页效果是一种流行的交互设计,它使得用户可以通过在网页上拖动内容来实现页面的滚动或切换,提供了一种更为直观和流畅的浏览体验。这种效果通常应用于长篇内容的展示,如电子书、画廊或者无限滚动的...

    可保存位置并自动吸附的JavaScript拖动层.rar

    可保存位置并自动吸附的JavaScript拖动层.rar可保存位置并自动吸附的JavaScript拖动层.rar可保存位置并自动吸附的JavaScript拖动层.rar可保存位置并自动吸附的JavaScript拖动层.rar可保存位置并自动吸附的JavaScript...

    原生javascript实现拖拽改变table表格行高(html)

    原生JavaScript实现的拖拽功能能够为用户带来直观、便捷的操作体验。在这个特定的场景中,我们关注的是如何使用JavaScript来实现拖拽改变HTML表格(table)的行高。标题提到的“原生javascript实现拖拽改变table表格...

    javascript拖拽DIV技巧

    ### JavaScript 拖拽 DIV 技巧详解 #### 一、引言 随着 Web 技术的不断发展,用户界面的设计也变得越来越丰富多样。其中,拖拽(Drag and Drop)功能因其直观的操作方式和良好的用户体验而被广泛应用于各类网页应用...

    基于原生JavaScript拖拽效果的实现.pdf

    基于原生JavaScript拖拽效果的实现 在网页开发过程中,拖拽效果是一种常用的特效,但开发者在利用原生JavaScript设计拖拽效果时,经常会出现各种各样的问题。因此,本文将详细介绍基于原生JavaScript拖拽效果的实现...

    懒人原生JavaScript拖拽效果代码

    原生JavaScript拖拽效果是一种常见的用户界面功能,它可以增强网站的互动性和可用性。本文将深入探讨如何使用纯JavaScript实现一个简单、高效的拖拽功能,且无需依赖任何外部库。 首先,标题“懒人原生JavaScript...

    javascript js拖拽缩放

    javascript js拖拽缩放 可以任意缩小放大

    javascript拖拽图片到指定位置.rar

    javascript拖拽图片到指定位置.rar javascript拖拽图片到指定位置.rar javascript拖拽图片到指定位置.rar javascript拖拽图片到指定位置.rar javascript拖拽图片到指定位置.rar javascript拖拽图片到指定位置....

    完美的JavaScript拖拽效果-dbx

    "完美的JavaScript拖拽效果-dbx"是一个关于如何使用JavaScript创建流畅、用户友好的拖放功能的教学资源。在这个教程中,我们将深入探讨JavaScript拖拽效果的实现原理和技巧。 拖拽效果是现代网页设计中常见的一种...

    Javascript jquery 实现 拖拽, 和吸附功能

    在JavaScript和jQuery的世界里,实现元素的拖拽(Draggable)和吸附(Docking)功能是一项常见的需求,尤其是在创建交互式用户界面时。本篇将深入讲解如何利用这两种技术来增强网页的动态性和用户体验。 首先,...

    javascript可拖动的日历

    本文将深入探讨如何利用JavaScript实现一个可拖动的日历组件,同时结合提供的标签"javascript"和"日历"来解析这一技术。 首先,创建一个可拖动的日历组件涉及到的主要知识点包括: 1. **事件监听**:JavaScript中...

    javaScript实现DIV简单拖拽

    javaScript实现DIV简单拖拽

    JavaScript图片拖动效果

    在JavaScript中实现图片拖动效果是一项常见的交互设计技术,它能增强用户在网页上的操作体验。这个技术主要基于HTML5的拖放API(Drag and Drop API),通过JavaScript事件监听和处理来实现。以下是对这一技术的详细...

    javascript 分页拖拽效果

    用javascript实现的分页 可以拖拽 超炫

    javascript无刷新窗口,鼠标壳拖动窗口位置

    在JavaScript编程中,实现无刷新窗口以及允许用户通过鼠标拖动窗口位置的技术是现代Web应用中常见的需求。这种功能能够提供更加流畅和交互性强的用户体验,尤其适用于弹出框、对话框或者浮动面板等元素。以下是对这...

    javascript拖动div或table等网页元素

    JavaScript 提供了实现这一功能的强大支持,特别是对于div、table等网页元素的拖动操作。在这个主题中,我们将深入探讨如何使用JavaScript来实现这些元素的拖放功能,并兼容不同的浏览器,包括IE、Firefox、Opera和...

Global site tag (gtag.js) - Google Analytics