JQuery UI的拖拽功能實(shí)現(xiàn)方法小結(jié)
JQuery UI提供的API極大簡(jiǎn)化了拖拽功能的開發(fā)。只需要分別在拖拽源(source)和目標(biāo)(target)上調(diào)用draggable和droppable兩個(gè)函數(shù)即可。
拖拽原理
首先要明確幾個(gè)概念。
ource:拖拽源,要拖動(dòng)的元素。
taerget:拖放目標(biāo),能夠放入source的容器。
拖拽的動(dòng)作分解如下:
1. drag start:在拖拽源(source)上按下鼠標(biāo)并開始移動(dòng)
2. drag move: 移動(dòng)過程中
3. drag enter: 移動(dòng)進(jìn)入目標(biāo)(target)容器
4. drag leave: 移出目標(biāo)(target)容器
5. drop: 在目標(biāo)(target)容器上釋放鼠標(biāo)
6. drag end: 結(jié)束
在html5之前,頁面元素不直接支持拖拽事件。所以都是通過監(jiān)聽鼠標(biāo)事件并記錄拖拽狀態(tài)的方式來實(shí)現(xiàn)拖拽功能。
最簡(jiǎn)單的例子
最簡(jiǎn)單的拖拽是不改變?cè)厮诘娜萜?,而只改變其位置。例子如下?
<html>
<head></head>
<body>
<div id="container">
<div id="dragsource">
<p>拽我!</p>
</div>
</div><!-- End container -->
<script type="text/javascript" src="js/jquery-1.7.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.8.16.custom.min.js"></script>
<script>
$(function() {
$( "#dragsource" ).draggable();
})
</script>
</body>
</html>
拖動(dòng)到另一個(gè)容器
更常見的場(chǎng)景是將元素拖動(dòng)到另一個(gè)容器中。這就需要在drop目標(biāo)(target)容器上應(yīng)用droppable函數(shù)。讓我們?cè)谏弦粋€(gè)例子的基礎(chǔ)上,增加一個(gè)div作為容器,并應(yīng)用droppable函數(shù):
<html>
<head></head>
<body>
<div id="container">
<div id="dragsource">
<p>拽我!</p>
</div>
</div><!-- End container -->
<div id="droppalbe" style="width: 300px;height:300px;background-color:gray">
<p>Drop here</p>
</div>
<script type="text/javascript" src="js/jquery-1.7.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.8.16.custom.min.js"></script>
<script>
$(function() {
$( "#dragsource" ).draggable();
$( "#droppable" ).droppable();
})
</script>
</body>
</html>
事件監(jiān)聽和回顯(Feedback)
運(yùn)行上一個(gè)例子,你可能會(huì)產(chǎn)生疑惑,真的放到目標(biāo)容器上了嗎?用戶也會(huì)產(chǎn)生同樣的疑惑。所以,可以監(jiān)聽拖動(dòng)過程中發(fā)生的一些事件,并用可見的方式讓用戶知道。這就叫做回顯(Feedback)。
對(duì)于源(source),可以監(jiān)聽的事件包括:
create: 在source上應(yīng)用draggable函數(shù)時(shí)觸發(fā)
start:開始拖動(dòng)時(shí)觸發(fā)
drap:拖動(dòng)過程中觸發(fā)
stop:釋放時(shí)觸發(fā)
對(duì)于目標(biāo)(target),可以監(jiān)聽的事件包括:
create: 在target上應(yīng)用droppable函數(shù)時(shí)觸發(fā)
activate:如果當(dāng)前拖動(dòng)的source可以drop到本target,則觸發(fā)
deactivate:如果可以drop到本target的拖拽停止,則觸發(fā)
over:source被拖動(dòng)到target上面
out:source被拖動(dòng)離開target
drop:source被釋放到target
事件處理函數(shù)都是通過draggable和droppable函數(shù)的參數(shù)傳遞,在這些事件處理函數(shù)中就可以進(jìn)行Feedback??匆幌聦?shí)際的例子:
<html>
<head>
</head>
<body>
<div id="dragsource">
<p id="targetMsg">:-|</p>
</div>
<div id="droppable" style="background-color:gray;height:300">
<p>Can drop! </p>
</div>
<script type="text/javascript" src="js/jquery-1.7.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.8.16.custom.min.js"></script>
<script>
$(function() {
$( "#dragsource" ).draggable({
start: function(event,ui) {
$(this).find("p").html(":-S");
},
stop:function(event,ui){
$(this).find("p").html(":-|");
}
});
$( "#droppable" ).droppable({
activate: function(event,ui) {
$(this).find("p").html( "Drop here !" );
},
over: function(event,ui) {
$( this ).find( "p" ).html( "Oh, Yeah!" );
},
out: function(event,ui) {
$( this ).find( "p" ).html( "Don't leave me!" );
},
drop: function( event, ui ) {
$( this ).find( "p" ).html( "I've got it!" );
}
});
})
</script>
</body>
</html>
復(fù)制拖動(dòng)
前面的例子都是移動(dòng)元素,另一種常見的場(chǎng)景是復(fù)制拖動(dòng)。比如visio中的從畫板中拖動(dòng)元素到畫布。這是通過draggable函數(shù)的helper參數(shù)設(shè)定的。
helper可以指定為“original”, "clone",其中"original"是默認(rèn)值,即拖動(dòng)自身,而clone表示創(chuàng)建自身的一個(gè)克隆用于拖拽。helper還可以指定為函數(shù),該函數(shù)返回一個(gè)自定義的DOM元素用于拖拽。
當(dāng)不是拖動(dòng)自身的時(shí)候,需要在target上指定drop事件函數(shù),在該函數(shù)中將特定的元素添加到target容器上,否則drop的時(shí)候什么事情都不會(huì)發(fā)生。
簡(jiǎn)單復(fù)制的例子如下:
<html>
<head></head>
<body>
<div id="dragsource">
<p>拽我!</p>
</div>
<div id="container" style="background-color:gray;height:300">
</div><!-- End container -->
<script type="text/javascript" src="js/jquery-1.7.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.8.16.custom.min.js"></script>
<script>
$(function() {
$( "#dragsource" ).draggable({
helper:"clone"
});
$("#container").droppable({
drop:function(event,ui){
$(this).append($("<p style='position:absolute;left:"+
ui.offset.left+";top:"+ui.offset.top+"'>clone</p>"));
}
});
})
</script>
</body>
</html>
拖動(dòng)控制
到目前位置,所有的例子中都可以對(duì)source隨意拖動(dòng)。在實(shí)際應(yīng)用中經(jīng)常需要對(duì)拖動(dòng)行為進(jìn)行控制。下面給出幾個(gè)例子。
拖動(dòng)方向
默認(rèn)拖動(dòng)方向?yàn)閤,y兩個(gè)方向。通過draggable的axis參數(shù)可以限制只能水平或豎直拖動(dòng)。如下:
<html>
<head></head>
<body>
<div id="dragX">
<p>--</p>
</div>
<div id="dragY">
<p>|</p>
</div>
<script type="text/javascript" src="js/jquery-1.7.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.8.16.custom.min.js"></script>
<script>
$(function() {
$("#dragX").draggable({axis:"x"});
$("#dragY").draggable({axis:"y"});
});
</script>
</body>
</html>
拖動(dòng)范圍
除了方向之外,還可以通過containment參數(shù)約束拖動(dòng)的范圍。該參數(shù)接受Selector, Element, String, Array類型。其中String可以為parent,document,window,Array是指定一個(gè)矩形區(qū)域(regin)的四元數(shù)組:[x1,y1,x2,y2]。下面的例子分別指定了parent和regin作為范圍限制:
<html>
<head></head>
<body>
<div id="container" style="background-color:gray;height:300">
<div id="draggable1" style="background-color:red;height:20;width:100">
<p>in parent</p>
</div>
<div id="draggable2" style="background-color:green;height:20;width:100">
<p>in regin</p>
</div>
<script type="text/javascript" src="js/jquery-1.7.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.8.16.custom.min.js"></script>
<script>
$(function() {
$("#draggable1" ).draggable({containment: "parent" });
$("#draggable2").draggable({containment: [20,20,300,200] });
});
</script>
</body>
</html>
拖動(dòng)吸附
還可以在拖動(dòng)的時(shí)候吸附到其他元素或網(wǎng)格。使用snap參數(shù)指定要吸附到的元素,使用grid參數(shù)指定吸附到網(wǎng)格,如下:
<html>
<head>
<style>
.draggable {background-color:green; width: 90px; height: 80px; padding: 5px; float: left; margin: 0 10px 10px 0; font-size: .9em; }
</style>
</head>
<body>
<div id="container" style="background-color:gray;height:300">
<div id="draggable1" class="draggable">
<p>吸附到其他可拖拽元素</p>
</div>
<div id="draggable2" class="draggable">
<p>吸附到容器</p>
</div>
<div id="draggable3" class="draggable">
<p>吸附到網(wǎng)格(30x30)</p>
</div>
</div><!--container-->
<script type="text/javascript" src="js/jquery-1.7.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.8.16.custom.min.js"></script>
<script>
$(function() {
$("#draggable1").draggable({ snap: true });
$("#draggable2").draggable({ snap: "#container"});
$("#draggable3").draggable({grid: [30,30]});
});
</script>
</body>
</html>
拖動(dòng)把手(handle)
默認(rèn)是整個(gè)元素都可以拖動(dòng),也可以指定元素的某個(gè)子元素作為拖動(dòng)的handle,如:
<div id="draggable">
<p>handle</p>
</div>
……
<script>
$("#draggable").draggable({handle:"p"});
</script>
Drop限制
默認(rèn)的droppable指定元素能夠接受所有的drop, 但是可以通過accept參數(shù)限定只能接受某些元素的drop。accept參數(shù)的類型為一個(gè)符合jquery selector的字符串。例如:
$(".selector").droppable({ accept: '.special' })
表示只接受具有special 樣式的元素。
增強(qiáng)用戶體驗(yàn)
前面是實(shí)現(xiàn)拖拽的功能,JQueryUI還有一些參數(shù)可以增強(qiáng)用戶體驗(yàn)。比如,cursor參數(shù)可以指定鼠標(biāo)指針的形狀,cursorAt指定鼠標(biāo)指針在source的相對(duì)位置,revert可以指定當(dāng)drop失敗時(shí)source“飄”回原來的位置。一個(gè)組合的例子如下:
<html>
<head>
<style>
.draggable {background-color:green; width: 90px; height: 80px; padding: 5px; float: left; margin: 0 10px 10px 0; font-size: .9em; }
.droppable { width: 300px; height: 300px; background-color:red}
</style>
</head>
<body>
<div id="draggable2" class="draggable">
<p>I revert when I'm not dropped</p>
</div>
<div id="droppable" class="droppable">
<p>Drop me here</p>
</div>
<script type="text/javascript" src="js/jquery-1.7.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.8.16.custom.min.js"></script>
<script>
$(function() {
$( "#draggable2" ).draggable({ revert: "invalid",cursor: "move", cursorAt: { top: 56, left: 56 } });
$( "#droppable" ).droppable({
activeClass: "ui-state-hover",
hoverClass: "ui-state-active",
drop: function( event, ui ) {
$( this )
.addClass( "ui-state-highlight" )
.find( "p" )
.html( "Dropped!" );
}
});
});
</script>
</body>
</html>
小結(jié)
JQuery UI提供了強(qiáng)大的拖拽功能和良好的用戶體驗(yàn),同時(shí)又非常容易使用。本文介紹了常用的各種用法。更多的參數(shù)還可以參考官方網(wǎng)站的Draggable 和 Droppable 。
- JQuery Dialog(JS 模態(tài)窗口,可拖拽的DIV)
- jQuery拖拽div實(shí)現(xiàn)思路
- jQuery使用drag效果實(shí)現(xiàn)自由拖拽div
- 如何使用jQuery Draggable和Droppable實(shí)現(xiàn)拖拽功能
- 簡(jiǎn)單的jquery拖拽排序效果實(shí)現(xiàn)代碼
- jQuery插件實(shí)現(xiàn)文件上傳功能(支持拖拽)
- JQuery之拖拽插件實(shí)現(xiàn)代碼
- jquery實(shí)現(xiàn)拖拽調(diào)整Div大小
- jQuery EasyUI API 中文文檔 - Draggable 可拖拽
- jquery實(shí)現(xiàn)拖拽小方塊效果
相關(guān)文章
基于jQuery的360圖片展示實(shí)現(xiàn)代碼
基于jQuery的360圖片展示實(shí)現(xiàn)代碼,需要的朋友可以參考下2012-06-06
js和jQuery設(shè)置Opacity半透明 兼容IE6
對(duì)于每一個(gè)網(wǎng)站前端開發(fā)人員,常常都會(huì)遇到設(shè)置div透明度的需求,比如在實(shí)現(xiàn)圖片幻燈片切換效果經(jīng)常就需要使圖片淡入淡出。本文分別對(duì)原生js和jQuery在IE和其它瀏覽器中設(shè)置透明度的方法和相關(guān)注意事項(xiàng)進(jìn)行總結(jié)。2016-05-05
jquery 仿錨點(diǎn)跳轉(zhuǎn)到頁面指定位置的實(shí)例
下面小編就為大家?guī)硪黄猨query 仿錨點(diǎn)跳轉(zhuǎn)到頁面指定位置的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02
利用jQuery設(shè)計(jì)一個(gè)簡(jiǎn)單的web音樂播放器的實(shí)例分享
這篇文章主要介紹了利用jQuery設(shè)計(jì)一個(gè)簡(jiǎn)單的web音樂播放器的實(shí)例分享,包括PHP后臺(tái)和從MySQL中讀取曲目等基本功能的實(shí)現(xiàn),需要的朋友可以參考下2016-03-03
z-blog SyntaxHighlighter 長代碼無法換行解決辦法(基于jquery)
這篇文章主要介紹了z-blog SyntaxHighlighter 長代碼無法換行解決辦法(jquery),需要的朋友可以參考下2015-11-11
jQuery實(shí)現(xiàn)簡(jiǎn)單的按鈕顏色變化
這篇文章主要為大家詳細(xì)介紹了jQuery實(shí)現(xiàn)簡(jiǎn)單的按鈕顏色變化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
jQuery通過控制節(jié)點(diǎn)實(shí)現(xiàn)僅在前臺(tái)通過get方法完成參數(shù)傳遞
這篇文章主要介紹了jQuery通過控制節(jié)點(diǎn)實(shí)現(xiàn)僅在前臺(tái)通過get方法完成參數(shù)傳遞的功能,實(shí)例分析了jQuery操作節(jié)點(diǎn)的技巧與控制前臺(tái)get方法傳遞參數(shù)的用法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02

