使用js实现的简单拖拽效果


Posted in Javascript onMarch 18, 2015

前端开发的时候,有好多地方用到拖拽效果,当然 http://jqueryui.com/draggable/  是个不错的选择,but 我是个打破砂锅问到底的人,抽点时间用js小小的实现了类似的插件,话不多说。

 first: html和css

<head>

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    <title></title>

    <style>

        * {

            margin: 0;

            padding: 0;

        }

        #div1 {

            position: absolute;

            width: 100px;

            height: 100px;

            cursor: move;

            background-color: red;

        }

    </style>

</head>

<body>

    <div id="div1">

    </div>

</body>

</html>

使用js实现的简单拖拽效果

now,先把主要算法实现一下:

 <script>

        window.onload = function () {

            //获取需要拖拽的div

            var div1 = document.getElementById("div1");

            //添加鼠标按下事件

            div1.onmousedown = function (evt) {

                var oEvent = evt || event;

                //获取按下鼠标到div left  top的距离

                var distanceX = oEvent.clientX - div1.offsetLeft;

                var distanceY = oEvent.clientX - div1.offsetTop;

                //添加doc滑动时间

                document.onmousemove = function (evt) {

                    var oEvent = evt || event;

                    //重新计算div的left top值

                    var left = oEvent.clientX - distanceX;

                    var top = oEvent.clientY - distanceY;

                    //left  当小于等于零时,设置为零 防止div拖出document之外

                    if (left <= 0) {

                        left = 0;

                    }

                    //当left 超过文档右边界  设置为右边界

                    else if (left >= document.documentElement.clientWidth - div1.offsetWidth) {

                        left = document.documentElement.clientWidth - div1.offsetWidth;

                    }

                    if (top <= 0) {

                        top = 0;

                    }

                    else if (top >= document.documentElement.clientHeight - div1.offsetHeight) {

                        top = document.documentElement.clientHeight - div1.offsetHeight;

                    }

                    //重新给div赋值

                    div1.style.top = top + "px";

                    div1.style.left = left + "px";

                }

                //添加鼠标抬起事件

                div1.onmouseup = function () {

                    //清空事件

                    document.onmousemove = null;

                    div1.onmouseup = null;

                }

            }

        }

    </script>

yeah,使用面向对象实现一下

<style>

        * {

            margin:0;

            padding:0;

        }

        #div1 {

            width: 100px;

            height: 100px;

            background-color: red;

        }

        #div2 {

            background-color:yellow;

            width:100px;

            height:100px;

        }

    </style>

<div id="div1"></div>

<div id="div2"></div>

js Draggle class:

 function Drag(id) {

            this.div = document.getElementById(id);

            if (this.div) {

                this.div.style.cursor = "move";

                this.div.style.position = "absolute";

            }

            this.disX = 0;

            this.disY = 0;

            var _this = this;

            this.div.onmousedown = function (evt) {

                _this.getDistance(evt);

                document.onmousemove = function (evt) {

                    _this.setPosition(evt);

                }

                _this.div.onmouseup = function () {

                    _this.clearEvent();

                }

            }

        }

        Drag.prototype.getDistance = function (evt) {

            var oEvent = evt || event;

            this.disX = oEvent.clientX - this.div.offsetLeft;

            this.disY = oEvent.clientY - this.div.offsetTop;

        }

        Drag.prototype.setPosition = function (evt) {

            var oEvent = evt || event;

            var l = oEvent.clientX - this.disX;

            var t = oEvent.clientY - this.disY;

            if (l <= 0) {

                l = 0;

            }

            else if (l >= document.documentElement.clientWidth - this.div.offsetWidth) {

                l = document.documentElement.clientWidth - this.div.offsetWidth;

            }

            if (t <= 0) {

                t = 0;

            }

            else if (t >= document.documentElement.clientHeight - this.div.offsetHeight) {

                t = document.documentElement.clientHeight - this.div.offsetHeight;

            }

            this.div.style.left = l + "px";

            this.div.style.top = t + "px";

        }

        Drag.prototype.clearEvent = function () {

            this.div.onmouseup = null;

            document.onmousemove = null;

        }

at last:最终实现:

  window.onload = function () {

            new Drag("div1");

            new Drag("div2");

        }

效果如下:

使用js实现的简单拖拽效果

以上所述就是本文的全部内容了,希望能对大家更加熟练的掌握javascript有所帮助。

Javascript 相关文章推荐
Prototype ObjectRange对象学习
Jul 19 Javascript
为调试JavaScript添加输出窗口的代码
Feb 07 Javascript
用jquery存取照片的具体实现方法
Jun 30 Javascript
SinaEditor使用方法详解
Dec 28 Javascript
快速解决jQuery与其他库冲突的方法介绍
Jan 02 Javascript
在JavaScript中构建ArrayList示例代码
Sep 17 Javascript
JS实现简单路由器功能的方法
May 27 Javascript
js在ie下打开对话窗口的方法小结
Oct 24 Javascript
jquery.validate表单验证插件使用方法解析
Nov 07 Javascript
JS定义函数的几种常用方法小结
May 23 Javascript
JS如何定义用字符串拼接的变量
Jul 11 Javascript
Vue用mixin合并重复代码的实现
Nov 27 Vue.js
使用纯javascript实现放大镜效果
Mar 18 #Javascript
jQuery创建自定义的选择器用以选择高度大于100的超链接实例
Mar 18 #Javascript
javascript中的Base64、UTF8编码与解码详解
Mar 18 #Javascript
jQuery实现按键盘方向键翻页特效
Mar 18 #Javascript
javascript操作Cookie(设置、读取、删除)方法详解
Mar 18 #Javascript
jQuery选择id属性带有点符号元素的方法
Mar 17 #Javascript
jQuery统计指定子元素数量的方法
Mar 17 #Javascript
You might like
PHP中创建和编辑Excel表格的方法
2018/09/13 PHP
Laravel 实现关系模型取出需要的字段
2019/10/10 PHP
laravel 之 Eloquent 模型修改器和序列化示例
2019/10/17 PHP
使用隐藏的new来创建对象
2011/03/29 Javascript
Jquery index()方法 获取相应元素索引值
2012/10/12 Javascript
jQuery cdn使用介绍
2013/05/08 Javascript
js验证电话号码与手机支持+86的正则表达式
2014/01/23 Javascript
详解JavaScript对Date对象的操作问题(生成一个倒数7天的数组)
2015/10/01 Javascript
JS传参及动态修改页面布局
2017/04/13 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(上)
2017/04/21 Javascript
js+html制作简单日历的方法
2017/06/27 Javascript
three.js 入门案例详解
2018/01/23 Javascript
JavaScript变量作用域及内存问题实例分析
2019/06/10 Javascript
Vue的click事件防抖和节流处理详解
2019/11/13 Javascript
JS相册图片抖动放大展示效果的示例代码
2021/01/29 Javascript
[01:13]这,就是刀塔
2014/07/16 DOTA
[42:48]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第二场 12.11
2020/12/16 DOTA
Python中字符编码简介、方法及使用建议
2015/01/08 Python
Python中使用Boolean操作符做真值测试实例
2015/01/30 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
2017/11/02 Python
详解如何利用Cython为Python代码加速
2018/01/27 Python
用python实现将数组元素按从小到大的顺序排列方法
2018/07/02 Python
python 划分数据集为训练集和测试集的方法
2018/12/11 Python
python爬取酷狗音乐排行榜
2019/02/20 Python
Python使用pyyaml模块处理yaml数据
2020/04/14 Python
Python gevent协程切换实现详解
2020/09/14 Python
利用python汇总统计多张Excel
2020/09/22 Python
Ubuntu 20.04安装Pycharm2020.2及锁定到任务栏的问题(小白级操作)
2020/10/29 Python
Python获取android设备cpu和内存占用情况
2020/11/15 Python
CSS3教程(9):设置RGB颜色
2009/04/02 HTML / CSS
乐观大学生的自我评价
2014/01/10 职场文书
学期评语大全
2014/04/30 职场文书
小石潭记导游词
2015/02/03 职场文书
食品药品安全责任书
2015/05/11 职场文书
新闻简讯格式及范文
2015/07/22 职场文书
opencv用VS2013调试时用Image Watch插件查看图片
2021/07/26 Python