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 相关文章推荐
我遇到的参数传递中 双引号单引号嵌套问题
Feb 11 Javascript
Textarea根据内容自适应高度
Oct 28 Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
May 28 Javascript
Javascript 跨域知识详细介绍
Oct 30 Javascript
用JS动态设置CSS样式常见方法小结(推荐)
Nov 10 Javascript
jQuery使用方法
Feb 04 Javascript
jQuery EasyUI的TreeGrid查询功能实现方法
Aug 08 jQuery
js+canvas实现滑动拼图验证码功能
Mar 26 Javascript
node.js中TCP Socket多进程间的消息推送示例详解
Jul 10 Javascript
vue监听用户输入和点击功能
Sep 27 Javascript
vue 获取元素额外生成的data-v-xxx操作
Sep 09 Javascript
Vue-router中hash模式与history模式的区别详解
Dec 15 Vue.js
理解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求两个目录的相对路径示例(php获取相对路径)
2014/03/27 PHP
在Linux系统下一键重新安装WordPress的脚本示例
2015/06/30 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
实例讲解php实现多线程
2019/01/27 PHP
如何让PHP编码更加好看利于阅读
2019/05/12 PHP
javascript 混合的构造函数和原型方式,动态原型方式
2009/12/07 Javascript
jquery 可拖拽的窗体控件实现代码
2010/03/21 Javascript
js仿土豆网带缩略图的焦点图片切换效果实现方法
2015/02/23 Javascript
jQuery实现自定义事件的方法
2015/04/17 Javascript
jQuery实现图片与文字描述左右滑动自动切换的方法
2015/07/27 Javascript
JS表格组件神器bootstrap table详解(强化版)
2016/05/26 Javascript
node.js平台下的mysql数据库配置及连接
2017/03/31 Javascript
js中el表达式的使用和非空判断方法
2018/03/28 Javascript
Node.Js生成比特币地址代码解析
2018/04/21 Javascript
vue打包使用Nginx代理解决跨域问题
2018/08/27 Javascript
vue 解决form表单提交但不跳转页面的问题
2019/10/30 Javascript
JavaScript中的函数申明、函数表达式、箭头函数
2019/12/06 Javascript
[08:40]Navi Vs Newbee
2018/06/07 DOTA
Python装饰器使用实例:验证参数合法性
2015/06/24 Python
Python基于动态规划算法计算单词距离
2015/07/25 Python
深入理解Python装饰器
2016/07/27 Python
Python爬虫常用小技巧之设置代理IP
2018/09/13 Python
浅谈python的深浅拷贝以及fromkeys的用法
2019/03/08 Python
基于python实现语音录入识别代码实例
2020/01/17 Python
canvas绘制圆角头像的实现方法
2019/01/17 HTML / CSS
美国最大的在线寄售和旧货店:Swap.com
2018/08/27 全球购物
机械专业应届生求职信
2013/09/21 职场文书
新闻学专业大学生职业生涯规划范文
2014/03/02 职场文书
终止劳动合同协议书
2014/04/14 职场文书
一年级评语大全
2014/04/23 职场文书
企业金融服务方案
2014/06/03 职场文书
党员国庆节演讲稿范文2014
2014/09/21 职场文书
见习报告的格式
2014/10/31 职场文书
学校计划生育责任书
2015/05/09 职场文书
Python中快速掌握Data Frame的常用操作
2021/03/31 Python
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers