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 相关文章推荐
jQuery 操作XML入门
Dec 25 Javascript
JavaScript表达式:URL 协议介绍
Mar 10 Javascript
javascript日期格式化示例分享
Mar 05 Javascript
iframe调用父页面函数示例详解
Jul 17 Javascript
node.js中的fs.chown方法使用说明
Dec 16 Javascript
jQuery+json实现动态创建复杂表格table的方法
Oct 25 Javascript
jQuery Validate格式验证功能实例代码(包括重名验证)
Jul 18 jQuery
微信小程序显示下拉列表功能【附源码下载】
Dec 12 Javascript
10分钟彻底搞懂Http的强制缓存和协商缓存(小结)
Aug 30 Javascript
纯javascript实现选择框的全选与反选功能
Apr 08 Javascript
如何通过Proxy实现JSBridge模块化封装
Oct 22 Javascript
浅谈node.js中间件有哪些类型
Apr 29 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
PHP Memcached应用实现代码
2010/02/08 PHP
PHP中通过语义URL防止网站被攻击的方法分享
2011/09/08 PHP
PHP中读写文件实现代码
2011/10/20 PHP
php导入模块文件分享
2015/03/17 PHP
微信支付开发维权通知实例
2016/07/12 PHP
php利用ob_start()清除输出和选择性输出的方法
2018/01/18 PHP
php 截取中英文混合字符串的方法
2018/05/31 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
2019/04/16 PHP
在JavaScript中遭遇级联表达式陷阱
2007/03/08 Javascript
js字符串的各种格式的转换 ToString,Format
2011/08/08 Javascript
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
Javascript核心读书有感之语句
2015/02/11 Javascript
理解Javascript的动态语言特性
2015/06/17 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(二)
2015/12/10 Javascript
AngularJS中下拉框的基本用法示例
2017/10/11 Javascript
详解node Async/Await 更好的异步编程解决方案
2018/05/10 Javascript
详解keep-alive + vuex 让缓存的页面灵活起来
2019/04/19 Javascript
javascript实现固定侧边栏
2021/02/09 Javascript
Python使用面向对象方式创建线程实现12306售票系统
2015/12/24 Python
使用Python实现简单的服务器功能
2017/08/25 Python
python基于ID3思想的决策树
2018/01/03 Python
Python连接Mssql基础教程之Python库pymssql
2018/09/16 Python
python科学计算之narray对象用法
2019/11/25 Python
python的time模块和datetime模块实例解析
2019/11/29 Python
基于PyQT实现区分左键双击和单击
2020/05/19 Python
Python with语句用法原理详解
2020/07/03 Python
python不同版本的_new_不同点总结
2020/12/09 Python
幼儿园实习自我鉴定
2013/12/15 职场文书
环保建议书作文
2014/03/12 职场文书
无传销社区工作方案
2014/05/13 职场文书
小学班主任经验交流材料
2014/12/16 职场文书
乔迁之喜答谢词
2015/01/05 职场文书
2019年暑期法院实习报告
2019/12/18 职场文书
JavaScript分页组件使用方法详解
2021/07/26 Javascript
python 管理系统实现mysql交互的示例代码
2021/12/06 Python
Mysql数据库表中为什么有索引却没有提高查询速度
2022/02/24 MySQL