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 解析读取XML文档 实例代码
Jul 07 Javascript
javascript判断机器是否联网的2种方法
Aug 09 Javascript
javascript模拟实现C# String.format函数功能代码
Nov 25 Javascript
JavaScript新窗口与子窗口传值详解
Feb 11 Javascript
浅谈JavaScript的事件
Feb 27 Javascript
IE浏览器下PNG相关功能
Jul 05 Javascript
Bootstrap框架动态生成Web页面文章内目录的方法
May 12 Javascript
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
Dec 15 Javascript
js实现倒计时效果(小于10补零)
Mar 08 Javascript
在element-ui的select下拉框加上滚动加载
Apr 18 Javascript
vue两组件间值传递 $router.push实现方法
May 15 Javascript
JS如何寻找数组中心索引过程解析
Jun 01 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 存储文本换行实现方法
2010/01/05 PHP
PHP中防止SQL注入攻击和XSS攻击的两个简单方法
2010/04/15 PHP
php 数组随机取值的简单实例
2016/05/23 PHP
javascript demo 基本技巧
2009/12/18 Javascript
JQuery的自定义事件代码,触发,绑定简单实例
2013/08/01 Javascript
解决js中window.open弹出的是上次的缓存页面问题
2013/12/29 Javascript
重写document.write实现无阻塞加载js广告(补充)
2014/12/12 Javascript
jQuery实现两款有动画功能的导航菜单代码
2015/09/16 Javascript
JavaScript的代码编写格式规范指南
2015/12/07 Javascript
Javascript中函数名.length属性用法分析(对比arguments.length)
2016/09/16 Javascript
在 Angular中 使用 Lodash 的方法
2018/02/11 Javascript
vue通过点击事件读取音频文件的方法
2018/05/30 Javascript
vue.js添加一些触摸事件以及安装fastclick的实例
2018/08/28 Javascript
jquery使用FormData实现异步上传文件
2018/10/25 jQuery
微信小程序在text文本实现多种字体样式
2019/11/08 Javascript
[56:46]Liquid vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
使用python实现strcmp函数功能示例
2014/03/25 Python
Python中无限元素列表的实现方法
2014/08/18 Python
Python+微信接口实现运维报警
2016/08/27 Python
Python matplotlib通过plt.scatter画空心圆标记出特定的点方法
2018/12/13 Python
详解如何用TensorFlow训练和识别/分类自定义图片
2019/08/05 Python
Django之模板层的实现代码
2019/09/09 Python
python实现大量图片重命名
2020/03/23 Python
Python类成员继承重写的实现
2020/09/16 Python
CSS3 calc()会计算属性详解
2018/02/27 HTML / CSS
Photobook澳大利亚:制作相片书,婚礼卡,旅行相簿
2017/01/12 全球购物
美国领先的家庭健康检测试剂盒提供商:LetsGetChecked
2019/03/18 全球购物
EMU Australia澳大利亚官网:澳大利亚本土雪地靴品牌
2019/07/24 全球购物
电子商务专业个人的自我评价
2013/11/19 职场文书
羽毛球社团活动总结
2014/06/27 职场文书
小学生我的梦想演讲稿
2014/08/21 职场文书
工作失职检讨书(精华篇)
2014/10/15 职场文书
刑事法律意见书
2015/06/04 职场文书
赤壁观后感(2)
2015/06/15 职场文书
Python Pandas模块实现数据的统计分析的方法
2021/06/24 Python
Go获取两个时区的时间差
2022/04/20 Golang