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 相关文章推荐
跨域表单提交状态的变相判断代码
Nov 12 Javascript
javascript里使用php代码实例
Dec 13 Javascript
javascript格式化json显示实例分析
Apr 21 Javascript
XML文件转化成NSData对象的方法
Aug 12 Javascript
JavaScript实现的CRC32函数示例
Nov 23 Javascript
Node.js读取文件内容示例
Mar 07 Javascript
Vue 2.0 服务端渲染入门介绍
Mar 29 Javascript
webpack项目使用eslint建立代码规范实现
May 16 Javascript
Ajax请求时无法重定向的问题解决代码详解
Jun 21 Javascript
Angular6项目打包优化的实现方法
Dec 15 Javascript
Json实现传值到后台代码实例
Jun 30 Javascript
JS检测浏览器开发者工具是否打开的方法详解
Oct 02 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
解析file_get_contents模仿浏览器头(user_agent)获取数据
2013/06/27 PHP
PHP简单实现“相关文章推荐”功能的方法
2014/07/19 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
2018/04/21 PHP
JQuery实现自定义对话框的代码
2008/06/15 Javascript
JavaScript数值数组排序示例分享
2014/05/27 Javascript
微信WeixinJSBridge API使用实例
2015/05/25 Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
2016/01/19 Javascript
js简单时间比较的方法
2016/08/02 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
2017/01/03 Javascript
jQuery+C#实现参数RSA加密传输功能【附jsencrypt.js下载】
2017/06/26 jQuery
浅谈从React渲染流程分析Diff算法
2018/09/08 Javascript
创建Vue项目以及引入Iview的方法示例
2018/12/03 Javascript
微信小程序模板template简单用法示例
2018/12/04 Javascript
vue+element项目中过滤输入框特殊字符小结
2019/08/07 Javascript
在Vue mounted方法中使用data变量详解
2019/11/05 Javascript
微信小程序实现注册登录功能(表单校验、错误提示)
2019/12/10 Javascript
JS简单表单验证功能完整示例
2020/01/26 Javascript
TypeScript 运行时类型检查补充工具
2020/09/28 Javascript
python sqlobject(mysql)中文乱码解决方法
2008/11/14 Python
21行Python代码实现拼写检查器
2016/01/25 Python
5款非常棒的Python工具
2018/01/05 Python
Python高级用法总结
2018/05/26 Python
Flask缓存静态文件的具体方法
2020/08/02 Python
详解解决jupyter不能使用pytorch的问题
2021/02/18 Python
业务员岗位职责范本
2013/12/15 职场文书
自我反省检讨书
2014/01/23 职场文书
企业军训感言
2014/02/08 职场文书
个人银行贷款担保书
2014/04/01 职场文书
投标保密承诺书
2014/05/19 职场文书
课外活动实习计划
2015/01/19 职场文书
幼儿园中班教师个人总结
2015/02/05 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书
小学四年级作文之写景
2019/08/23 职场文书
Python利用folium实现地图可视化
2021/05/23 Python
一文彻底理解js原生语法prototype,__proto__和constructor
2021/10/24 Javascript
SQL Server 忘记密码以及重新添加新账号
2022/04/26 SQL Server