プラグインは、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
jQuery UI ドキュメントによると:
反転: 反対側に移動し、衝突検出が再度実行されて適合するかどうかが確認されます。どちらの位置にも収まらない場合は、中央のオプションをフォールバックとして使用する必要があります。
fit : 要素は目的の方向を保ちますが、フィットするように再配置されます。
none : 衝突検出を行いません。
したがって、プラグインを初期化しnone
て衝突オプションを定義するときにオプションを渡すことができると思います。
$('select').selectmenu({
positionOptions: {
collision: 'none'
}
});
まだテストしていません。これはコードを見るだけです。
次のコメントを編集
github で利用できる JavaScript のバージョンと、プラグイン Web サイトで使用されている 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のバージョンで最初に説明したように、機能させることができました。私の意見では、それはより新しい/完全なバージョンです。また、数日前に更新されました。
2 つの選択を含む小さなテスト ページを作成しました。ドロップダウンの両方の位置を上に表示するように変更しました。
最初のものは衝突オプションを指定していないため、「フリップ」が使用され、ドロップダウンが下に表示されます。これは、上に十分なスペースがないためです。
2 番目には「なし」が指定されており、十分なスペースがない場合でもドロップダウンが上に表示されます。
小さなテスト プロジェクトをドロップボックスに置きました。