Heim >Web-Frontend >js-Tutorial >JQuery UI的拖拽功能实现方法小结_jquery

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

WBOY
WBOYOriginal
2016-05-16 17:55:221089Durchsuche

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 。
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn