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 设计模式之组合模式解析
Apr 09 Javascript
Confirmer JQuery确认对话框组件
Jun 09 Javascript
原生js与jQuery实现简单的tab切换特效对比
Jul 30 Javascript
jQuery特殊符号转义的实现
Nov 30 Javascript
JS实现最简单的冒泡排序算法
Feb 15 Javascript
js仿网易表单及时验证功能
Mar 07 Javascript
javascript算法之二叉搜索树的示例代码
Sep 12 Javascript
详解Vue如何支持JSX语法
Nov 10 Javascript
小程序图片长按识别功能的实现方法
Aug 30 Javascript
详解vue-cli 2.0配置文件(小结)
Jan 14 Javascript
ES6 Promise对象的应用实例分析
Jun 27 Javascript
详解vue实现坐标拾取器功能示例
Nov 18 Vue.js
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
东方红 - 来复式再生机的修复
2021/03/02 无线电
php 检查电子邮件函数(自写)
2014/01/16 PHP
PHP 类与构造函数解析
2017/02/06 PHP
PHP中Laravel 关联查询返回错误id的解决方法
2017/04/01 PHP
jquery 插件学习(二)
2012/08/06 Javascript
对frameset、frame、iframe的js操作示例代码
2013/08/16 Javascript
js style动态设置table高度
2014/10/21 Javascript
JS实现环形进度条(从0到100%)效果
2016/07/05 Javascript
概述如何实现一个简单的浏览器端js模块加载器
2016/12/07 Javascript
JS仿京东移动端手指拨动切换轮播图效果
2020/04/10 Javascript
Vue与Node.js通过socket.io通信的示例代码
2018/07/25 Javascript
vuejs简单验证码功能完整示例
2019/01/08 Javascript
vue使用Font Awesome的方法步骤
2019/02/26 Javascript
leaflet加载geojson叠加显示功能代码
2020/02/21 Javascript
vue3.0+vue-router+element-plus初实践
2020/12/02 Vue.js
[50:24]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python调用shell的方法
2013/11/20 Python
Python中用format函数格式化字符串的用法
2015/04/08 Python
python制作websocket服务器实例分享
2016/11/20 Python
python实现的多线程端口扫描功能示例
2017/01/21 Python
python实现机器学习之多元线性回归
2018/09/06 Python
Python使用requests提交HTTP表单的方法
2018/12/26 Python
python 实现单通道转3通道
2019/12/03 Python
opencv中图像叠加/图像融合/按位操作的实现
2020/04/01 Python
Python+pyftpdlib实现局域网文件互传
2020/08/24 Python
Python安装第三方库攻略(pip和Anaconda)
2020/10/15 Python
浅析python实现动态规划背包问题
2020/12/31 Python
css3加js做一个简单的3D行星运转效果实例代码
2017/01/18 HTML / CSS
L’AGENCE官网:加州女装品牌
2018/06/03 全球购物
Lancer Skincare官方网站:抗衰老皮肤护理
2020/11/20 全球购物
新加坡鲜花速递/新加坡网上花店:Ferns N Petals
2020/08/29 全球购物
工程款申请报告
2015/05/15 职场文书
管理者们如何制定2019年的工作计划?
2019/07/01 职场文书
2019年学校消防安全责任书(2篇)
2019/10/09 职场文书
CSS3 菱形拼图实现只旋转div 背景图片不旋转功能
2021/03/30 HTML / CSS
在 Python 中利用 Pool 进行多线程
2022/04/24 Python