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 实现简单的table排序及table操作练习
Dec 28 Javascript
jQuery 3.0十大新特性最终版发布
Jul 14 Javascript
Javascript字符串常用方法详解
Jul 21 Javascript
javascript基础练习之翻转字符串与回文
Feb 20 Javascript
ES6新特性之函数的扩展实例详解
Apr 01 Javascript
日期时间范围选择插件:daterangepicker使用总结(必看篇)
Sep 14 Javascript
详解webpack模块加载器兼打包工具
Sep 11 Javascript
微信小程序签到功能
Oct 31 Javascript
详解如何在Angular优雅编写HTTP请求
Dec 05 Javascript
Node 搭建一个静态资源服务器的实现
May 20 Javascript
JavaScript队列结构Queue实现过程解析
Mar 07 Javascript
JavaScript实现鼠标经过表格某行时此行变色
Nov 20 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/03/15 PHP
php用header函数实现301跳转代码实例
2013/11/25 PHP
php阳历转农历优化版
2016/08/08 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
2017/11/03 PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
2019/09/23 PHP
PHP代码覆盖率统计详解
2020/07/22 PHP
php模拟post提交请求调用接口示例解析
2020/08/07 PHP
新手入门常用代码集锦
2007/01/11 Javascript
Web跨浏览器进程通信(Web跨域)
2013/04/17 Javascript
jquery弹出框的用法示例(2)
2013/08/26 Javascript
js 动态修改css文件的方法
2014/08/05 Javascript
基于jQuery实现下拉框
2014/11/24 Javascript
jQuery实现数秒后自动提交form的方法
2015/03/05 Javascript
JavaScript图片轮播代码分享
2015/07/31 Javascript
JS实现的N多简单无缝滚动代码(包含图文效果)
2015/11/06 Javascript
arcgis for js 修改infowindow样式的方法
2016/11/02 Javascript
详解javascript中的变量提升和函数提升
2018/05/24 Javascript
Javascript之高级数组API的使用实例
2019/03/08 Javascript
Vue自定义全局弹窗组件操作
2020/08/11 Javascript
Node.js利用Express实现用户注册登陆功能(推荐)
2020/10/26 Javascript
JS中循环遍历数组的四种方式总结
2021/01/23 Javascript
[02:54]DOTA2英雄基础教程 撼地者
2014/01/14 DOTA
浅谈python中截取字符函数strip,lstrip,rstrip
2015/07/17 Python
对Python发送带header的http请求方法详解
2019/01/02 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
Python xlrd模块导入过程及常用操作
2020/06/10 Python
keras的load_model实现加载含有参数的自定义模型
2020/06/22 Python
html5记忆翻牌游戏实现思路及代码
2013/07/25 HTML / CSS
让ie浏览器成为支持html5的浏览器的解决方法(使用html5shiv)
2014/04/08 HTML / CSS
美国网上鞋子零售商:Dr. Scholl’s Shoes
2017/11/17 全球购物
VC++笔试题
2014/10/13 面试题
捐资助学倡议书
2014/04/15 职场文书
我们的节日清明节活动总结
2014/04/30 职场文书
学生逃课万能检讨书2000字
2015/02/17 职场文书
《爬天都峰》教学反思
2016/02/23 职场文书
MySQL kill不掉线程的原因
2021/05/07 MySQL