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 相关文章推荐
Javascript 原型和继承(Prototypes and Inheritance)
Apr 01 Javascript
Firefox window.close()的使用注意事项
Apr 11 Javascript
jQuery计算textarea中文字数(剩余个数)的小程序
Nov 28 Javascript
手机号码,密码正则验证
Sep 04 Javascript
详解JavaScript中shift()方法的使用
Jun 09 Javascript
微信小程序 image组件binderror使用例子与js中的onerror区别
Feb 15 Javascript
jQuery实现文档树效果
Feb 20 Javascript
package.json文件配置详解
Jun 15 Javascript
微信小程序实现页面跳转传值的方法
Oct 12 Javascript
JS逻辑运算符短路操作实例分析
Jul 09 Javascript
Angular2使用SVG自定义图表(条形图、折线图)组件示例
May 10 Javascript
解决vue bus.$emit触发第一次$on监听不到问题
Jul 28 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实现维护文件代码
2007/06/14 PHP
PHP中for与foreach的区别分析
2011/03/09 PHP
phpcms模块开发之swfupload的使用介绍
2013/04/28 PHP
PHP仿博客园 个人博客(1) 数据库与界面设计
2013/07/05 PHP
Codeigniter框架实现获取分页数据和总条数的方法
2014/12/05 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
phpStorm2020 注册码
2020/09/17 PHP
javascript 原型模式实现OOP的再研究
2009/04/09 Javascript
jquery简单的拖动效果实现原理及示例
2013/07/26 Javascript
js导航栏单击事件背景变换示例代码
2014/01/13 Javascript
jquery实现鼠标滑过显示提示框的方法
2015/02/05 Javascript
jQuery前端分页示例分享
2015/02/10 Javascript
JS动态修改iframe高度和宽度的方法
2015/04/01 Javascript
js实现防止被iframe的方法
2015/07/03 Javascript
全面解析Bootstrap排版使用方法(标题)
2015/11/30 Javascript
easyui validatebox验证
2016/04/29 Javascript
jQuery实现对无序列表的排序功能(附demo源码下载)
2016/06/25 Javascript
jquery-mobile表单的创建方法详解
2016/11/23 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
js实现京东轮播图效果
2017/06/30 Javascript
angular框架实现全选与单选chekbox的自定义
2017/07/06 Javascript
微信小程序排坑指南详解
2018/05/23 Javascript
关于JS解构的5种有趣用法
2019/09/05 Javascript
JavaScript中this的学习笔记及用法整理
2020/02/17 Javascript
vue中实现弹出层动画效果的示例代码
2020/09/25 Javascript
Openlayers显示地理位置坐标的方法
2020/09/28 Javascript
python模拟登陆阿里妈妈生成商品推广链接
2014/04/03 Python
Python调用C/C++动态链接库的方法详解
2014/07/22 Python
Python实现短网址ShortUrl的Hash运算实例讲解
2015/08/10 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
2018/05/04 Python
Python可迭代对象操作示例
2019/05/07 Python
Python爬虫使用bs4方法实现数据解析
2020/08/25 Python
CSS3中animation实现流光按钮效果
2020/12/21 HTML / CSS
电脑售后服务承诺书
2014/03/27 职场文书
受伤赔偿协议书
2014/09/24 职场文书
Python Django框架介绍之模板标签及模板的继承
2021/05/27 Python