js实现可拖动DIV的方法


Posted in Javascript onDecember 17, 2013

随着时代的变化,越来越感觉到js的重要性,js不仅可以做web页面(如Ext框架),还可以做一些web的特效,这些特效不仅兼容PC,而且兼容手机端,毕竟是基于浏览器的,和平台没关系。现在微软的windows8 系统的App都可以用js开发了,大家有时间可以去尝试一下。

     现在切入正题,说一下js 实现可拖动Div.实现这个功能我们先说一下思路:

     1.捕捉鼠标div的mousedown事件

     2.捕捉 document的   mousemove事件

     3.取消事件

然后我们看一下代码:

function Drag(id) {
            var $ = function (flag) {
                return document.getElementById(flag);
            }
            $(id).onmousedown = function (e) {
                var d = document;
                var page = {
                    event: function (evt) {
                        var ev = evt || window.event;
                        return ev;
                    },
                    pageX: function (evt) {
                        var e = this.event(evt);
                        return e.pageX || (e.clientX + document.body.scrollLeft - document.body.clientLeft);
                    },
                    pageY: function (evt) {
                        var e = this.event(evt);
                        return e.pageY || (e.clientY + document.body.scrollTop - document.body.clientTop);
                    },
                    layerX: function (evt) {
                        var e = this.event(evt);
                        return e.layerX || e.offsetX;
                    },
                    layerY: function (evt) {
                        var e = this.event(evt);
                        return e.layerY || e.offsetY;
                    }
                }             
                var x = page.layerX(e);
                var y = page.layerY(e);        
                if (dv.setCapture) {
                    dv.setCapture();
                }
                else if (window.captureEvents) {
                    window.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP);
                }
                d.onmousemove = function (e) {                    
                    var tx = page.pageX(e) - x;
                    var ty = page.pageY(e) - y;
                    dv.style.left = tx + "px";
                    dv.style.top = ty + "px";
                }
                d.onmouseup = function () {
                    if (dv.releaseCapture) {
                        dv.releaseCapture();
                    }
                    else if (window.releaseEvents) {
                        window.releaseEvents(Event.MOUSEMOVE | Event.MOUSEUP);
                    }
                    d.onmousemove = null;
                    d.onmouseup = null;
                }
            }
        }

代码分析:

1.

获取div对象

var $ = function (flag) {
                return document.getElementById(flag);
            }    

2.捕捉document的mousedown事件:

里面有这么一段代码:

     var page = {
                    event: function (evt) {
                        var ev = evt || window.event;
                        return ev;
                    },
                    pageX: function (evt) {
                        var e = this.event(evt);
                        return e.pageX || (e.clientX + document.body.scrollLeft - document.body.clientLeft);
                    },
                    pageY: function (evt) {
                        var e = this.event(evt);
                        return e.pageY || (e.clientY + document.body.scrollTop - document.body.clientTop);
                    },
                    layerX: function (evt) {
                        var e = this.event(evt);
                        return e.layerX || e.offsetX;
                    },
                    layerY: function (evt) {
                        var e = this.event(evt);
                        return e.layerY || e.offsetY;
                    }
                }

其中event获取鼠标事件,pageX,pageY获取鼠标的坐标,layerX,layerY获取鼠标距离div边框的距离。

还有一段代码:

             if (dv.setCapture) {
                    dv.setCapture();
                }
                else if (window.captureEvents) {
                    window.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP);
                }

这个就是捕捉div的MouseMove和MouseUp事件,不懂得tx可以到网上查查。
3. document的MouseMove和mouseUp事件:
d.onmousemove = function (e) {                    
                    var tx = page.pageX(e) - x;
                    var ty = page.pageY(e) - y;
                    dv.style.left = tx + "px";
                    dv.style.top = ty + "px";
                }   
                d.onmouseup = function () {
                    if (dv.releaseCapture) {
                        dv.releaseCapture();
                    }
                    else if (window.releaseEvents) {
                        window.releaseEvents(Event.MOUSEMOVE | Event.MOUSEUP);
                    }
                    d.onmousemove = null;
                    d.onmouseup = null;
                }

其中的tx,ty就是最重要的代码了,是设置div坐标的

有的人可能会问为什么要-x,-y?

x,y其实就是获取鼠标距离div边框的距离,如果不减掉的话

鼠标箭头的坐标和div的x,y坐标一样了,这样拖动之后,鼠标的位置会偏到左上角,效果就是,拖动之后会弹动一下。

                if (dv.releaseCapture) {
                        dv.releaseCapture();
                    }
                    else if (window.releaseEvents) {
                        window.releaseEvents(Event.MOUSEMOVE | Event.MOUSEUP);
                    }
                    d.onmousemove = null;
                    d.onmouseup = null;

上面这段代码就是在鼠标松开之后取消document的onmousemove,onmouseup事件。

最近都在学习js,后续有新的心得体会也会与大家分享,希望与大家共同学习,进步。

Javascript 相关文章推荐
javascript 面向对象全新理练之继承与多态
Dec 03 Javascript
jQuery Ajax方法调用 Asp.Net WebService 的详细实例代码
Apr 27 Javascript
更优雅的事件触发兼容
Oct 24 Javascript
js arguments,jcallee caller用法总结
Nov 30 Javascript
小米公司JavaScript面试题
Dec 29 Javascript
JavaScript实现仿淘宝商品购买数量的增减效果
Jan 22 Javascript
浅析jquery unbind()方法移除元素绑定的事件
May 24 Javascript
js实现的页面加载完毕之前loading提示效果完整示例【附demo源码下载】
Aug 02 Javascript
ES6所改良的javascript“缺陷”问题
Aug 23 Javascript
Layui给数据表格动态添加一行并跳转到添加行所在页的方法
Aug 20 Javascript
微信小程序跳转到其他网页(外部链接)的实现方法
Sep 20 Javascript
一文帮你理解PReact10.5.13源码
Apr 03 Javascript
js复制网页内容并兼容各主流浏览器的代码
Dec 17 #Javascript
鼠标移入移出事件改变图片的分辨率的两种方法
Dec 17 #Javascript
jquery简单实现鼠标经过导航条改变背景图
Dec 17 #Javascript
javascript确认框的三种使用方法
Dec 17 #Javascript
js 剪切板应用clipboardData详细解析
Dec 17 #Javascript
JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)
Dec 17 #Javascript
JavaScript禁止页面操作的示例代码
Dec 17 #Javascript
You might like
Nginx下配置codeigniter框架方法
2015/04/07 PHP
yii2 url重写并隐藏index.php方法
2018/12/10 PHP
php实现简单的守护进程创建、开启与关闭操作
2019/08/13 PHP
有关DOM元素与事件的3个谜题
2010/11/11 Javascript
基于JQuery的类似新浪微博展示信息效果的代码
2012/07/23 Javascript
JQuery实现网页右侧随动广告特效
2016/01/17 Javascript
基于js中的原型、继承的一些想法
2016/08/10 Javascript
深入浅析Vue组件开发
2016/11/25 Javascript
Angular 4中如何显示内容的CSS样式示例代码
2017/11/06 Javascript
webpack 打包压缩js和css的方法示例
2018/03/20 Javascript
详解Angular5 路由传参的3种方法
2018/04/28 Javascript
node Buffer缓存区常见操作示例
2019/05/04 Javascript
Vue使用axios出现options请求方法
2019/05/30 Javascript
vue实现一个矩形标记区域(rectangle marker)的方法
2020/10/28 Javascript
Python实现控制台中的进度条功能代码
2017/12/22 Python
python 输出上个月的月末日期实例
2018/04/11 Python
Python爬虫实现验证码登录代码实例
2019/05/10 Python
django 邮件发送模块smtp使用详解
2019/07/22 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
2019/08/27 Python
python使用socket 先读取长度,在读取报文内容示例
2019/09/26 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
2019/10/24 Python
Numpy之reshape()使用详解
2019/12/26 Python
pytorch GAN生成对抗网络实例
2020/01/10 Python
python网络爬虫实现发送短信验证码的方法
2021/02/25 Python
英国家电直销:Appliances Direct
2016/09/22 全球购物
Mio Skincare美国官网:身体紧致及孕期身体护理
2017/03/05 全球购物
SmartBuyGlasses英国:购买太阳镜和眼镜
2018/01/29 全球购物
Desigual德国官网:在线购买原创服装
2018/03/27 全球购物
芬兰灯具网上商店:Nettilamppu.fi
2018/06/30 全球购物
介绍一下Transact-SQL中SPACE函数的用法
2015/09/01 面试题
大学生毕业的自我鉴定
2013/11/13 职场文书
文案策划求职信
2014/03/18 职场文书
安全月宣传标语
2014/10/07 职场文书
银行贷款委托书范本
2014/10/11 职场文书
Python中可变和不可变对象的深入讲解
2021/08/02 Python
5道关于python基础 while循环练习题
2021/11/27 Python