js最简单的拖拽效果实现代码


Posted in Javascript onSeptember 24, 2010

其实对于弹出层而言,拖拽最初的目的很单纯,就是为了通过拉开层,使被弹出层挡住的内容可见,(当然,后来关于拖拽的功能不断被优化,使得拖拽的应用有了别的意义,最典型的如igoogle的自定义首页,通过拖放的形式满足用户自定义想要的内容模块顺序和位置)。

本文讨论的重点不是iGoogle的拖放效果,那属于进阶篇,本文是拖拽的“第一阶”,如题,实现最简单的拖拽。
这里的“最简单”即不考虑多个拖拽层的堆叠顺序,不考虑拖拽范围限制,不考虑类似iGoogle的“dragTo”的效果等等。。。

恩,废话不多说了,先给大家看个实例吧:

拖我试试...
content...点此-->打开 由于我是直接在页面上内嵌的所有代码,加上博客园第三方插件的原因,代码执行效率高,有可能运行起来不是很流畅

拖拽其实就涉及的鼠标的三个事件,onmousedown,onmouseup,onmousemove,再结合获取鼠标的位置以及层的left和top即可实现类似的效果。

在编码的时候,有两个需要注意的地方,一个是获取当前样式,currentStyle只在ie下有效,故对于非ie我们可以通过getComputedStyle实现(当然,对于这种需要获取的属性不是很多的情况,您也可以直接用obj.style[key]来获取您当前想要的属性值)

function getStyle(o,key){return o.currentStyle? o.currentStyle[key] : document.defaultView.getComputedStyle(o,null)[key]}//'currentStyle' only for ie5.0+

另一个点就是在获取鼠标位置时要用到event,event这个东西很奇怪,ie下是局部变量,moz内核下是全局变量(说法不准确,只是便于理解),所以在获取鼠标位置时候要对event做个判断
bar.onmousedown = function(e){ 
e = e?e:window.event; //'event' ie下局部变量,ff下全局变量 
params.isDrag = true; 
params._X = e.clientX; params._Y = e.clientY; 
};

恩,注意以上两点,结合正确的思路其实就可以了,并不难,下面提供参考代码:
function getStyle(o,key){return o.currentStyle? o.currentStyle[key] : document.defaultView.getComputedStyle(o,null)[key]}//'currentStyle' only for ie5.0+ var drag = function(bar, target){ 
var params = { 
startLeft:0, 
startTop:0, 
_X:0, 
_Y:0, 
isDrag:false 
}; 
if(getStyle(target,'left') != 'auto'){params.startLeft = getStyle(target,'left')} 
if(getStyle(target,'top') != 'auto'){params.startTop = getStyle(target,'top')} 
bar.onmousedown = function(e){ 
e = e?e:window.event; //'event' ie下局部变量,ff下全局变量 
params.isDrag = true; 
params._X = e.clientX; params._Y = e.clientY; 
}; 
document.onmouseup = function(){ 
params.isDrag = false; 
if(getStyle(target,'left') != 'auto'){params.startLeft = getStyle(target,'left')} 
if(getStyle(target,'top') != 'auto'){params.startTop = getStyle(target,'top')} 
}; 
document.onmousemove = function(e){ 
var e = e?e:window.event; 
if(params.isDrag){ 
var curX = e.clientX, curY = e.clientY, desL = curX-params._X+parseInt(params.startLeft), desT = curY-params._Y+parseInt(params.startTop); 
target.style['left'] = desL>=0?desL + 'px':0; 
target.style['top'] = desT>=0?desT + 'px':0; 
} 
} 
};

恩,至此,本文差不多可以结束了,关于类似的iGoogle的拖拽进阶篇,有时间会继续的,下面结合拖拽举个综合弹出层的例子,

不设任何options参数的box(默认高200px,宽300px)
无遮罩的box
这个弹出层插件是我在上文中就提到的,而且还提供了源文件下载,在此只是加上了拖动效果而已
ps:由于代码高亮插件的原因,遮罩层上会有白色小方块,暂没做处理。。。

Javascript 相关文章推荐
基于jquery的合并table相同单元格的插件(精简版)
Apr 05 Javascript
jQuery动态添加删除select项(实现代码)
Sep 03 Javascript
使用jQuery简单实现模拟浏览器搜索功能
Dec 21 Javascript
浅谈下拉菜单中的Option对象
May 10 Javascript
JS组件Bootstrap Table表格行拖拽效果实现代码
Aug 27 Javascript
JS控制静态页面之间传递参数获取参数并应用的简单实例
Aug 10 Javascript
AngularJS应用开发思维之依赖注入3
Aug 19 Javascript
node vue项目开发之前后端分离实战记录
Dec 13 Javascript
Vue CLI4 Vue.config.js标准配置(最全注释)
Jun 05 Javascript
vue + el-form 实现的多层循环表单验证
Nov 25 Vue.js
JavaScript实现消消乐的源代码
Jan 12 Javascript
node.js文件的复制、创建文件夹等相关操作
Feb 05 Javascript
JavaScript 设计模式 安全沙箱模式
Sep 24 #Javascript
IE无法设置短域名下Cookie
Sep 23 #Javascript
Javascript中获取出错代码所在文件及行数的代码
Sep 23 #Javascript
基于JQuery的一个简单的鼠标跟随提示效果
Sep 23 #Javascript
用js模拟JQuery的show与hide动画函数代码
Sep 20 #Javascript
通过DOM脚本去设置样式信息
Sep 19 #Javascript
javscript对象原型的一些看法
Sep 19 #Javascript
You might like
PHP之数组学习
2011/05/29 PHP
PHP实现的分页类定义与用法示例
2017/07/05 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
2018/03/15 PHP
最新优化收藏到网摘代码(digg,diigo)
2007/02/07 Javascript
jQuery与其它库冲突的解决方法
2010/06/25 Javascript
关于jquery中全局函数each使用介绍
2013/12/10 Javascript
js获取视频时长代码
2014/04/10 Javascript
使用Chrome调试JavaScript的断点设置和调试技巧
2014/12/16 Javascript
Eclipse引入jquery报错如何解决
2015/12/01 Javascript
js实现select下拉框菜单
2015/12/08 Javascript
Javascript发送AJAX请求实例代码
2016/08/21 Javascript
vue mounted组件的使用
2018/06/18 Javascript
在vue-cli的组件模板里使用font-awesome的两种方法
2018/09/28 Javascript
js屏蔽退格键(backspace或者叫后退键与F5)
2019/02/10 Javascript
JS实现求字符串中出现最多次数的字符和次数示例
2019/07/05 Javascript
JavaScript获取当前url路径过程解析
2019/12/27 Javascript
在vue中通过render函数给子组件设置ref操作
2020/11/17 Vue.js
[50:15]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
[01:04:09]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第二场 2月2日
2021/03/11 DOTA
Tornado服务器中绑定域名、虚拟主机的方法
2014/08/22 Python
Python创建系统目录的方法
2015/03/11 Python
详解python单例模式与metaclass
2016/01/15 Python
详解python中的线程
2018/02/10 Python
用Python抢火车票的简单小程序实现解析
2019/08/14 Python
用python生成与调用cntk模型代码演示方法
2019/08/26 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
2019/08/31 Python
Python浮点数四舍五入问题的分析与解决方法
2019/11/19 Python
基于python判断目录或者文件代码实例
2019/11/29 Python
python实现在一个画布上画多个子图
2020/01/19 Python
德国净水壶和滤芯品牌:波尔德PearlCo(家用净水器)
2020/04/29 全球购物
新加坡第一的杂货零售商:NTUC FairPrice
2020/12/05 全球购物
大学生通用个人自我评价
2014/04/27 职场文书
教师求职信
2014/06/17 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
关于Oracle12C默认用户名system密码不正确的解决方案
2021/10/16 Oracle
Pytorch中使用ImageFolder读取数据集时忽略特定文件
2022/03/23 Python