JS拖拽組件學習使用,js拖拽組件

來源:互聯網
上載者:User

JS拖拽組件學習使用,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程式設計有所協助。

您可能感興趣的文章:
  • 百度Popup.js彈出框進化版 拖拽小架構發布 相容IE6/7/8,Firefox,Chrome
  • js 表格排序(編輯+拖拽+縮放)
  • 一個js拖拽的效果類和dom-drag.js淺析
  • js 彈出層 並可以拖拽
  • 關於js拖拽上傳 [一個拖拽上傳修改頭像的流程]
  • div拖拽外掛程式——JQ.MoveBox.js(自製JQ外掛程式)
  • javascript拖拽上傳類庫DropzoneJS使用方法
  • js完美的div拖拽執行個體代碼
  • Nodejs+express+html5 實現拖拽上傳

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.