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 相关文章推荐
jQuery getJSON()+.ashx 实现分页(改进版)
Mar 28 Javascript
ie中js创建checkbox默认选中问题探讨
Oct 21 Javascript
JavaScript中setInterval的用法总结
Nov 20 Javascript
页面加载完毕后滚动条自动滚动一定位置
Feb 20 Javascript
js实现千分符和保留几位小数的简单实例
Aug 01 Javascript
bootstrap滚动监控器使用方法解析
Jan 13 Javascript
vuejs绑定class和style样式
Apr 11 Javascript
Angular在模板驱动表单中自定义校验器的方法
Aug 09 Javascript
JS实现获取数组中最大值或最小值功能示例
Mar 02 Javascript
Javascript 对象(object)合并操作实例分析
Jul 30 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
Jul 26 Javascript
JavaScript实现班级抽签小程序
May 19 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+MYSQL的文章管理系统(二)
2006/10/09 PHP
基于PHP+Ajax实现表单验证的详解
2013/06/25 PHP
浅析php原型模式
2014/11/25 PHP
Yii框架的布局文件实例分析
2019/09/04 PHP
分析 JavaScript 中令人困惑的变量赋值
2007/08/13 Javascript
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
五个jQuery图片画廊插件 推荐
2011/05/12 Javascript
jquery配合css简单实现返回顶部效果
2013/09/30 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
2016/08/01 Javascript
Angular2表单自定义验证器的实现
2016/10/19 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
Node.js学习教程之HTTP/2服务器推送【译】
2017/10/31 Javascript
html中通过JS获取JSON数据并加载的方法
2017/11/30 Javascript
JavaScript递归函数解“汉诺塔”算法代码解析
2018/07/05 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
2019/07/12 Javascript
解决layer弹出层msg的文字不显示的问题
2019/09/11 Javascript
微信小程序实现拖拽功能
2019/09/26 Javascript
解决vue中el-tab-pane切换的问题
2020/07/19 Javascript
Python装饰器模式定义与用法分析
2018/08/06 Python
一篇文章弄懂Python中所有数组数据类型
2019/06/23 Python
全面了解django的缓存机制及使用方法
2019/07/22 Python
Python 复平面绘图实例
2019/11/21 Python
python dir函数快速掌握用法技巧
2020/12/09 Python
你不知道的5个HTML5新功能
2016/06/28 HTML / CSS
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
迪斯尼商品官方网站:ShopDisney
2016/08/01 全球购物
英国领先的办公用品供应商:Viking
2016/08/01 全球购物
写一个在SQL Server创建表的SQL语句
2012/03/10 面试题
基层干部十八大感言
2014/01/19 职场文书
乡镇总工会学雷锋活动总结
2014/03/01 职场文书
外语系大学生自荐信范文
2014/03/01 职场文书
护理专业毕业生自荐信
2014/06/15 职场文书
商业用房租赁协议书
2014/10/13 职场文书
2014最新预备党员思想汇报范文:中国梦,我的梦
2014/10/25 职场文书
鲁迅故居导游词
2015/02/05 职场文书
工伤认定行政答辩状
2015/05/22 职场文书