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 html 静态页面传参数
Apr 10 Javascript
javascript 读取图片文件的大小
Jun 25 Javascript
基于jquery的一个图片hover的插件
Apr 24 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
Dec 30 Javascript
求数组最大最小值方法适用于任何数组
Aug 16 Javascript
原生js的弹出层且其内的窗口居中
May 14 Javascript
jQuery判断指定id的对象是否存在的方法
May 22 Javascript
jQuery自动添加表单项的方法
Jul 13 Javascript
微信小程序中hidden不生效原因的解决办法
Apr 26 Javascript
JavaScript requestAnimationFrame动画详解
Sep 14 Javascript
详解处理Vue单页面应用SEO的另一种思路
Nov 09 Javascript
Vue3 Composition API的使用简介
Mar 29 Vue.js
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
codeigniter集成ucenter1.6双向通信的解决办法
2014/06/12 PHP
PHP代码实现爬虫记录――超管用
2015/07/31 PHP
PHP实现原比例生成缩略图的方法
2016/02/03 PHP
php mysql like 实现多关键词搜索的方法
2016/10/29 PHP
php实现的后台表格分页功能示例
2017/10/23 PHP
目前流行的JavaScript库的介绍及对比
2013/09/29 Javascript
深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制
2014/06/10 Javascript
js实现文章文字大小字号功能完整实例
2014/11/01 Javascript
JQuery解析XML的方法小结
2016/04/02 Javascript
微信小程序开发探究
2016/12/27 Javascript
详解服务端预渲染之Nuxt(介绍篇)
2019/04/07 Javascript
vue component 中引入less文件报错 Module build failed
2019/04/17 Javascript
js抽奖转盘实现方法分析
2020/05/16 Javascript
[02:44]DOTA2英雄基础教程 钢背兽
2013/12/19 DOTA
[02:56]DOTA2矮人直升机 英雄基础教程
2013/11/26 DOTA
[05:09]第二届DOTA2亚洲邀请赛决赛日比赛集锦:iG 3:0 OG夺冠
2017/04/05 DOTA
Python pass详细介绍及实例代码
2016/11/24 Python
python实现决策树ID3算法的示例代码
2018/05/30 Python
对python3中, print横向输出的方法详解
2019/01/28 Python
Python将json文件写入ES数据库的方法
2019/04/10 Python
python numpy 常用随机数的产生方法的实现
2019/08/21 Python
python绘制彩虹图
2019/12/16 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
python+selenium+chromedriver实现爬虫示例代码
2020/04/10 Python
Python字符串格式化f-string多种功能实现
2020/05/07 Python
使用Python-OpenCV消除图像中孤立的小区域操作
2020/07/05 Python
CSS3 函数技巧 用css 实现js实现的事情(clac Counters Tooltip)
2017/08/15 HTML / CSS
HTML5实现音频和视频嵌入的方法
2018/08/22 HTML / CSS
Shopee新加坡:东南亚与台湾电商平台
2019/01/25 全球购物
洛佩桑酒店官方网站:Lopesan Hotels
2019/04/15 全球购物
有模特经验的简历自我评价
2013/09/19 职场文书
《一本男孩子必读的书》教学反思
2014/02/19 职场文书
2014年学生会部门工作总结
2014/11/07 职场文书
民主生活会意见
2015/06/05 职场文书
祝酒词范文
2015/08/12 职场文书
2019邀请函格式及范文
2019/05/20 职场文书