推荐:怎么用javascript进行拖拽(3)

作者:雪山老人 来源:sohotx.com 时间:2007-09-21 20:14:00 

移动一个元素

我们知道了怎么捕捉鼠标移动与点击.剩下的就是移动元素了.首先,要确定一个明确的页面位置,css样式表要用'absolute'.设置元素绝对位置意味着我们可以用样式表的.top和.left来定位,可以用相对位置来定位了.我们将鼠标的移动全部相对页面top-left,基于这点,我们可以进行下一步了.

当我们定义item.style.position='absolute',所有的操作都是改变left坐标与top坐标,然后它移动了.


document.onmousemove = mouseMove;
document.onmouseup   = mouseUp;

var dragObject  = null;
var mouseOffset = null;

function getMouseOffset(target, ev){
 ev = ev || window.event;

 var docPos    = getPosition(target);
 var mousePos  = mouseCoords(ev);
 return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
}

function getPosition(e){
 var left = 0;
 var top  = 0;

 while (e.offsetParent){
  left += e.offsetLeft;
  top  += e.offsetTop;
  e     = e.offsetParent;
 }

 left += e.offsetLeft;
 top  += e.offsetTop;

 return {x:left, y:top};
}

function mouseMove(ev){
 ev           = ev || window.event;
 var mousePos = mouseCoords(ev);

 if(dragObject){
  dragObject.style.position = 'absolute';
  dragObject.style.top      = mousePos.y - mouseOffset.y;
  dragObject.style.left     = mousePos.x - mouseOffset.x;

  return false;
 }
}
function mouseUp(){
 dragObject = null;
}

function makeDraggable(item){
 if(!item) return;
 item.onmousedown = function(ev){
  dragObject  = this;
  mouseOffset = getMouseOffset(this, ev);
  return false;
 }
}


运行代码框

你会注意到这个代码几乎是前面的全集,将前面的合在一起就实现了拖拽效果了.

当我们点击一个item时,我们就获取了很多变量,如鼠标位置,鼠标位置自然就包含了那个item的坐标信息了.如果我们点击了一个20*20px图像的正中间,那么鼠标的相对坐标为{x:10,y:10}.当我们点击这个图像的左上角那么鼠标的相对坐标为{x:0,y:0}.当我们点击时,我们用这个方法取得一些鼠标与图片校对的信息.如果我们不能加载页面item,那么信息将是document信息,会忽略了点击的item信息.

mouseOffset函数使用了另一个函数getPosition.getPosition的作用是返回item相对页面左上角的坐标,如果我们尝试获取item.offsetLeft或者item.style.left,那么我们将取得item相对与父级的位置,不是整个document.所有的脚本我们都是相对整个document,这样会更好一些.

为了完成getPosition任务,必须循环取得item的父级,我们将加载内容到item的左/上的位置.我们需要管理想要的top与left列表.

自从定义了mousemove这个函数,mouseMove就会一直运行.第一我们确定item的style.position为absolute,第二我们移动item到前面定义好的位置.当mouse点击被释放,dragObject被设置为null,mouseMove将不在做任何事.

标签:拖拽,javascript
0
投稿

猜你喜欢

  • 用户不需要信息快餐

    2009-02-25 12:34:00
  • ASP连接MySQL数据库代码示例

    2010-03-14 11:24:00
  • DBA经验:如何进行MySQL数据库表的故障检测

    2009-02-12 17:37:00
  • mysql出现10061错误解决办法

    2010-07-04 13:36:00
  • asp用err.raise自定义错误信息

    2007-09-12 19:38:00
  • asp产生不重复的随机数

    2008-06-03 13:29:00
  • 解析:怎样掌握SQL Server中的数据查询

    2009-01-19 13:30:00
  • asp如何获知并显示文件的大小?

    2009-11-23 20:59:00
  • 为FCKeditor2.6添加行距功能(最新修改)

    2008-08-18 21:09:00
  • CSS中expression的用法

    2008-09-11 14:18:00
  • SQL Server复制功能 巧妙选择避开Bug

    2011-01-04 17:03:00
  • asp如何在网上查找链接?

    2010-06-22 21:10:00
  • ASP中双引号单引号和&连接符使用技巧

    2007-10-01 18:20:00
  • 安装MySQL5.0后出现1607异常的解决办法

    2009-02-26 15:52:00
  • 使用 XML HTTP Request 对象[翻译]

    2007-11-07 21:11:00
  • 如何对Oracle8数据库进行维护?

    2009-11-20 18:01:00
  • 一个奇怪的CSS现象

    2010-02-10 12:28:00
  • 如何动态在文档中加入<script></script>写入大段js?

    2010-07-02 13:17:00
  • 图文教程教你asp编译成dll组件

    2010-07-16 13:16:00
  • IE对CSS样式表的限制和解决方案

    2008-04-28 12:27:00
  • asp之家 网络编程 m.aspxhome.com