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 相关文章推荐
How to Auto Include a Javascript File
Feb 02 Javascript
Jquery+ajax请求data显示在GridView上(asp.net)
Aug 27 Javascript
将光标定位于输入框最右侧实现代码
Dec 04 Javascript
Knockoutjs快速入门(经典)
Dec 24 Javascript
jQuery实现公告文字左右滚动的实例代码
Oct 29 Javascript
使用js判断当前时区TimeZone是否是夏令时
Feb 23 Javascript
ExtJS4给Combobox设置列表中的默认值示例
May 02 Javascript
jquery ui resize 中border-box的bug修正
Apr 26 Javascript
解析Node.js基于模块和包的代码部署方式
Feb 16 Javascript
angularjs2 ng2 密码隐藏显示的实例代码
Aug 01 Javascript
微信小程序点击列表跳转到对应详情页过程解析
Sep 26 Javascript
vue-router重写push方法,解决相同路径跳转报错问题
Aug 07 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/08/11 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
PHP中的empty、isset、isnull的区别与使用实例
2019/03/22 PHP
JavaScript脚本性能的优化方法
2007/02/02 Javascript
总结AJAX相关JS代码片段和浏览器模型
2007/08/15 Javascript
写了一个layout,拖动条连贯,内容区可为iframe
2007/08/19 Javascript
JavaScript Chart 插件整理
2010/06/18 Javascript
javascript中检测变量的类型的代码
2010/12/28 Javascript
Javascript调用C#代码
2011/01/17 Javascript
JQUERY dialog的用法详细解析
2013/12/19 Javascript
confirm的用法示例用于按钮操作时确定是否执行
2014/06/19 Javascript
Javascript常用小技巧汇总
2015/06/24 Javascript
jQuery之简单的表单验证实例
2016/07/07 Javascript
jQuery实现磁力图片跟随效果完整示例
2016/09/16 Javascript
基于javascript实现按圆形排列DIV元素(三)
2016/12/02 Javascript
js移动端事件基础及常用事件库详解
2017/08/15 Javascript
node+koa实现数据mock接口的方法
2017/09/20 Javascript
解决js ajax同步请求造成浏览器假死的问题
2018/01/18 Javascript
浅析微信扫码登录原理(小结)
2018/10/29 Javascript
vue-property-decorator用法详解
2019/12/12 Javascript
js实现全选和全不选功能
2020/07/28 Javascript
Python的动态重新封装的教程
2015/04/11 Python
详解Python中expandtabs()方法的使用
2015/05/18 Python
python实现爬虫下载美女图片
2015/07/14 Python
Python使用设计模式中的责任链模式与迭代器模式的示例
2016/03/02 Python
python利用Tesseract识别验证码的方法示例
2019/01/21 Python
python打开windows应用程序的实例
2019/06/28 Python
python实现全排列代码(回溯、深度优先搜索)
2020/02/26 Python
Django 解决阿里云部署同步数据库报错的问题
2020/05/14 Python
tensorflow 大于某个值为1,小于为0的实例
2020/06/30 Python
详解Python 函数参数的拆解
2020/09/02 Python
澳大利亚家具和家居用品购物网站:Zanui
2018/12/29 全球购物
生日宴会答谢词
2014/01/09 职场文书
销售员个人求职的自我评价
2014/02/10 职场文书
捐款倡议书
2014/04/14 职场文书
2014年维修电工工作总结
2014/11/20 职场文书