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 this用法小结
Dec 19 Javascript
JS window.opener返回父页面的应用
Oct 24 Javascript
使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
Mar 16 Javascript
提示$ is not defined错误分析及解决
Apr 09 Javascript
jQuery 取值、赋值的基本方法整理
Mar 31 Javascript
给angular加上动画效遇到的问题总结
Feb 17 Javascript
JavaScript中日常收集常见的10种错误(推荐)
Jan 08 Javascript
详解ES6之用let声明变量以及let loop机制
Jul 15 Javascript
创建echart多个联动的示例代码
Nov 23 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
Jun 24 Javascript
使用vue实现多规格选择实例(SKU)
Aug 23 Javascript
layer实现弹出层自动调节位置
Sep 05 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 register_globals 值为on与off的理解
2013/09/26 PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
2014/07/22 PHP
[原创]php实现子字符串位置相互对调互换的方法
2016/06/02 PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
2016/07/13 PHP
php版微信公众平台开发之验证步骤实例详解
2016/09/23 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
JS HTML5 音乐天气播放器(Ajax获取天气信息)
2013/05/26 Javascript
js中replace的用法总结
2013/12/27 Javascript
JS实现关键字搜索时的相关下拉字段效果
2014/08/05 Javascript
jQuery遍历json的方法分析
2016/04/16 Javascript
Bootstrap被封装的弹层
2016/07/20 Javascript
js实现楼层导航功能
2017/02/23 Javascript
JavaScript 上传文件(psd,压缩包等),图片,视频的实现方法
2017/06/19 Javascript
vue-cli3.0+element-ui上传组件el-upload的使用
2018/12/03 Javascript
利用python循环创建多个文件的方法
2018/10/25 Python
关于Python Tkinter Button控件command传参问题的解决方式
2020/03/04 Python
解决django中form表单设置action后无法回到原页面的问题
2020/03/13 Python
Python2.x与3​​.x版本有哪些区别
2020/07/09 Python
python如何爬取网页中的文字
2020/07/28 Python
python闭包与引用以及需要注意的陷阱
2020/09/18 Python
用HTML5.0制作网页的教程
2010/05/30 HTML / CSS
利用三角函数在canvas上画虚线的方法
2018/01/11 HTML / CSS
C面试题
2015/10/08 面试题
正规的求职信范文分享
2013/12/11 职场文书
大学生如何写自荐信
2014/01/08 职场文书
高校教师思想汇报
2014/01/11 职场文书
材料工程专业毕业生求职信
2014/03/04 职场文书
护理专业毕业生自我鉴定总结
2014/03/24 职场文书
村干部承诺书
2014/03/28 职场文书
总经理任命书
2014/03/29 职场文书
《月亮湾》教学反思
2014/04/14 职场文书
社区禁毒工作方案
2014/06/02 职场文书
违纪检讨书范文
2015/01/27 职场文书
刑事撤诉申请书
2015/05/18 职场文书
2015年乡镇安全生产工作总结
2015/05/19 职场文书
卖车协议书范文
2016/03/23 职场文书