我正在使用带有碰撞的 jquery-ui 的自动完成框来显示输入上方或下方的自动完成。我想要的是在检测到碰撞时向自动完成元素添加一个类,这样我就可以稍微自定义css,如果它高于或低于。这似乎应该很简单,但我似乎无法找到任何方法来实现它。
问问题
4289 次
3 回答
11
更好的解决方案是在回调中使用第二个参数。来自 jQueryUi 文档:
第二个提供关于两个元素的位置和尺寸的反馈,以及对它们的相对位置的计算。target 和 element 都具有以下属性:element、left、top、width、height。此外,还有水平、垂直和重要,给你十二个潜在的方向,如{水平:“中心”,垂直:“左”,重要:“水平”}。
正如它所说,第二个参数中有一个水平属性和一个垂直属性,您可以使用它来确定元素是否被翻转。所以你可以这样写:
$("#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'
});
}
},
于 2014-03-06T02:36:31.123 回答
4
与其使用此处提到的两种解决方案,我更喜欢创建一个自定义翻转处理程序,该处理程序使用默认处理程序并检测是否有更改。
这是我的做法:
$.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'
});
这里唯一相关的线是有碰撞的线。
于 2015-01-27T16:05:19.183 回答
2
你应该使用的using
回调position
这是一个可能的解决方案,假设您打开一个对话框......
$("#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)
您可以将类添加/删除到其他元素,而不是添加/删除对话框本身的类...
于 2013-01-17T10:01:16.767 回答