最近在學習jQuery,真的很強大!在jQuery的ui外掛裡有一個draggable,可以搞定拖拽,不用再用原生的去計算差值,同時還提供了一些常用值得獲取方法。
jQuery的UI外掛官網API
$(".dragger").draggable({
"containment" : ".stage" ,
"axis": "X",
"drag" : function(event , ui){
var left = ui.position.left;
var top = ui.position.top;
}
});
複製程式碼
上面程式碼中列出常用的三個屬性
containment
可以理解是被拖拽的元素.dragger活動的舞臺,只在:後面的.stage的範圍內活動;
官網的API Multiple types supported:
- Selector: The draggable element will be contained to the bounding box of the first element found by the selector. If no element is found, no containment will be set.
- Element: The draggable element will be contained to the bounding box of this element.
- String: Possible values: "parent", "document", "window".
- Array: An array defining a bounding box in the form [ x1, y1, x2, y2 ].
axis
被拖拽元素的活動方向,X表示只沿x軸拖動,Y表示只沿y軸拖動。
drag
drag的值為一個函式,函式內可以理解為拖拽之後要做的事情。 其中ui提供了position和offset方法,獲取拖拽物件的實時定位left和top值,通過ui.position.left獲取,這個值會隨著元素的重新定位而改變。
position Type: Object Current CSS position of the helper as { top, left } object. The values may be changed to modify where the element will be positioned. This is useful for custom containment, snapping, etc.
offset Type: Object Current offset position of the helper as { top, left } object.
下面用原生的方法實現拖拽
思路:在滑鼠點選時,記錄當時的位置,滑鼠移動在點選之後,所以在onmousedown裡註冊onmousemove事件,計算出滑鼠實時位置與起始位置的差值,將差值賦值給被拖動的元素,就可以看起來好像是在拖拽一樣的效果了。
- html和css部分
#stage{
width: 1200px;
height: 800px;
margin: 50px;
border: 1px solid #eee;
position: relative;
}
.dragger{
position: absolute;
width: 200px;
height: 80px;
border: 1px solid #eee;
box-shadow: 2px 2px 5px rgba(0,0,0,.4);
background-image: -webkit-linear-gradient(top, skyblue, white 70%);
}
<div id="stage">
<div class="dragger"></div>
</div>
複製程式碼
- js程式碼
var stage = document.getElementById("stage");
var dragger = document.getElementsByClassName("dragger")[0];
var startLeft = 0,
startTop = 0,
diffX,
diffY;
//滑鼠點選事件新增給將要拖拽的盒子
dragger.onmousedown = function(event){
//記錄開始點選的位置
var startX = event.pageX;
var startY = event.pageY;
//新增滑鼠移動事件給stage
stage.onmousemove = function(event){
//計算出差值
diffX = event.pageX - startX;
diffY = event.pageY - startY;
//設定給dragger定位值
dragger.style.left = startLeft + diffX + 'px';
dragger.style.top = startTop + diffY + 'px';
}
}
document.onmouseup = function(event){
stage.onmousemove = null;
startLeft += diffX;
startTop += diffY;
}
複製程式碼
最後的滑鼠離開事件新增給document,因為當滑鼠離開時,事件會冒泡到最外層的document,因此直接社在document上。