<html>
<body style="margin:0px;">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
<div id="drag" style="width:100px; height:100px; background-color:red; z-index:1"></div>
<div id="drop" style="width:200px; height:200px;background-color:blue; top:100px; position:absolute;"></div>
<script>
var
ev ,
dragObj = null ,
dragpos ,
tArr = [] ,
oriLoc = {} ,
canMove = true;
Number.prototype.NaN0 = function(){ return isNaN(this) ? 0 : this; };
function mouseMove(ev){
ev = ev || window.event;
var mp = getEvLoc(ev);
if(dragObj && canMove){
dragObj.style.position = 'absolute';
dragObj.style.top = mp.y - dragpos.y;
dragObj.style.left = mp.x - dragpos.x;
}
} function mouseDown(ev){
ev = ev || window.event;
var t = ev.target || ev.srcElement;
if( t.id == 'drag' ){
dragObj = t;
canMove = true;
dragpos = getOffset(t ,ev);
return false;
}
} function getOffset( t, ev ){ var po = getEvLoc( ev );
oriLoc = getPosition( t );
return {x: (po.x - oriLoc.x), y: (po.y - oriLoc.y) }; } function mouseUp(ev){
if(!dragObj)
return false;
ev = ev || window.event;
var mp = getEvLoc(ev) , canDrop = false;
for(var i in tArr){
var tempTar = tArr[i];
var tp = getPosition(tArr[i]);
var tw = tempTar.offsetWidth;
var th = tempTar.offsetHeight;
if( mp.x > tp.x && mp.x < (tp.x + tw) && mp.y > tp.y && mp.y < (tp.y + th) ){
canDrop = true;
}
}
if(!canDrop){
canMove = false;
dragObj.style.position = 'relative';
dragObj.style.top = oriLoc.y;
dragObj.style.left = oriLoc.x;
}
dragObj = null;
return false;
}
function getEvLoc( ev ){
if(ev.pageX || ev.pageY){
return { x:ev.pageX, y: ev.pageY};
}
return {
x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
y:ev.clientY + document.body.scrollTop - document.body.clientTop
};
} function getPosition( e ){
var left = 0;
var top = 0;
while (e.offsetParent){
left += e.offsetLeft + (e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0);
top += e.offsetTop + (e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0);
e = e.offsetParent;
} left += e.offsetLeft + (e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0);
top += e.offsetTop + (e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0); return {x:left, y:top}; } function addDropTarget( obj ){
tArr.push(obj);
} addDropTarget(document.getElementById('drop'));
document.onmousedown = mouseDown;
document.onmousemove = mouseMove;
document.onmouseup = mouseUp;
</script> </body>
</html>

后续功能做成插件形式~

JS 实现拖动效果的更多相关文章

  1. JS实现拖动效果

    有个问题就是该模块要使用定位,因为有left,top属性使用,绝对定位和相对定位都行,当然你也可使用margin-left,和margin-top这2个属性,替换left,top也是可以得 这样就不用 ...

  2. js 实现win7任务栏拖动效果

    前言 在某个时刻, 我认识了一个朋友. 此人在我的教唆下, 踏上了js的不归路. 前天他问我, Win7任务栏拖动效果怎么实现. 我随口就跟他说, 这简单的一逼. 在我一晚上的折腾之后, 一份潦草的代 ...

  3. HTML 通过js实现div的拖动效果

    最近做项目,碰到一个问题,需要对div实现拖动效果. 在度娘找了很多,要么觉得代码太长,要么就是效果不理想,不过最后还是找到了一个不错的,感谢大神的留贴,方便了我们,就把代码贴下面了: <!DO ...

  4. 原生JS实现拖动滑块验证登录效果

    ♀分享一组利用原生JS实现拖动滑块验证效果 ♀在这个组代码中涉及三个方面的知识: ⑴事件处理 ⑵添加验证标记 ⑶选择器的封装   代码如下: <!DOCTYPE html> <htm ...

  5. Js 拖动效果

    <!DOCTYPE html> <html> <head> <meta charset="utf8"> <title>j ...

  6. js实现一个可以兼容PC端和移动端的div拖动效果

    前段时间写了一个简单的div拖动效果,不料昨天项目上正好需要一个相差不多的需求,就正好用上了,但是在移动端的时候却碰到了问题,拖动时候用到的三个事件:mousedown.mousemove.mouse ...

  7. React.js实现原生js拖拽效果及思考

    一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖 ...

  8. jquery div拖动效果示例代码

    div拖动效果想必大家都有见到过吧,实现的方法也是有很多的,下面为大家将介绍使用jquery是如何实现的,感兴趣的朋友不要错过 复制代码代码如下: <%@ page language=" ...

  9. Web的鼠标拖动效果

    以前写过一个拖动效果的Demo,拖拽元素新位置的计算是放在拖拽元素的mousemove事件中进行的.计算效率差,而且效果不好.所以一直有想怎样才能做出jquery-ui那种顺滑的拖拽效果. 其实顺滑的 ...

随机推荐

  1. Failed to import package with error: Couldn't decompress package的解决方案

    问题的出现 在Unity中导入一个Package文件,出现以下出错信息 解决方案 遇到这样的报错信息,一般就是要将该文件包的存储路径设置为英文,因为Unity不识别中文路径:其次对文件包的命名中间应没 ...

  2. sqlite学习笔记1:编译数据库

    首先说下我使用的是Linux环境 一 下载源代码 官网下载:点这里 二 编译 1 解压 下载完毕之后通常会在当前用户的"下载"文件夹中,首先cd到下载文件夹,然后创建一个文件件.用 ...

  3. MySQL 数据库定时自动备份

    创建备份目录 cd /home mkdir backup cd backup 创建备份 Shell 脚本: vim DatabaseName.sh #!/bin/bash /usr/local/mys ...

  4. XAMPP permissions on Mac OS X

    $ cd /Applications $ XAMPP/ 注意: 改变的是XAMPP目录,而不是htdocs ref: http://stackoverflow.com/questions/904697 ...

  5. vim定位到指定行数

    显示行号:命令模式下set nu 定位到指定行: 命令模式下,:n   比如想到第2行,:2 编辑模式下,ngg  比如想到第5行 5gg(或者5G) 打开文件定位到指定行   vim  +n  te ...

  6. u3d资源打包只能打包场景材质,不能打包脚本

    GameObject附带脚本打包进来以后,只有一个脚本名字,估计只是关联了脚本,内容却不在,所以后面打包资源的话,一定要把脚本,shader之类的,放到工程目录下

  7. 不确定行数的多行文本垂直水平居中的css

    ul li { position:relative; display: table; width:3rem; height:3rem; background:url('image/defaultBg. ...

  8. Unity3D编辑器之重写Hierarchy的右键菜单

    using UnityEngine; using UnityEditor; using System.Collections; public class MyHierarchyMenu { [Menu ...

  9. 将nosetests的echo结果保存到本地文件

    nose是很好用的python 测试框架. 但是一直很纠结如何将结果保存到本地.采用nosetests -h查看相关的options,找到一个xunit的东西,似乎可以实现功能. 测试结果: 可见,已 ...

  10. QT编译错误:undefined reference to `__imp_gl*'等等

    学习QT OpenGL绘制图形,程序中使用了OpenGL的API函数(gl开头),但是编译出现了错误:截图如下 有过编程经验的人可知,是链接的时候出错,找不到函数的实现! 解决方法:在工程*.pro文 ...