使用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 相关文章推荐
IE iframe的onload方法分析小结
Jan 07 Javascript
用JS控制回车事件的代码
Feb 20 Javascript
JQuery 给元素绑定click事件多次执行的解决方法
Sep 09 Javascript
jQuery操作Table技巧大汇总
Jan 23 Javascript
JavaScript 经典实例日常收集整理(常用经典)
Mar 30 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
Nov 21 Javascript
基本DOM节点操作
Jan 17 Javascript
js判断节假日实例代码
Dec 27 Javascript
基于js文件加载优化(详解)
Jan 03 Javascript
解决vue项目报错webpackJsonp is not defined问题
Mar 14 Javascript
原生JS实现DOM加载完成马上执行JS代码的方法
Sep 07 Javascript
vue cli3.0 引入eslint 结合vscode使用
May 27 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
windows服务器中检测PHP SSL是否开启以及开启SSL的方法
2014/04/25 PHP
PHP AjaxForm提交图片上传并显示图片源码
2016/11/29 PHP
js页面跳转常用的几种方式
2010/11/25 Javascript
ASP.NET jQuery 实例16 通过控件CustomValidator验证RadioButtonList
2012/02/03 Javascript
js控制不同的时间段显示不同的css样式的实例代码
2013/11/04 Javascript
NodeJS制作爬虫全过程(续)
2014/12/22 NodeJs
使用JS画图之点、线、面
2015/01/12 Javascript
编写自己的jQuery提示框(Tip)插件
2015/02/05 Javascript
Bootstrap开发实战之第一次接触Bootstrap
2016/06/02 Javascript
将input框中输入内容显示在相应的div中【三种方法可选】
2017/05/08 Javascript
jqueryUI tab标签页代码分享
2017/10/09 jQuery
详解layui中的树形关于取值传值问题
2018/01/16 Javascript
jQuery+koa2实现简单的Ajax请求的示例
2018/03/06 jQuery
jsonp跨域获取百度联想词的方法分析
2019/05/13 Javascript
JS实现贪吃蛇游戏
2019/11/15 Javascript
微信小程序开发摇一摇功能
2019/11/22 Javascript
jQuery操作元素追加内容示例
2020/01/10 jQuery
如何将Node.js中的回调转换为Promise
2020/11/10 Javascript
JavaScript构造函数原理及实现流程解析
2020/11/19 Javascript
python中正则表达式的使用详解
2014/10/17 Python
在Python的web框架中配置app的教程
2015/04/30 Python
Python语言描述机器学习之Logistic回归算法
2017/12/21 Python
python操作xlsx文件的包openpyxl实例
2018/05/03 Python
Python3 读、写Excel文件的操作方法
2018/10/20 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
2019/04/01 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
基于Python实现人脸自动戴口罩系统
2020/02/06 Python
python 如何设置守护进程
2020/10/29 Python
中国电子产品批发商/跨境电商/外贸网:Sunsky-online
2020/04/20 全球购物
高中班长自我鉴定
2013/12/20 职场文书
二年级学生评语大全
2014/04/23 职场文书
机械加工与数控专业自荐书
2014/06/04 职场文书
行政工作试用期自我评价
2014/09/14 职场文书
Go语言带缓冲的通道实现
2021/04/26 Golang
golang 实现时间戳和时间的转化
2021/05/07 Golang
vue 实现上传组件
2021/05/31 Vue.js