JS拖拽组件学习使用


Posted in Javascript onJanuary 19, 2016

JS代码需要常写,不然容易生疏,最近虽然一直在看JS的原型,行为委托等知识点,但是动手写代码的量略有减少。本文与大家分享一个拖拽组件,供大家参考,具体内容如下

首先,看一下拖拽的原理。

JS拖拽组件学习使用

被拖拽元素位置的变化,left值的变化其实就是鼠标位置水平方向的变化值,e.clientX - 鼠标左键按下时e.clientX。
top值的变化其实就是鼠标位置竖直方向的变化值,e.clientY - 鼠标左键按下时e.clientY。
另外就是设置拖拽的范围,上下左右不得超过父元素所在的区域。

function Drag (config){
      this.moveTarget = document.getElementById(config.id);
      if(config.parentId){
        this.targetParent = document.getElementById(config.parentId);
        this.max_left = this.targetParent.clientWidth - this.moveTarget.offsetWidth;
        this.max_top = this.targetParent.clientHeight - this.moveTarget.offsetHeight;
      }else{
        console.log(document.documentElement.clientHeight + "||" + this.moveTarget.offsetHeight)
        this.max_left = document.documentElement.clientWidth - this.moveTarget.offsetWidth - 
          parseInt(this.getStyle(document.body, "border-width"));
        this.max_top = document.documentElement.clientHeight - this.moveTarget.offsetHeight- 
          parseInt(this.getStyle(document.body, "border-width"));
      }      
      this.lock = true;
    }
    Drag.prototype.getStyle = function(element, attr){
      if(element.currentStyle){
        return element.currentStyle[attr];
      }else{
        return window.getComputedStyle(element,null).getPropertyValue(attr)
      }
    }
    Drag.prototype.moDown = function(e){
      e = e || window.event;
      this.clientX = e.clientX;
      this.clientY = e.clientY;
      //鼠标按下时,drag的left值,top值(写在style中或者是css中)
      this.startLeft = parseInt(this.moveTarget.style.left || this.getStyle(this.moveTarget, "left"));
      this.startTop = parseInt(this.moveTarget.style.top || this.getStyle(this.moveTarget, "top"));
      //鼠标按下时,鼠标的clientX值,clientY值
      this.startClientX = e.clientX;
      this.startClientY = e.clientY;
      this.lock = false;
    };
    Drag.prototype.moMove = function(e){
      e = e || window.event;
      if(e.which != 1){
        this.lock = true;
      }
      if(!this.lock){
        var realLeft = this.startLeft + e.clientX - this.startClientX;//实际的移动范围
        var realTop = this.startTop + e.clientY - this.startClientY;
          //rightLeft , rightTop; //left, top 取值(在可移动范围内)
        var rightLeft = realLeft > this.max_left ? this.max_left : ( realLeft > 0 ? realLeft : 0 );
        var rightTop = realTop > this.max_top ? this.max_top : ( realTop > 0 ? realTop : 0 );
        this.moveTarget.style.left = rightLeft + "px";
        this.moveTarget.style.top = rightTop + "px";
      }
    };
    Drag.prototype.moUp = function(e){
      e = e || window.event;
      this.lock = true;
    };
    Drag.prototype.startDrag = function(){
      console.log(this)
      this.moveTarget.onmousedown = function(e){this.moDown(e)}.bind(this);
      this.moveTarget.onmousemove = function(e){this.moMove(e)}.bind(this);
      this.moveTarget.onmouseup = function(e){this.moUp(e)}.bind(this);
    }

说明:moDown响应鼠标左键按下操作,moMove响应鼠标移动操作,MoUp响应鼠标抬起操作。

在moMove中增加了e.which判断,e.which ==1 表示鼠标左键按下,这是为了解决,鼠标移除可拖拽范围外,再移回时,无需按下左键,被拖拽元素就会跟着动的Bug。

使用说明:

在使用时,被拖拽元素的id是必须参数,父元素的id(即可以拖拽移动的范围)为可选参数,如果不传递父元素的id,则默认使用documentElement为可拖拽的范围。

如果传递父元素,请别忘了将父元素的定位设为position:relative或position:absolute。

在使用时,先引入拖拽插件的js文件。

<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta name="Generator" content="EditPlus®">
    <meta name="Author" content="刘艳">
    <meta name="Keywords" content="关键字">
    <meta name="Description" content="描述">
    <title>Document</title>
    <style>
      *{
        margin:0px;
        padding:0px;
      }
      #content{
        width:600px;
        height:500px;
        position:relative;
        border:5px solid green;
      }
      #drag{
        position:absolute;
        height:100px;
        width:100px;
        top:50px;left:0px;
        background:pink;
        cursor:pointer;
      }
    </style>
  </head>
  <body>
    <div id = "content">
      <div id = "drag" >
      </div> 
    </div>
  </body>
</html>
<script src = "url/drag.js"></script>
<script>
  window.onload = function(){
    var drag = new Drag({id: "drag", parentId: "content"});
    drag.startDrag();

  }

</script>

如果您想在整个窗口中拖拽,请不要设置被拖拽元素的父元素的定位,即,使其相对body定位。

如果您需要对body定位,但是又需要设置其父元素的position为非static,那么您可以对本插件进行扩展。

希望本文对大家学习javascript程序设计有所帮助。

Javascript 相关文章推荐
快速保存网页中所有图片的方法
Jun 23 Javascript
JQUERY CHECKBOX全选,取消全选,反选方法三
Aug 30 Javascript
JS 实现列表与多选框选择附预览动画
Oct 29 Javascript
JS动态改变表格边框宽度的方法
Mar 31 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
Jan 04 Javascript
JS把内容动态插入到DIV的实现方法
Jul 19 Javascript
数据结构中的各种排序方法小结(JS实现)
Jul 23 Javascript
jquery点击切换背景色的简单实例
Aug 25 Javascript
微信小程序 image组件binderror使用例子与js中的onerror区别
Feb 15 Javascript
微信小程序城市定位的实现实例(获取当前所在国家城市信息)
May 17 Javascript
VUE DOM加载后执行自定义事件的方法
Sep 07 Javascript
详解搭建一个vue-cli的移动端H5开发模板
Jan 17 Javascript
理解JS绑定事件
Jan 19 #Javascript
AngularJS模块学习之Anchor Scroll
Jan 19 #Javascript
jQuery unbind()方法实例详解
Jan 19 #Javascript
jQuery绑定事件监听bind和移除事件监听unbind用法实例详解
Jan 19 #Javascript
详解JavaScript对象序列化
Jan 19 #Javascript
学习JavaScript设计模式之单例模式
Jan 19 #Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
Jan 19 #Javascript
You might like
php生成静态页面的简单示例
2014/04/17 PHP
php实现RSA加密类实例
2015/03/26 PHP
PHP简单实现生成txt文件到指定目录的方法
2016/04/25 PHP
php网页版聊天软件实现代码
2016/08/12 PHP
静态html文件执行php语句的方法(推荐)
2016/11/21 PHP
js 程序执行与顺序实现详解
2013/05/13 Javascript
简单漂亮的js弹窗可自由拖拽且兼容大部分浏览器
2013/10/22 Javascript
js模仿hover的具体实现代码
2013/12/30 Javascript
JavaScript获取网页中第一个链接ID的方法
2015/04/03 Javascript
jquery Easyui快速开发总结
2015/08/20 Javascript
JavaScript 不支持 indexof 该如何解决
2016/03/30 Javascript
JavaScript toUpperCase()方法使用详解
2016/08/26 Javascript
使用开源工具制作网页验证码的方法
2016/10/17 Javascript
AngularJS常见过滤器用法实例总结
2017/07/06 Javascript
Thinkjs3新手入门之如何使用静态资源目录
2017/12/06 Javascript
vue iview组件表格 render函数的使用方法详解
2018/03/15 Javascript
vue.js使用v-model指令实现的数据双向绑定功能示例
2018/05/22 Javascript
[59:15]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.20
2020/11/20 DOTA
python轻松实现代码编码格式转换
2015/03/26 Python
Python读取Json字典写入Excel表格的方法
2018/01/03 Python
删除python pandas.DataFrame 的多重index实例
2018/06/08 Python
python中ASCII码和字符的转换方法
2018/07/09 Python
在Python中输入一个以空格为间隔的数组方法
2018/11/13 Python
python+selenium实现自动化百度搜索关键词
2019/06/03 Python
python flask框架实现重定向功能示例
2019/07/02 Python
Python爬取腾讯视频评论的思路详解
2019/12/19 Python
如何以Winsows Service方式运行JupyterLab
2020/08/30 Python
Django如何批量创建Model
2020/09/01 Python
详解pandas映射与数据转换
2021/01/22 Python
HTML5之web workers_动力节点Java学院整理
2017/07/17 HTML / CSS
canvas实现图片镜像翻转的2种方式
2020/07/22 HTML / CSS
求最大连续递增数字串(如"ads3sl456789DF3456ld345AA"中的"456789")
2015/09/11 面试题
消防安全员岗位职责
2014/03/10 职场文书
幼儿园招生广告
2014/03/19 职场文书
党员干部形式主义个人整改措施
2014/09/17 职场文书
挂职个人工作总结
2015/03/05 职场文书