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页面跳转的问题(跳转到父页面、最外层页面、本页面)
Aug 14 Javascript
基于jQuery仿淘宝产品图片放大镜特效
Oct 19 Javascript
vue.js+Echarts开发图表放大缩小功能实例
Jun 09 Javascript
详解项目升级到vue-cli3的正确姿势
Jan 28 Javascript
Vue实现远程获取路由与页面刷新导致404错误的解决
Jan 31 Javascript
详解用场景去理解函数柯里化(入门篇)
Apr 11 Javascript
js全屏事件fullscreenchange 实现全屏、退出全屏操作
Sep 17 Javascript
JS Web Flex弹性盒子模型代码实例
Mar 10 Javascript
vue实现公共方法抽离
Jul 31 Javascript
Ant Design Pro 之 ProTable使用操作
Oct 31 Javascript
JS指定音频audio在某个时间点进行播放
Nov 28 Javascript
vue中实现点击空白区域关闭弹窗的两种方法
Dec 30 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
PHP通用检测函数集合
2006/11/25 PHP
php ci框架中加载css和js文件失败的解决方法
2014/03/03 PHP
Linux系统下php获得系统分区信息的方法
2015/03/30 PHP
利用PHP获取网站访客的所在地位置
2017/01/18 PHP
深入浅析安装PhpStorm并激活的步骤详解
2020/09/17 PHP
解决jquery .ajax 在IE下卡死问题的解决方法
2009/10/26 Javascript
JSON 编辑器实现代码
2009/12/06 Javascript
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
2011/10/21 Javascript
通过AJAX的JS、JQuery两种方式解析XML示例介绍
2013/09/23 Javascript
Document:getElementsByName()使用方法及示例
2013/10/28 Javascript
jquery提示效果实例分析
2014/11/25 Javascript
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
JavaScript实现添加、查找、删除元素
2015/07/02 Javascript
JS使用post提交的两种方式
2015/12/03 Javascript
基于jQuery实现点击最后一行实现行自增效果的表格
2016/01/12 Javascript
获取input标签的所有属性的方法
2016/06/28 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
2018/11/30 Javascript
跟老齐学Python之传说中的函数编写条规
2014/10/11 Python
Python3中多线程编程的队列运作示例
2015/04/16 Python
总结Python编程中函数的使用要点
2016/03/20 Python
python 打印对象的所有属性值的方法
2016/09/11 Python
关于Python中空格字符串处理的技巧总结
2017/08/10 Python
python web框架中实现原生分页
2019/09/08 Python
Python安装第三方库攻略(pip和Anaconda)
2020/10/15 Python
举例讲解Python装饰器
2020/12/24 Python
CSS3色彩模式有哪些?CSS3 HSL色彩模式的定义
2016/04/26 HTML / CSS
18-35岁旅游团的全球领导者:Contiki
2017/02/08 全球购物
澳大利亚领先的男装零售连锁店:Lowes
2020/08/07 全球购物
助人为乐表扬信范文
2014/01/14 职场文书
通信生自我鉴定
2014/01/18 职场文书
客服部工作职责范本
2014/02/14 职场文书
报关报检委托书
2014/04/08 职场文书
经费申请报告范文
2015/05/18 职场文书
学生党支部工作总结2015
2015/05/26 职场文书
初一年级组工作总结
2015/08/12 职场文书
MongoDB日志切割的三种方式总结
2021/09/15 MongoDB