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 相关文章推荐
通过js脚本复制网页上的一个表格的不错实现方法
Dec 29 Javascript
ajax异步刷新实现更新数据库
Dec 03 Javascript
JavaScript中对象的不同创建方法
Aug 12 Javascript
vue2.0 中#$emit,$on的使用详解
Jun 07 Javascript
javascript填充默认头像方法
Feb 22 Javascript
JavaScript分步实现一个出生日期的正则表达式
Mar 22 Javascript
基于vue中对鼠标划过事件的处理方式详解
Aug 22 Javascript
Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验
Apr 22 Javascript
vue使用高德地图点击下钻上浮效果的实现思路
Oct 12 Javascript
vue实现商城秒杀倒计时功能
Dec 12 Javascript
微信小程序语音同步智能识别的实现案例代码解析
May 29 Javascript
JavaScript执行机制详细介绍
Dec 06 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制作图型计数器的例子
2006/10/09 PHP
phpmyadmin MySQL 加密配置方法
2009/07/05 PHP
PHP中使用CURL伪造来路抓取页面或文件
2011/05/04 PHP
详解php用curl调用接口方法,get和post两种方式
2017/01/13 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
2017/06/19 PHP
php进行md5加密简单实例方法
2019/09/19 PHP
Laravel基础-关于引入公共文件的两种方式
2019/10/18 PHP
jqPlot 图表中文API使用文档及源码和在线示例
2012/02/07 Javascript
Js如何判断客户端是PC还是手持设备简单分析
2012/11/22 Javascript
图片无缝滚动代码(向左/向下/向上)
2013/04/10 Javascript
javascript用户注册提示效果的简单实例
2013/08/17 Javascript
javascript读取Xml文件做一个二级联动菜单示例
2014/03/17 Javascript
JavaScript转换与解析JSON方法实例详解
2015/11/24 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
2016/04/29 Javascript
JS实现左右无缝轮播图代码
2016/05/01 Javascript
ionic实现带字的toggle滑动组件
2016/08/27 Javascript
jQuery实现的右下角广告窗体跟随效果示例
2016/09/16 Javascript
JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍
2016/11/10 Javascript
快速掌握jQuery插件开发
2017/01/19 Javascript
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
2017/07/11 Javascript
vue iView 上传组件之手动上传功能
2018/03/16 Javascript
Vue文件配置全局变量的实例
2018/09/06 Javascript
jqGrid表格底部汇总、合计行footerrow处理
2019/08/21 Javascript
[01:32]2014DOTA2西雅图邀请赛 CIS我们有信心进入正赛
2014/07/08 DOTA
对python调用RPC接口的实例详解
2019/01/03 Python
python的一些加密方法及python 加密模块
2019/07/11 Python
python 3.6.7实现端口扫描器
2019/09/04 Python
aec加密 php_php aes加密解密类(兼容php5、php7)
2021/03/14 PHP
基于HTML5 FileSystem API的使用介绍
2013/04/24 HTML / CSS
Canvas获取视频第一帧缩略图的实现
2020/11/11 HTML / CSS
俄罗斯童装网上商店:BebaKids
2020/06/06 全球购物
蔻驰英国官网:COACH英国
2020/07/19 全球购物
男方父母婚礼答谢词
2014/01/25 职场文书
党员群众路线剖析材料
2014/10/08 职场文书
群众路线个人剖析材料及整改措施
2014/11/04 职场文书
Python安装使用Scrapy框架
2022/04/12 Python