JQuery UI的拖拽功能实现方法小结_jquery

WBOY
Lepaskan: 2016-05-16 17:55:22
asal
1060 orang telah melayarinya

JQuery UI提供的API极大简化了拖拽功能的开发。只需要分别在拖拽源(source)和目标(target)上调用draggable和droppable两个函数即可。

拖拽原理
首先要明确几个概念。
  ource:拖拽源,要拖动的元素。
  taerget:拖放目标,能够放入source的容器。
拖拽的动作分解如下:
  1. drag start:在拖拽源(source)上按下鼠标并开始移动
  2. drag move: 移动过程中
  3. drag enter: 移动进入目标(target)容器
  4. drag leave: 移出目标(target)容器
  5. drop: 在目标(target)容器上释放鼠标
  6. drag end: 结束
在html5之前,页面元素不直接支持拖拽事件。所以都是通过监听鼠标事件并记录拖拽状态的方式来实现拖拽功能。

最简单的例子
最简单的拖拽是不改变元素所在的容器,而只改变其位置。例子如下:

复制代码 代码如下:






拽我!






<script> <BR>$(function() { <BR>$( "#dragsource" ).draggable(); <BR>}) <BR></script>



拖动到另一个容器
更常见的场景是将元素拖动到另一个容器中。这就需要在drop目标(target)容器上应用droppable函数。让我们在上一个例子的基础上,增加一个div作为容器,并应用droppable函数:
复制代码 代码如下:






拽我!






Drop here






<script> <BR>$(function() { <BR>$( "#dragsource" ).draggable(); <BR>$( "#droppable" ).droppable(); <BR>}) <BR></script>



事件监听和回显(Feedback)
运行上一个例子,你可能会产生疑惑,真的放到目标容器上了吗?用户也会产生同样的疑惑。所以,可以监听拖动过程中发生的一些事件,并用可见的方式让用户知道。这就叫做回显(Feedback)。

对于源(source),可以监听的事件包括:

  create: 在source上应用draggable函数时触发
  start:开始拖动时触发
  drap:拖动过程中触发
  stop:释放时触发
对于目标(target),可以监听的事件包括:
  create: 在target上应用droppable函数时触发
  activate:如果当前拖动的source可以drop到本target,则触发
  deactivate:如果可以drop到本target的拖拽停止,则触发
  over:source被拖动到target上面
  out:source被拖动离开target
  drop:source被释放到target
事件处理函数都是通过draggable和droppable函数的参数传递,在这些事件处理函数中就可以进行Feedback。看一下实际的例子:
复制代码 代码如下:







:-|





Can drop!






<script> <BR>$(function() { <BR>$( "#dragsource" ).draggable({ <BR>start: function(event,ui) { <BR>$(this).find("p").html(":-S"); <BR>}, <BR>stop:function(event,ui){ <BR>$(this).find("p").html(":-|"); <BR>} <BR>}); <br><br>$( "#droppable" ).droppable({ <BR>activate: function(event,ui) { <BR>$(this).find("p").html( "Drop here !" ); <BR>}, <BR>over: function(event,ui) { <BR>$( this ).find( "p" ).html( "Oh, Yeah!" ); <br><br>}, <BR>out: function(event,ui) { <BR>$( this ).find( "p" ).html( "Don't leave me!" ); <br><br>}, <BR>drop: function( event, ui ) { <BR>$( this ).find( "p" ).html( "I've got it!" ); <BR>} <BR>}); <BR>}) <BR></script>



复制拖动
前面的例子都是移动元素,另一种常见的场景是复制拖动。比如visio中的从画板中拖动元素到画布。这是通过draggable函数的helper参数设定的。

helper可以指定为“original”, "clone",其中"original"是默认值,即拖动自身,而clone表示创建自身的一个克隆用于拖拽。helper还可以指定为函数,该函数返回一个自定义的DOM元素用于拖拽。
当不是拖动自身的时候,需要在target上指定drop事件函数,在该函数中将特定的元素添加到target容器上,否则drop的时候什么事情都不会发生。
简单复制的例子如下:
复制代码 代码如下:






拽我!







<script> <BR>$(function() { <BR>$( "#dragsource" ).draggable({ <BR>helper:"clone" <BR>}); <br><br>$("#container").droppable({ <BR>drop:function(event,ui){ <BR>$(this).append($("<p style='position:absolute;left:"+ <BR>ui.offset.left+";top:"+ui.offset.top+"'>clone")); <BR>} <BR>}); <BR>}) <BR></script>



拖动控制
到目前位置,所有的例子中都可以对source随意拖动。在实际应用中经常需要对拖动行为进行控制。下面给出几个例子。

拖动方向
默认拖动方向为x,y两个方向。通过draggable的axis参数可以限制只能水平或竖直拖动。如下:
复制代码 代码如下:






--




|






<script> <BR>$(function() { <BR>$("#dragX").draggable({axis:"x"}); <BR>$("#dragY").draggable({axis:"y"}); <BR>}); <BR></script>



拖动范围
除了方向之外,还可以通过containment参数约束拖动的范围。该参数接受Selector, Element, String, Array类型。其中String可以为parent,document,window,Array是指定一个矩形区域(regin)的四元数组:[x1,y1,x2,y2]。下面的例子分别指定了parent和regin作为范围限制:
复制代码 代码如下:






in parent





in regin






<script> <BR>$(function() { <BR>$("#draggable1" ).draggable({containment: "parent" }); <BR>$("#draggable2").draggable({containment: [20,20,300,200] }); <BR>}); <BR></script>



拖动吸附
还可以在拖动的时候吸附到其他元素或网格。使用snap参数指定要吸附到的元素,使用grid参数指定吸附到网格,如下:

复制代码 代码如下:








吸附到其他可拖拽元素





吸附到容器





吸附到网格(30x30)







<script> <BR>$(function() { <BR>$("#draggable1").draggable({ snap: true }); <BR>$("#draggable2").draggable({ snap: "#container"}); <BR>$("#draggable3").draggable({grid: [30,30]}); <BR>}); <BR></script>



拖动把手(handle)
默认是整个元素都可以拖动,也可以指定元素的某个子元素作为拖动的handle,如:
复制代码 代码如下:


handle



……
<script> <BR>$("#draggable").draggable({handle:"p"}); <BR></script>

Drop限制
默认的droppable指定元素能够接受所有的drop, 但是可以通过accept参数限定只能接受某些元素的drop。accept参数的类型为一个符合jquery selector的字符串。例如:
$(".selector").droppable({ accept: '.special' })
表示只接受具有special 样式的元素。

增强用户体验
前面是实现拖拽的功能,JQueryUI还有一些参数可以增强用户体验。比如,cursor参数可以指定鼠标指针的形状,cursorAt指定鼠标指针在source的相对位置,revert可以指定当drop失败时source“飘”回原来的位置。一个组合的例子如下:
复制代码 代码如下:







I revert when I'm not dropped





Drop me here





<script> <BR>$(function() { <BR>$( "#draggable2" ).draggable({ revert: "invalid",cursor: "move", cursorAt: { top: 56, left: 56 } }); <BR>$( "#droppable" ).droppable({ <BR>activeClass: "ui-state-hover", <BR>hoverClass: "ui-state-active", <BR>drop: function( event, ui ) { <BR>$( this ) <BR>.addClass( "ui-state-highlight" ) <BR>.find( "p" ) <BR>.html( "Dropped!" ); <BR>} <BR>}); <BR>}); <BR></script>



小结
JQuery UI提供了强大的拖拽功能和良好的用户体验,同时又非常容易使用。本文介绍了常用的各种用法。更多的参数还可以参考官方网站的Draggable 和 Droppable 。
Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan