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 1.42 checkbox 全选和反选代码
Mar 27 Javascript
JavaScript中清空数组的三种方法分享
Apr 07 Javascript
JS判断不能为空实例代码
Nov 26 Javascript
js构造函数、索引数组和属性的实现方式和使用
Nov 16 Javascript
javascript实现瀑布流加载图片原理
Feb 02 Javascript
网页中JS函数自动执行常用三种方法
Mar 30 Javascript
Knockout结合Bootstrap创建动态UI实现产品列表管理
Sep 14 Javascript
基于chosen插件实现人员选择树搜索自动筛选功能
Sep 24 Javascript
微信小程序实战之轮播图(3)
Apr 17 Javascript
Angular2安装angular-cli
May 21 Javascript
如何以Angular的姿势打开Font-Awesome详解
Apr 22 Javascript
JS实现计算小于非负数n的素数的数量算法示例
Feb 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
一个可以删除字符串中HTML标记的PHP函数
2006/10/09 PHP
Apache2 httpd.conf 中文版
2006/12/06 PHP
深入探讨:PHP使用数据库永久连接方式操作MySQL的是与非
2013/06/05 PHP
PHP中的print_r 与 var_dump 输出数组
2016/06/13 PHP
javascript 尚未实现错误解决办法
2008/11/27 Javascript
js阻止默认事件与js阻止事件冒泡示例分享 js阻止冒泡事件
2014/01/27 Javascript
jQuery实现设置、移除文本框默认值功能
2015/01/13 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
windows下安装nodejs及框架express
2015/08/07 NodeJs
逻辑表达式中与或非的用法详解
2016/06/06 Javascript
Vue.js学习之过滤器详解
2017/01/22 Javascript
Vue组件创建和传值的方法
2018/08/17 Javascript
jquery实现联想词搜索框和搜索结果分页的示例
2018/10/10 jQuery
微信小程序实现复选框效果
2018/12/28 Javascript
JS前端知识点总结之页面加载事件,数组操作,DOM节点操作,循环和分支
2019/07/04 Javascript
Vue+penlayers实现多边形绘制及展示
2020/12/24 Vue.js
vue实现图书管理系统
2020/12/29 Vue.js
Node使用koa2实现一个简单JWT鉴权的方法
2021/01/26 Javascript
python调用机器喇叭发出蜂鸣声(Beep)的方法
2015/03/23 Python
详解python实现读取邮件数据并下载附件的实例
2017/08/03 Python
Python操作mongodb数据库的方法详解
2018/12/08 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
Python时间和字符串转换操作实例分析
2019/03/16 Python
Python格式化字符串f-string概览(小结)
2019/06/18 Python
ML神器:sklearn的快速使用及入门
2019/07/11 Python
python-numpy-指数分布实例详解
2019/12/07 Python
Python 忽略文件名编码的方法
2020/08/01 Python
很酷的HTML5电子书翻页动画特效
2016/02/25 HTML / CSS
五一服装活动方案
2014/01/11 职场文书
给分销商的致歉信
2014/01/14 职场文书
房地产项目建议书
2014/03/12 职场文书
2014年关于两会精神的心得体会
2014/03/17 职场文书
2015年春训学习心得体会范文
2015/03/09 职场文书
2016抗战胜利71周年红领巾广播稿
2015/12/18 职场文书
教你使用Python pypinyin库实现汉字转拼音
2021/05/27 Python
原型和原型链 prototype和proto的区别详情
2021/11/02 Javascript