今天我们开始第十二讲,今天我们将仔细看一下Drag.Move——一个很强大的MooTools类,它可以让你给你的web应用添加拖放功能。它的使用和我们见过的其他的插件类似:首先你使用“new”关键字来创建一个Drag.Move对象并赋值给一个变量,然后你再定义你的选项和事件。这就是全部要做的事情,不过你一定要注意一下下面的例子中描述的IE的CSS怪异现象。
基本用法
Drag.Move
创建你自己的拖动对象非常的容易。稍微看一下下面的例子就行了。注意一下我们是怎么把我们的Drag.Move对象的选项和事件从我们的Drag选项和事件中分离出来的。Drag.Move类扩展了Drag类,因此它可以接受Drag类的选项和事件。今天我们并不打算特别地讲一讲Drag类,不过我们还是要研究一下一些有用的选项和事件。看一下下面的代码,然后学习一下其中的细节。
参考代码: [复制代码] [保存代码]
- var myDrag = new Drag.Move(dragElement, {
-
- droppables: dropElement,
- container: dragContainer,
-
- handle: dragHandle,
-
-
-
- onDrop: function(el, dr) {
-
- alert(dr.get('id'));
- },
-
-
- onComplete: function(el) {
- alert(el.get('id'));
- }
- });
在这里我们稍微打断一下……
Drag.Move选项
Drag.Move选项有两个很重要的元素:
- droppables——设置可接纳的(droppable)元素的选择器(这个元素将会注册拖动相关的事件)
- container——设置拖动元素的容器(可以保证元素一直在容器内)
设置这个选项非常的容易:
参考代码: [复制代码] [保存代码]
- var dragElement = $('drag_element');
- var dropElements = $$('.drag_element');
-
- var dragContainer = $('drag_container');
- var myDrag = new Drag.Move(dragElement , {
-
-
- droppables: dropElements ,
-
- container: dragContainer
- });
现在你的可接受拖动元素的元素就包含进来了,你就有了一个可以接受拖放元素的类。
Drag.Move事件
这个事件可以让你在不同的点去触发一个函数,比如当你开始拖动一个对象或者你准备放下它。每一个Drag.Move事件都将传递拖动元素和接受拖动元素的元素(我们一直叫做droppable)作为参数。
- onDrop——这个事件将在一个可拖动的元素放到一个接受拖动元素的元素里面时触发。
- onLeave——这个事件将在一个可拖动的元素离开一个接受拖动元素的元素时触发。
- onEnter——这这个事件将在一个可拖动的元素进入一个接受拖动元素的元素时触发。
这些事件中的每一个事件都将调用一个函数,每个函数都将在相应的事件触发时调用。
参考代码: [复制代码] [保存代码]
- var dragContainer = $('drag_container');
-
- var myDrag = new Drag.Move(dragElement , {
-
- droppables: dropElements ,
- container: dragContainer ,
-
-
-
- onDrop: function(el, dr) {
-
-
- if (!dr) {
-
- }
-
-
-
- else {
-
- };
- },
- onLeave: function(el, dr) {
-
- },
- onEnter: function(el, dr) {
-
- }
- });
一些Drag事件和选项
对于Drag,有许多选项和事件,不过这里我们只看一小部分。
snap——选项
snap选项可以让你设置用户的鼠标至少移动多少个像素后开始拖动。默认是6,你额可以设置为任何数字或者值为数字的变量。很明显,这里有一些合理的限制(比如设置snap为1000将毫无用处),但是这在定制你的用户体验时将会派上用场。
参考代码: [复制代码] [保存代码]
- var myDrag = new Drag.Move(dragElement , {
-
- snap: 10
- });
handle——选项
handle可以给你的拖动元素添加一个控制对象。这个控制对象将成为唯一的可以接受“抓取”(拖动)的元素,从而允许你使用其他的元素做一些其他的事情。要设置一个控制对象,只需调用这个元素就可以了。
参考代码: [复制代码] [保存代码]
- var dragHandle = $('drag_handle');
- var myDrag = new Drag.Move(dragElement , {
-
- handle: dragHandle
- });
onStart——事件
onStart和它名字一样,当开始拖动时触发这个事件。如果你设置了一个很大的snap,这个事件将不会触发直到鼠标离开元素有指定的snap值那么远。
参考代码: [复制代码] [保存代码]
- var myDrag = new Drag.Move(dragElement , {
-
-
- onStart: function(el) {
-
- }
- });
onDarg——事件
这个onDrag事件,将会在你拖动一个元素时连续地触发。
参考代码: [复制代码] [保存代码]
- var myDrag = new Drag.Move(dragElement , {
-
-
- onDrag: function(el) {
-
- }
- });
onComplete——事件
最后是onComplete事件,将在你放下一个拖动元素时触发,而不管你是不是把它放到了一个可以接受拖动元素的元素内部。
参考代码: [复制代码] [保存代码]
- var myDrag = new Drag.Move(dragElement , {
-
-
- onComplete: function(el) {
-
- }
- });
代码示例
让我们把刚才的这些代码以一种方式组合起来,当不同的事件触发时,我们突出显示不同的内容,并且我们使用上面我们看到的选项来配置我们的Drag.Move对象:
参考代码: [复制代码] [保存代码]
- window.addEvent('domready', function() {
- var dragElement = $('drag_me');
- var dragContainer = $('drag_cont');
- var dragHandle = $('drag_me_handle');
- var dropElement = $$('.draggable');
- var startEl = $('start');
- var completeEl = $('complete');
- var dragIndicatorEl = $('drag_ind');
- var enterDrop = $('enter');
- var leaveDrop = $('leave');
- var dropDrop = $('drop_in_droppable');
-
- var myDrag = new Drag.Move(dragElement, {
-
- droppables: dropElement,
- container: dragContainer,
-
- handle: dragHandle,
-
- onDrop: function(el, dr) {
- if (!dr) { }
-
- else {
- dropDrop.highlight('#FB911C');
- el.highlight('#fff');
- dr.highlight('#667C4A');
- };
- },
- onLeave: function(el, dr) {
- leaveDrop.highlight('#FB911C');
- },
- onEnter: function(el, dr) {
- enterDrop.highlight('#FB911C');
- },
-
- onStart: function(el) {
- startEl.highlight('#FB911C');
- },
- onDrag: function(el) {
- dragIndicatorEl.highlight('#FB911C');
- },
- onComplete: function(el) {
- completeEl.highlight('#FB911C');
- }
- });
- });
注意一下CSS:在IE中,为了能够适合地注册Drag.Move的容器,你需要在下面的CSS中明确地指出它的位置。最重要的一点是你需要记住设置容器的位置为“position: relative”,而设置可拖动的元素的位置为“position: absolute”,然后一定要设置可拖动元素的left和top属性。现在,如果你正在为其他浏览器构建并且遵循此规则,你可以忽略这一部分:
参考代码: [复制代码] [保存代码]
- body {
- margin: 0
- padding: 0
- }
-
- #drag_me {
- width: 100px
- height: 100px
- background-color: #333
- position: absolute
- top: 0
- left: 0
- }
-
-
- #drop_here {
- width: 200px
- height: 200px
- background-color: #eee
- }
-
- #drag_cont {
- background-color: #ccc
- height: 600px
- width: 500px
- position: relative
- margin-top: 100px
- margin-left: 100px
- }
-
- #drag_me_handle {
- width: 100%
- height: auto
- background-color: #666
- }
-
- #drag_me_handle span {
- display: block
- padding: 5px
- }
-
-
- .indicator {
- width: 100%
- height: auto
- background-color: #0066FF
- border-bottom: 1px solid #eee
- }
-
- .indicator span {
- padding: 10px
- display: block
- }
-
- .draggable {
- width: 200px
- height: 200px
- background-color: blue
- }
现在我们再建立我们的HTML:
参考代码: [复制代码] [保存代码]
- <div id="drag_cont">
- <div id="start" class="indicator"><span>拖动开始</span></div>
- <div id="drag_ind" class="indicator"><span>拖动中</span></div>
- <div id="complete" class="indicator"><span>拖动结束</span></div>
- <div id="enter" class="indicator"><span>进入了Droppable元素</span></div>
- <div id="leave" class="indicator"><span>离开了Droppable元素</span></div>
- <div id="drop_in_droppable" class="indicator"><span>放进了Droppable元素</span></div>
- <div id="drag_me">
- <div id="drag_me_handle"><span>控制对象</span></div>
- </div>
-
- <div id="drop_here" class="draggable"> </div>
- </div>
拖动开始
拖动中
拖动结束
进入了Droppable元素
离开了Droppable元素
放进了Droppable元素
更多学习……
这里是文档中一些相关的章节:
下载一个包含你开始所需要的所有东西的zip包
包含MooTools 1.2核心库、MooTools 1.2扩展库,一个包含你的函数的外部javascript文件,一个定义你的样式的外部CSS文件,一个简单的HTML文件和上面的例子。