使用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 相关文章推荐
jQuery打印图片pdf、txt示例代码
Jul 22 Javascript
JavaScript function 的 length 属性使用介绍
Sep 15 Javascript
分享一个自己写的简单的javascript分页组件
Feb 15 Javascript
jQuery使用addClass()方法给元素添加多个class样式
Mar 26 Javascript
JQuery包裹DOM节点的方法
Jun 11 Javascript
Sublime Text 3常用插件及安装方法
Dec 16 Javascript
微信JS接口大全
Aug 25 Javascript
使用Bootstrap打造特色进度条效果
May 02 Javascript
IntersectionObserver实现图片懒加载的示例
Sep 29 Javascript
JavaScript实现的贝塞尔曲线算法简单示例
Jan 30 Javascript
详解vue的双向绑定原理及实现
May 05 Javascript
Flutter实现仿微信底部菜单栏功能
Sep 18 Javascript
使用纯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
Protoss兵种对照表
2020/03/14 星际争霸
PHP常用设计模式之委托设计模式
2016/02/13 PHP
PHP addslashes()函数讲解
2019/02/03 PHP
Laravel基础-关于引入公共文件的两种方式
2019/10/18 PHP
php操作redis常见方法示例【key与value操作】
2020/04/14 PHP
基于JQuery的cookie插件
2010/04/07 Javascript
JavaScript类库D
2010/10/24 Javascript
HTML Dom与Css控制方法
2010/10/25 Javascript
可兼容IE的获取及设置cookie的jquery.cookie函数方法
2013/09/02 Javascript
动态的创建一个元素createElement及删除一个元素
2014/01/24 Javascript
用jquery的方法制作一个简单的导航栏
2014/06/23 Javascript
JavaScript通过Date-Mask将日期转换成字符串的方法
2015/06/04 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
浅谈JavaScript 执行环境、作用域及垃圾回收
2016/05/31 Javascript
AngularJS基础 ng-mouseover 指令简单示例
2016/08/02 Javascript
Javascript 函数的四种调用模式
2016/11/05 Javascript
原生js代码能实现call和bind吗
2019/07/31 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
关于ES6尾调用优化的使用
2020/09/11 Javascript
python算法学习之计数排序实例
2013/12/18 Python
python虚拟环境的安装配置图文教程
2017/10/20 Python
Python如何快速上手? 快速掌握一门新语言的方法
2017/11/14 Python
python绘制玫瑰的实现代码
2020/03/02 Python
小学教师的个人自我鉴定
2013/10/24 职场文书
计算机专业职业生涯规划范文
2014/01/19 职场文书
校园活动策划方案
2014/06/13 职场文书
运动会400米加油稿(8篇)
2014/09/22 职场文书
新郎答谢词
2015/01/04 职场文书
销售合作意向书范本
2015/05/08 职场文书
2019年大学生学年自我鉴定!
2019/03/25 职场文书
Python使用scapy模块发包收包
2021/05/07 Python
mysql升级到5.7时,wordpress导数据报错1067的问题
2021/05/27 MySQL
python机器学习Github已达8.9Kstars模型解释器LIME
2021/11/23 Python
SQL Server #{}可以防止SQL注入
2022/05/11 SQL Server
TaiShan 200服务器安装Ubuntu 18.04的图文教程
2022/06/28 Servers