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程序来实现动画功能
Mar 06 Javascript
一个js封装的不错的选项卡效果代码
Feb 15 Javascript
js 禁止选择功能实现代码(兼容IE/Firefox)
Apr 23 Javascript
按给定几率进行随机抽取的js代码
Dec 28 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
Apr 08 Javascript
浅析js中取绝对值的2种方法
Jul 09 Javascript
javascript怎么禁用浏览器后退按钮
Mar 27 Javascript
JavaScript通过代码调用Flash显示的方法
Feb 02 Javascript
Dojo获取下拉框的文本和值实例代码
May 27 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
Nov 07 Javascript
Angular2 Service实现简单音乐播放器服务
Feb 24 Javascript
JavaScript生成指定范围随机数和随机序列的方法
May 05 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 前一天或后一天的日期
2008/06/28 PHP
供参考的 php 学习提高路线分享
2011/10/23 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
2015/04/08 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
PHP实现GIF图片验证码
2015/11/04 PHP
PHP使用第三方即时获取物流动态实例详解
2017/04/27 PHP
JavaScript与Div对层定位和移动获得坐标的实现代码
2010/09/08 Javascript
javascript学习笔记(三)显示当时时间的代码
2011/04/08 Javascript
Jquery ajax传递复杂参数给WebService的实现代码
2011/08/08 Javascript
学习JavaScript设计模式(策略模式)
2015/11/26 Javascript
javascript运算符——逻辑运算符全面解析
2016/06/27 Javascript
BootStrap实现带有增删改查功能的表格(DEMO详解)
2016/10/26 Javascript
微信小程序访问node.js接口服务器搭建教程
2017/04/25 Javascript
Node.js自定义实现文件路由功能
2017/09/22 Javascript
Vue中自定义全局组件的实现方法
2017/12/08 Javascript
three.js实现3D模型展示的示例代码
2017/12/31 Javascript
javascript与PHP动态往类中添加方法对比
2018/03/21 Javascript
Nautil 中使用双向数据绑定的实现
2019/10/02 Javascript
js用正则表达式筛选年月日的实例方法
2021/01/04 Javascript
python使用pil生成缩略图的方法
2015/03/26 Python
python中hashlib模块用法示例
2017/10/30 Python
Python简单实现socket信息发送与监听功能示例
2018/01/03 Python
Python基于win32ui模块创建弹出式菜单示例
2018/05/09 Python
python2.x实现人民币转大写人民币
2018/06/20 Python
JavaScript中的模拟事件和自定义事件实例分析
2018/07/27 Python
解决Numpy中sum函数求和结果维度的问题
2019/12/06 Python
Cole Haan官方网站:美国时尚潮流品牌
2017/12/06 全球购物
建筑自我鉴定
2013/10/19 职场文书
保险公司早会主持词
2014/03/22 职场文书
《天安门广场》教学反思
2014/04/23 职场文书
小学生组织委员竞选稿
2015/11/21 职场文书
mysql如何能有效防止删库跑路
2021/10/05 MySQL
MySQL视图概念以及相关应用
2022/04/19 MySQL
Python 视频画质增强
2022/04/28 Python
MySQL 执行数据库更新update操作的时候数据库卡死了
2022/05/02 MySQL
python语言中pandas字符串分割str.split()函数
2022/08/05 Python