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 相关文章推荐
syntaxhighlighter 使用方法
Jul 02 Javascript
基于jquery的DIV随滚动条滚动而滚动的代码
Jul 20 Javascript
实例详解AngularJS实现无限级联动菜单
Jan 15 Javascript
JavaScript中实现键值对应的字典与哈希表结构的示例
Jun 12 Javascript
BootStrap实现鼠标悬停下拉列表功能
Feb 17 Javascript
JS解决position:sticky的兼容性问题的方法
Oct 17 Javascript
JavaScript模块详解
Dec 18 Javascript
Vue中Quill富文本编辑器的使用教程
Sep 21 Javascript
基于JS实现视频上传显示进度条
May 12 Javascript
使用Taro实现小程序商城的购物车功能模块的实例代码
Jun 05 Javascript
vue+canvas实现拼图小游戏
Sep 18 Javascript
javascript实现前端分页功能
Nov 26 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
VFP与其他应用程序的集成
2006/10/09 PHP
使用淘宝IP库获取用户ip地理位置
2013/10/27 PHP
php实现将任意进制数转换成10进制的方法
2015/04/17 PHP
PHP实现的curl批量请求操作示例
2018/06/06 PHP
用JavaScript事件串连执行多个处理过程的方法
2007/03/09 Javascript
Js 刷新框架页的代码
2010/04/13 Javascript
javascript实现json页面分页实例代码
2014/02/20 Javascript
一个css与js结合的下拉菜单支持主流浏览器
2014/10/08 Javascript
JavaScript面向对象程序设计教程
2016/03/29 Javascript
下雪了 javascript实现雪花飞舞
2020/08/02 Javascript
seajs模块之间依赖的加载以及模块的执行
2016/10/21 Javascript
Vue.js路由vue-router使用方法详解
2017/03/20 Javascript
JS数组操作之增删改查的简单实现
2017/08/21 Javascript
jQuery实现常见的隐藏与展示列表效果示例
2018/06/04 jQuery
如何用RxJS实现Redux Form
2018/12/29 Javascript
layui--js控制switch的切换方法
2019/09/03 Javascript
Jquery 动态添加元素并添加点击事件实现过程解析
2019/10/12 jQuery
解决vue初始化项目一直停在downloading template的问题
2020/11/09 Javascript
[57:16]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第二场
2014/05/26 DOTA
[36:05]DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs Optic
2018/04/01 DOTA
Python实现的计数排序算法示例
2017/11/29 Python
python中的decorator的作用详解
2018/07/26 Python
Python如何获得百度统计API的数据并发送邮件示例代码
2019/01/27 Python
Python中numpy模块常见用法demo实例小结
2019/03/16 Python
python opencv实现图像边缘检测
2019/04/29 Python
python 实现任务管理清单案例
2020/04/25 Python
python代码实现将列表中重复元素之间的内容全部滤除
2020/05/22 Python
HTML5的自定义属性data-*详细介绍和JS操作实例
2014/04/10 HTML / CSS
建筑专业自我鉴定
2013/10/22 职场文书
敬老院献爱心活动总结
2014/07/08 职场文书
机械专业求职信范文
2014/07/15 职场文书
2014年无财产无子女离婚协议书范本
2014/10/09 职场文书
2014年政风行风工作总结
2014/11/22 职场文书
公司经营目标责任书
2015/01/29 职场文书
2015年小学总务工作总结
2015/07/21 职场文书
导游词之山海关
2019/12/10 职场文书