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 相关文章推荐
JavaScript高级程序设计(第3版)学习笔记6 初识js对象
Oct 11 Javascript
JS 实现获取打开一个界面中输入的值
Mar 19 Javascript
js 浏览本地文件夹系统示例代码
Oct 24 Javascript
利用window.name实现windowStorage代码分享
Jan 02 Javascript
JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
Aug 16 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
Oct 15 Javascript
js鼠标经过tab选项卡时实现切换延迟
Mar 24 Javascript
神级程序员JavaScript300行代码搞定汉字转拼音
May 20 Javascript
微信小程序分页加载的实例代码
Jul 11 Javascript
JS 仿支付宝input文本输入框放大组件的实例
Nov 14 Javascript
layui使用表格渲染获取行数据的例子
Sep 13 Javascript
vue element-ui中table合计指定列求和实例
Nov 02 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
《忧国的莫里亚蒂》先导宣传图与STAFF公开
2020/03/04 日漫
php引用计数器进行垃圾收集机制介绍
2012/09/19 PHP
解析php中的escape函数
2013/06/29 PHP
joomla实现注册用户添加新字段的方法
2016/05/05 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
不用MOUSEMOVE也能滑动啊
2007/05/23 Javascript
JS实现self的resend
2010/07/22 Javascript
jQuery切换网页皮肤并保存到Cookie示例代码
2014/06/16 Javascript
JavaScript:Array类型全面解析
2016/05/19 Javascript
JS实现页面中所有img对象添加onclick事件及新窗口查看图片的方法
2016/12/27 Javascript
浅谈Angular4中常用管道
2017/09/27 Javascript
vue2.0+vue-router构建一个简单的列表页的示例代码
2019/02/13 Javascript
如何用原生js写一个弹窗消息提醒插件
2019/05/24 Javascript
js滚轮事件 js自定义滚动条的实现
2020/01/18 Javascript
vue 解决兄弟组件、跨组件深层次的通信操作
2020/07/27 Javascript
[03:11]DOTA2上海特锦赛小组赛第一日recap精彩回顾
2016/02/28 DOTA
python关闭windows进程的方法
2015/04/18 Python
python使用smtplib模块通过gmail实现邮件发送的方法
2015/05/08 Python
Python实现短网址ShortUrl的Hash运算实例讲解
2015/08/10 Python
python实现12306火车票查询器
2017/04/20 Python
Python爬虫获取整个站点中的所有外部链接代码示例
2017/12/26 Python
Python实现的tcp端口检测操作示例
2018/07/24 Python
在Python 中实现图片加框和加字的方法
2019/01/26 Python
Python实现的爬取百度文库功能示例
2019/02/16 Python
python实现把两个二维array叠加成三维array示例
2019/11/29 Python
手把手教你将Flask应用封装成Docker服务的实现
2020/08/19 Python
介绍一下常见的木马种类
2014/11/15 面试题
EntityManager都有哪些方法
2013/11/01 面试题
购房委托书范本
2014/09/18 职场文书
党的群众路线教育实践活动个人对照检查材料(公安)
2014/11/05 职场文书
又涨知识了,自律到底多重要?
2019/06/27 职场文书
汽车销售合同文本
2019/08/08 职场文书
Oracle笔记
2021/04/05 Oracle
Python中使用subprocess库创建附加进程
2021/05/11 Python
php实例化对象的实例方法
2021/11/17 PHP
排查Tomcat进程假死的问题
2022/05/06 Servers