该插件使用jQuery UI 库的Position实用程序。如果您查看插件源代码positionOptions
中的默认选项,则函数中使用了一个属性_refreshPosition()
:
options: {
transferClasses: true,
typeAhead: 1000,
style: 'dropdown',
positionOptions: {
my: "left top",
at: "left bottom",
offset: null
},
width: null,
menuWidth: null,
handleWidth: 26,
maxHeight: null,
icons: null,
format: null,
bgImage: function() {},
wrapperElement: "<div />"
}
_refreshPosition: function() {
var o = this.options;
// if its a pop-up we need to calculate the position of the selected li
if ( o.style == "popup" && !o.positionOptions.offset ) {
var selected = this._selectedOptionLi();
var _offset = "0 " + ( this.list.offset().top - selected.offset().top - ( this.newelement.outerHeight() + selected.outerHeight() ) / 2);
}
// update zIndex if jQuery UI is able to process
this.listWrap
.zIndex( this.element.zIndex() + 1 )
.position({
// set options for position plugin
of: o.positionOptions.of || this.newelement,
my: o.positionOptions.my,
at: o.positionOptions.at,
offset: o.positionOptions.offset || _offset,
collision: o.positionOptions.collision || 'flip'
});
}
'flip'
如果没有为collision
position 实用程序的选项提供任何选项,您可以看到它使用默认值。根据 jQuery UI 文档:
翻转:到另一侧并再次运行碰撞检测以查看它是否适合。如果它不适合任何一个位置,则应该使用 center 选项作为后备。
fit:因此元素保持在所需的方向,但重新定位以使其适合。
none:不做碰撞检测。
所以我想你可以在初始化插件时传递一个选项来定义none
碰撞选项:
$('select').selectmenu({
positionOptions: {
collision: 'none'
}
});
还没有测试,这只是看代码。
编辑以下评论
我注意到 github 上可用的 javascript 版本和插件网站上使用的版本不一样。我不知道你用的是哪一个,但是网站上用的那个positionOptions
实际上是没有选项的,所以调用的时候指定是没有效果的selectmenu()
。
似乎无法直接链接到网站上的 javascript,所以这里有一些代码来说明:
defaults: {
transferClasses: true,
style: 'popup',
width: null,
menuWidth: null,
handleWidth: 26,
maxHeight: null,
icons: null,
format: null
}
_refreshPosition: function(){
//set left value
this.list.css('left', this.newelement.offset().left);
//set top value
var menuTop = this.newelement.offset().top;
var scrolledAmt = this.list[0].scrollTop;
this.list.find('li:lt('+this._selectedIndex()+')').each(function(){
scrolledAmt -= $(this).outerHeight();
});
if(this.newelement.is('.'+this.widgetBaseClass+'-popup')){
menuTop+=scrolledAmt;
this.list.css('top', menuTop);
}
else {
menuTop += this.newelement.height();
this.list.css('top', menuTop);
}
}
正如我第一次使用来自github的版本所描述的那样,我能够使其工作。在我看来,这是一个更新/完整的版本。此外,它是几天前更新的。
我创建了一个带有两个选择的小测试页面。我已经改变了下拉菜单的位置以显示在上面。
第一个没有指定碰撞选项,因此使用了'flip'并且下拉菜单显示在下面,因为上面没有足够的空间。
第二个指定了“无”,即使没有足够的空间,下拉菜单也会显示在上面。
我已将小型测试项目放在我的Dropbox上。