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 相关文章推荐
window.location和document.location的区别分析
Dec 23 Javascript
Node.js实现数据推送
Apr 14 Javascript
Javascript动画效果(4)
Oct 11 Javascript
jQuery Pagination分页插件使用方法详解
Feb 28 Javascript
Node之简单的前后端交互(实例讲解)
Nov 14 Javascript
vue操作下拉选择器获取选择的数据的id方法
Aug 24 Javascript
Node.js模拟发起http请求从异步转同步的5种用法
Sep 26 Javascript
详解超简单的react服务器渲染(ssr)入坑指南
Feb 28 Javascript
JS添加或删除HTML dom元素的方法实例分析
Mar 05 Javascript
JavaScript中this的全面解析及常见实例
May 14 Javascript
vue3.0中的双向数据绑定方法及优缺点
Aug 01 Javascript
webpack介绍使用配置教程详解webpack介绍和使用
Jun 25 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版小黄鸡simsimi聊天机器人接口分享
2014/01/26 PHP
实例介绍PHP的Reflection反射机制
2014/08/05 PHP
php+html5使用FormData对象提交表单及上传图片的方法
2015/02/11 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
2020/08/17 PHP
Yii2实现UploadedFile上传文件示例
2017/02/15 PHP
PHP实现读取文件夹及批量重命名文件操作示例
2019/04/15 PHP
线路分流自动跳转代码;希望对大家有用!
2006/12/02 Javascript
setTimeout的延时为0时多个浏览器的区别
2012/05/23 Javascript
javascript右下角弹层及自动隐藏(自己编写)
2013/11/20 Javascript
解析JSON对象与字符串之间的相互转换
2013/12/18 Javascript
Node.js实现在目录中查找某个字符串及所在文件
2014/09/03 Javascript
javascript中Number对象的toString()方法分析
2014/12/20 Javascript
原生js页面滚动延迟加载图片
2015/12/20 Javascript
基于jQuery实现左右图片轮播(原理通用)
2015/12/24 Javascript
浅谈bootstrap源码分析之scrollspy(滚动侦听)
2016/06/06 Javascript
Js删除数组中某一项或几项的几种方法(推荐)
2016/07/27 Javascript
jQuery实现图片轮播效果代码
2016/09/27 Javascript
javascript中获取元素标签中间的内容的实现方法
2016/10/08 Javascript
vue插件tab选项卡使用小结
2016/10/27 Javascript
微信小程序云开发如何实现数据库自动备份实现
2019/08/16 Javascript
Vue 实现CLI 3.0 + momentjs + lodash打包时优化
2019/11/13 Javascript
python字典的常用操作方法小结
2016/05/16 Python
PyQt5 pyqt多线程操作入门
2018/05/05 Python
PYQT5实现控制台显示功能的方法
2019/06/25 Python
python简单区块链模拟详解
2019/07/03 Python
Python 的字典(Dict)是如何存储的
2019/07/05 Python
python爬虫-模拟微博登录功能
2019/09/12 Python
简单了解python filter、map、reduce的区别
2020/01/14 Python
python关于变量名的基础知识点
2020/03/03 Python
python实现Oracle查询分组的方法示例
2020/04/30 Python
如何把python项目部署到linux服务器
2020/08/26 Python
Python项目实战之使用Django框架实现支付宝付款功能
2021/02/23 Python
Timberland澳大利亚官网:全球领先的户外品牌
2019/12/10 全球购物
请用Java实现列出某个目录下的所有文件
2013/09/23 面试题
校运会入场式解说词
2014/02/10 职场文书
保护野生动物倡议书
2014/05/16 职场文书