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 学习笔记(十五)
Jan 28 Javascript
基于JQuery实现相同内容合并单元格的代码
Jan 12 Javascript
如何用JavaScript动态呼叫函数(两种方式)
May 03 Javascript
JS localStorage实现本地缓存的方法
Jun 22 Javascript
JavaScript DOM节点添加示例
Jul 16 Javascript
JS去除iframe滚动条的方法
Apr 01 Javascript
jQuery插件扩展实例【添加回调函数】
Nov 26 Javascript
bootstrap3使用bootstrap datetimepicker日期插件
May 24 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
Aug 16 Javascript
Vue 父子组件数据传递的四种方式( inheritAttrs + $attrs + $listeners)
May 04 Javascript
在webstorm中配置less的方法详解
Sep 25 Javascript
在 HTML 页面中使用 React的场景分析
Jan 18 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
星际争霸中的对战模式介绍
2020/03/04 星际争霸
浅析php中json_encode()和json_decode()
2014/05/25 PHP
php生成rss类用法实例
2015/04/14 PHP
laravel框架添加数据,显示数据,返回成功值的方法
2019/10/11 PHP
javascript 有用的脚本函数
2009/05/07 Javascript
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
JS生成随机字符串的多种方法
2014/06/10 Javascript
javascript模拟post提交隐藏地址栏的参数
2014/09/03 Javascript
NodeJS中Buffer模块详解
2015/01/07 NodeJs
js实现拉幕效果的广告代码
2015/09/02 Javascript
Node.js文件操作方法汇总
2016/03/22 Javascript
JS弹出层遮罩,隐藏背景页面滚动条细节优化分析
2016/04/29 Javascript
jQuery简单验证上传文件大小及类型的方法
2016/06/02 Javascript
jQuery+CSS3实现点赞功能
2017/03/13 Javascript
js实现图片局部放大效果详解
2019/03/18 Javascript
详解如何在Vue项目中导出Excel
2019/04/19 Javascript
Vue实现商品详情页的评价列表功能
2019/09/04 Javascript
vue-cli 为项目设置别名的方法
2019/10/15 Javascript
[35:43]2018DOTA2亚洲邀请赛 4.1 小组赛B组 paiN vs Effect
2018/04/03 DOTA
python实现对指定字符串补足固定长度倍数截断输出的方法
2018/11/15 Python
对python中字典keys,values,items的使用详解
2019/02/03 Python
Flask框架学习笔记之模板操作实例详解
2019/08/15 Python
python 实现字符串下标的输出功能
2020/02/13 Python
使用keras实现densenet和Xception的模型融合
2020/05/23 Python
python 逆向爬虫正确调用 JAR 加密逻辑
2021/01/12 Python
在网上学习全世界最好的课程:Coursera
2017/11/07 全球购物
如何安装ruby on rails
2014/02/09 面试题
公司委托书格式范文
2014/04/04 职场文书
文体活动总结范文
2014/05/05 职场文书
“四风”问题整改措施和努力方向
2014/09/20 职场文书
司法局群众路线教育实践活动整改措施思想汇报
2014/10/13 职场文书
合作合同协议书范本
2015/01/27 职场文书
运动会3000米加油稿
2015/07/21 职场文书
创业计划书之川味火锅店
2019/09/02 职场文书
html css3不拉伸图片显示效果
2021/06/07 HTML / CSS