js实现可拖拽的div
前言
下午忙里偷闲想写一个可拖拽的例子,留在脑海里一直都是三个事件mouseDown,mouseUp,mouseMove, 但从没有动手实践过,今天想起了自己实践了并学习了张鑫旭的demo实现。 学习张鑫旭代码的同时又了解了几知识点。
1、obj.currentStyle[attr] 和getComputedStyle(obj,false)[attr]。获取DOM非行间样式。 我百度了下currentStyle看到有的说Chrome和FF是不支持的,为了兼容,所以用到了这两个方法。
2、onselectstart。 IE和Chrome适用,防止内容被选中默认是true。
拖拽原理
1、可拖拽的div主要是确定mouseDown事件发生时的DOM承载对象,以及mouseMove时的坐标计算。
2、其次是当拖拽完成时的DOM承载对象。多数会选择document,不知道我理解的对不对?
效果图

js
/**
拖拽div
关键事件:mouseDown, mouseMove,mouseUp
**/ var params={
top:0,
left:0,
currentX:0,
currentY:0,
flag:false
}; /**
obj.currentStyle[attr]
getComputedStyle(obj,false)[attr] 获取DOM非行间样式
**/
var getCss=function(o,key){
return o.currentStyle ? o.currentStyle[key] : document.defaultView.getComputedStyle(o,false)[key];
} var startDrag=function(bar,target,callback){ if(getCss(target,'left')!='auto'){
params.left=getCss(target,'left');
}
if(getCss(target,'top')!='auto'){
params.top=getCss(target,'top');
}
bar.onmousedown=function(event){
params.flag=true;
if(!event){
event=window.even;
bar.onselectstart=function(){ //IE和Chrome适用,防止内容被选中默认是true
return false;
}
}
var e=event;
params.currentX=e.clientX;
params.currentY=e.clientY;
} document.onmouseup=function(){
params.flag=false;
if(getCss(target,"left") !='auto'){
params.left=getCss(target,'left');
}
if(getCss(target,'top') !='auto'){
params.top=getCss(target,'top');
}
}
document.onmousemove=function(event){
var e=event?event:window.event;
if(params.flag){
var nowX=e.clientX,nowY=e.clientY;
var disX=nowX-params.currentX, disY=nowY-params.currentY;
target.style.left=parseInt(params.left)+disX+'px';
target.style.top=parseInt(params.top)+disY+'px';
} if(callback=='function'){
callback(parseInt(params.left)+disX,parseInt(params.top)+disY);
}
}
}
下载地址:http://yunpan.cn/cwTJmDQWtAgLs 访问密码 7d22
js实现可拖拽的div的更多相关文章
- js可以随意拖拽的div的实现
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 简单的div元素拖拽到div
drag1 drag2 drag3 代码如下: <!DOCTYPE HTML> <html> <head> <title>div拖拽到div</t ...
- JS Event 鼠标拖拽事件
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- js插件-简单拖拽
前端开发的时候,有好多地方用到拖拽效果,当然 http://jqueryui.com/draggable/ 是个不错的选择,but 我是个打破砂锅问到底的人,抽点时间用js小小的实现了类似的插件,话 ...
- 拖拽改变div的大小
拖拽改变div的大小 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&qu ...
- 可以随鼠标拖拽的div
可以拖拽的div <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...
- php和js实现文件拖拽上传
Dropzone.js实现文件拖拽上传 http://www.sucaihuo.com/php/1399.html demo http://www.sucaihuo.com/jquery/13/139 ...
- Dropzone.js实现文件拖拽上传
dropzone.js是一个开源的JavaScript库,提供 AJAX 异步文件上传功能,支持拖拽文件.支持最大文件大小.支持设置文件类型.支持预览上传结果,不依赖jQuery库. 使用Dropzo ...
- jquery实现可拖拽的div
由于项目中并未引入前端开发框架easyui.ext.没有现成的控件可以使用,今天时间算是充裕的时候,自己写了一个可以拖拽.放大缩小的例子.欢迎大家指正. 不啰嗦,上代码: 依赖的文件:jquery.j ...
随机推荐
- Java虚拟机
虚拟机每次方法的调用和返回都伴随着栈帧的入栈和出栈,而每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用(表明该栈帧执行的是哪个方法),持有这个引用是为了支持方法调用中的动态连接.这些符号引用中 ...
- Android-Parcelable
Parcelable和Serializable的区别: android自定义对象可序列化有两个选择一个是Serializable和Parcelable 一.对象为什么需要序列化 1.永久 ...
- 多线程导出大规模excel文件
文章有点水,和前几篇没有太大区别,但是单线程处理大文件导出会非常耗时间,用到多线程才能更加合理的利用资源.大文件也可能会超出excel工作表范围.这里也有相应处理 参考:用DataGridView导入 ...
- XMPP iOS客户端实现二:xcode项目配置
1.下载XMPPFramework,下载地址:https://github.com/robbiehanson/XMPPFramework 2.创建项目并将XMPP库引入: 3.添加需要的库文件: 4. ...
- Apache许可协议Open RIA Services
Jeff Handley's进行了多年的项目--基于一份开源许可发布WCF RIA Services.遵循Apache 2许可,捐赠给Outercurve基金会的ASP.NET Open Source ...
- .NET面试题系列[14] - LINQ to SQL与IQueryable
.NET面试题系列目录 名言警句 "理解IQueryable的最简单方式就是,把它看作一个查询,在执行的时候,将会生成结果序列." - Jon Skeet LINQ to Obje ...
- .net core中使用openssl的公钥私钥进行加解密
这篇博文分享的是 C#中使用OpenSSL的公钥加密/私钥解密 一文中的解决方法在 .net core 中的改进.之前的博文针对的是 .NET Framework ,加解密用的是 RSACryptoS ...
- C#+无unsafe的非托管大数组(large unmanaged array in c# without 'unsafe' keyword)
C#+无unsafe的非托管大数组(large unmanaged array in c# without 'unsafe' keyword) +BIT祝威+悄悄在此留下版了个权的信息说: C#申请一 ...
- 现代程序设计 网页前端开发作业(to 邹欣老师)
在一些著名的网站的搜索框上,会有一种“自动完成”功能. 比如google.百度和淘宝: 现在,我们来考虑如何实现这个功能. 第一步:模仿任意一个网站,编写一个类似的网页效果原型. 在这一步,不要估计开 ...
- 3dmax模型制作备忘录
md2导出: http://thegreystudios.com/blog/?p=278 http://wenku.baidu.com/view/4d5652e2524de518964b7d89.ht ...