我有一个jQuery UI droppable元素,当一个draggable悬停在它上面时我想变得更大。我已尝试使用hoverClass选项并绑定到drophover事件。
从视觉上看,这两种方法都可以正常工作。但是,一旦draggable退出droppable的原始(较小)边界,jQuery UI会将其解释为“dropout”,尽管仍处于当前(较大)边界内。
例如,js:
$("#dropable").droppable({
hoverClass: 'hovering'
}.bind('dropout', function () {console.log('dropout')});
的CSS:
#droppable { background: teal; height: 10px; }
#droppable.hovering { height: 200px; }
在这种情况下,当可拖动悬停在可放置的悬浮物上时,悬垂物在视觉上会增加到200px。如果此时,拖动器向下移动了20px,我预计它仍将悬停在可放置的上方。相反,jQuery UI会触发dropout事件,而droppable会恢复为10px高。
任何人都知道如何让它以我期望的方式行事吗?
jsFiddle示例:http://jsfiddle.net/kWFb9/
答案 0 :(得分:4)
出现同样的问题,我可以使用以下选项解决它:
$("#droppable").droppable({
hoverClass: 'hovering',
tolerance: 'pointer'
});
$('#draggable').draggable({
refreshPositions: true
});
这是工作小提琴:http://jsfiddle.net/kWFb9/51/
答案 1 :(得分:2)
所以我对你的小提琴进行了一些调整
首先我将可放置容差设置为“触摸”,只要可拖动的任何部分接触它,它就会激活。这会导致应用悬停类。
接下来,我添加了一个动画来稍微调整可拖动元素的大小。我不确定这是否是你想要的功能,所以无论如何我把它放在那里。
最后,当可拖动元素放入可放置区域时,我会将悬停类永久应用于droppable元素。这样,当存在元素时,droppable不会恢复到那么窄的高度
修改强>
更好的小提琴:http://jsfiddle.net/kWFb9/6/
我希望这会有所帮助:)
答案 2 :(得分:1)
你可以在没有背景的情况下创建一个更大的(即#droppable.hovering的大小)div
并将你的droppable应用于它。请注意,您没有提供HTML,但新#drop_container
应包含两个div。
JS
var dropped;
$("#droppable").droppable({
drop: function(event, ui) {
dropped = true;
}
});
$('#draggable').draggable({
start: function(event, ui) {
$("#droppable").addClass("hovering");
dropped = false;
},
stop: function(event, ui) {
if (!dropped) {
$("#droppable").removeClass("hovering");
}
}
});
CSS
#droppable { background: teal; height: 10px; }
#droppable.hovering, #drop_container { height: 200px; }
或者您可以使用this article
中的.live()
或.livequery()
来尝试其他解决方案
[编辑]我编辑了我的代码,这里是一个jsfiddle:http://jsfiddle.net/94Qyc/1/
我不得不使用全局变量,我没有找到更好的方法来检查盒子是否被丢弃。如果有人有想法,那就太好了。
答案 3 :(得分:0)
还有另一种(哼哼)不错的解决方案:
TL; DR :Fiddle
问题是插件在创建窗口小部件时存储了dom元素的大小值(类似):
//jquery.ui.dropable.js
$.widget("ui.droppable", {
...
_create: function() {
var proportions,
this.proportions = function() { return proportions; }
小部件的偏移量在$ .ui.ddmanager.prepareOffsets()中初始化; 所以我们只需要覆盖比例对象。
This way允许访问真正的插件属性,因此我们可以编写如下内容:
$("#droppable").droppable({
hoverClass: 'hovering',
over: function(ev, ui) {
var $widget = $(this).data('droppable');
$widget.proportions = {
width: $(this).width(),
height: $(this).height()
};
},
out: function(ev, ui) {
var $widget = $(this).data('droppable'); //ui-droppable for latests versions
$widget.proportions = {
width: $(this).width(),
height: $(this).height()
};
}
})