【发布时间】:2012-10-29 06:42:50
【问题描述】:
我正在使用带有碰撞的 jquery-ui 的自动完成框来在输入上方或下方显示自动完成。我想要的是在检测到碰撞时向自动完成元素添加一个类,这样我可以稍微自定义 CSS 是否高于或低于。这似乎应该很简单,但我似乎无法找到任何方法来实现它。
【问题讨论】:
标签: jquery jquery-ui position collision
我正在使用带有碰撞的 jquery-ui 的自动完成框来在输入上方或下方显示自动完成。我想要的是在检测到碰撞时向自动完成元素添加一个类,这样我可以稍微自定义 CSS 是否高于或低于。这似乎应该很简单,但我似乎无法找到任何方法来实现它。
【问题讨论】:
标签: jquery jquery-ui position collision
更好的解决方案是在回调中使用第二个参数。 来自 jQueryUi 文档:
第二个提供有关两个元素的位置和尺寸的反馈,以及对它们相对位置的计算。 target 和 element 都具有以下属性:element、left、top、width、height。此外,还有水平、垂直和重要,给你十二个潜在的方向,如{水平:“中心”,垂直:“左”,重要:“水平”}。
正如它所说,第二个参数中有一个 horizontal 和一个 vertical 属性,您可以使用它们来确定元素是否被翻转。所以你可以这样写:
$("#someId").dialog({
position: {
my: 'left top',
at: 'right top',
collision: 'flip flip',
of: $('#' + someElementID),
using: function (obj,info) {
if (info.vertical != "top") {
$(this).addClass("flipped");
} else {
$(this).removeClass("flipped");
}
if (info.horizontal != "left") {
$(this).addClass("flipped");
} else {
$(this).removeClass("flipped");
}
$(this).css({
left: obj.left + 'px',
top: obj.top + 'px'
});
}
},
【讨论】:
比起使用这里提到的两种解决方案,我更喜欢创建一个自定义翻转处理程序,它使用默认处理程序并检测是否有变化。
这是我的做法:
$.ui.position.custom = {
left: function(position, data) {
var initPos = position.left;
$.ui.position.flip.left(position, data);
if (initPos != position.left) {
data.elem.addClass('tooltipFlipLeft');
} else {
data.elem.removeClass('tooltipFlipLeft');
}
},
top: function(position, data) {
var initPos = position.top;
$.ui.position.flip.top(position, data);
if (initPos != position.top) {
data.elem.addClass('tooltipFlipTop');
} else {
data.elem.removeClass('tooltipFlipTop');
}
}
};
那我在使用位置函数的时候就用到了:
me.position({
of: opener,
my: 'right bottom',
at: 'center top',
collision: 'custom'
});
这里唯一相关的线是有碰撞的线。
【讨论】:
您应该使用position 的using 回调
这是一个可能的解决方案,假设您打开一个对话框...
$("#someId").dialog({
position: {
my: 'left top',
at: 'right top',
collision: 'flip flip',
of: $('#' + someElementID),
using: function (obj) {
if (obj.left < $('#' + someElementID).offset().left) {
$(this).addClass("flipped");
} else {
$(this).removeClass("flipped");
}
//decide if dialog is being opened flipped from buttom to top
if ((obj.top + 50) < $('#' + someElementID).offset().top) {
$(this).addClass("flipped_top");
} else {
$(this).removeClass("flipped_top");
}
$(this).css({
left: obj.left + 'px',
top: obj.top + 'px'
});
}
},
...
您可以向对话框本身添加/删除类,而不是向$(this) 添加/删除类...
【讨论】: