JS拖拽組件學(xué)習(xí)使用
JS代碼需要常寫(xiě),不然容易生疏,最近雖然一直在看JS的原型,行為委托等知識(shí)點(diǎn),但是動(dòng)手寫(xiě)代碼的量略有減少。本文與大家分享一個(gè)拖拽組件,供大家參考,具體內(nèi)容如下
首先,看一下拖拽的原理。

被拖拽元素位置的變化,left值的變化其實(shí)就是鼠標(biāo)位置水平方向的變化值,e.clientX - 鼠標(biāo)左鍵按下時(shí)e.clientX。
top值的變化其實(shí)就是鼠標(biāo)位置豎直方向的變化值,e.clientY - 鼠標(biāo)左鍵按下時(shí)e.clientY。
另外就是設(shè)置拖拽的范圍,上下左右不得超過(guò)父元素所在的區(qū)域。
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;
//鼠標(biāo)按下時(shí),drag的left值,top值(寫(xiě)在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"));
//鼠標(biāo)按下時(shí),鼠標(biāo)的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;//實(shí)際的移動(dòng)范圍
var realTop = this.startTop + e.clientY - this.startClientY;
//rightLeft , rightTop; //left, top 取值(在可移動(dòng)范圍內(nèi))
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);
}
說(shuō)明:moDown響應(yīng)鼠標(biāo)左鍵按下操作,moMove響應(yīng)鼠標(biāo)移動(dòng)操作,MoUp響應(yīng)鼠標(biāo)抬起操作。
在moMove中增加了e.which判斷,e.which ==1 表示鼠標(biāo)左鍵按下,這是為了解決,鼠標(biāo)移除可拖拽范圍外,再移回時(shí),無(wú)需按下左鍵,被拖拽元素就會(huì)跟著動(dòng)的Bug。
使用說(shuō)明:
在使用時(shí),被拖拽元素的id是必須參數(shù),父元素的id(即可以拖拽移動(dòng)的范圍)為可選參數(shù),如果不傳遞父元素的id,則默認(rèn)使用documentElement為可拖拽的范圍。
如果傳遞父元素,請(qǐng)別忘了將父元素的定位設(shè)為position:relative或position:absolute。
在使用時(shí),先引入拖拽插件的js文件。
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="劉艷">
<meta name="Keywords" content="關(guān)鍵字">
<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>
如果您想在整個(gè)窗口中拖拽,請(qǐng)不要設(shè)置被拖拽元素的父元素的定位,即,使其相對(duì)body定位。
如果您需要對(duì)body定位,但是又需要設(shè)置其父元素的position為非static,那么您可以對(duì)本插件進(jìn)行擴(kuò)展。
希望本文對(duì)大家學(xué)習(xí)javascript程序設(shè)計(jì)有所幫助。
- javascript實(shí)現(xiàn)PC網(wǎng)頁(yè)里的拖拽效果
- javascript實(shí)現(xiàn)移動(dòng)端上的觸屏拖拽功能
- JS組件Bootstrap Table表格多行拖拽效果實(shí)現(xiàn)代碼
- JS組件Bootstrap Table表格行拖拽效果實(shí)現(xiàn)代碼
- 基于jQuery實(shí)現(xiàn)拖拽圖標(biāo)到回收站并刪除功能
- js實(shí)現(xiàn)圖片放大和拖拽特效代碼分享
- 原生js實(shí)現(xiàn)自由拖拽彈窗代碼demo
- js拖拽的原型聲明和用法總結(jié)
- 基于React.js實(shí)現(xiàn)原生js拖拽效果引發(fā)的思考
- JS HTML5實(shí)現(xiàn)拖拽移動(dòng)列表效果
相關(guān)文章
javascript中全局對(duì)象的parseInt()方法使用介紹
全局對(duì)象的parseInt()方法該如何使用,下面為大家詳細(xì)介紹下,感興趣的朋友不要錯(cuò)過(guò)2013-12-12
js實(shí)現(xiàn)表格數(shù)據(jù)搜索
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)表格數(shù)據(jù)搜索,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08
微信小程序之側(cè)邊欄滑動(dòng)實(shí)現(xiàn)過(guò)程解析(附完整源碼)
這篇文章主要介紹了微信小程序之側(cè)邊欄滑動(dòng)實(shí)現(xiàn)過(guò)程解析(附完整源碼),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
JavaScript判斷表單為空及獲取焦點(diǎn)的方法
這篇文章主要介紹了JavaScript判斷表單為空及獲取焦點(diǎn)的方法,可實(shí)現(xiàn)表單提交時(shí)判斷表單是否為空及獲取響應(yīng)焦點(diǎn)的功能,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2016-02-02
javascript實(shí)現(xiàn)列表滾動(dòng)的方法
這篇文章主要介紹了javascript實(shí)現(xiàn)列表滾動(dòng)的方法,較為詳細(xì)的分析了javascript實(shí)現(xiàn)列表滾動(dòng)的頁(yè)面布局及javascript滾動(dòng)效果的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
動(dòng)態(tài)加載js、css的簡(jiǎn)單實(shí)現(xiàn)代碼
下面小編就為大家?guī)?lái)一篇?jiǎng)討B(tài)加載js、css的簡(jiǎn)單實(shí)現(xiàn)代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05

