我不相信你可以在 CSS 中做到这一点。
这给我们留下了javascript。基本思想是:
- 计算菜单的基线
- 如果这位于边界之外
- 向上移动菜单以更正位置
- 从此过上几乎幸福的生活
但是,我们有一个主要问题:
尽管我们捕获了元素的焦点,但我们不知道它的子菜单何时显示和定位。因此,尽管您的问题在技术上已得到解决,但到目前为止还不是理想的解决方案。
更新
我能想到的最好的解决方法是:
- 关闭动画(以避免丑陋的故障)
- 添加一个观察者,它会持续监控即将打开的元素
- 如果打开,应用位置修正
无论如何,如果您考虑到这一步,您不妨覆盖 jquery ui 组件的默认定位,并注意您将无法轻松更新库。更新:或者试试Rudy Garcia 的版本,如果可行的话
演示
演示代码:
var BASE_OFFSET = $('#menuContainer').offset().top;
var MAX_OFFSET = $('#menuContainer').height(); // get the offset of the container
var whenVisible = function($el, callback){ //executes callback when $el is visible
if($el.is(':visible')){ // if visible
callback(); // execute callback
}else{ // otherwise
setTimeout(function(){whenVisible($el, callback);},10); // do the same check in 10 ms
}
};
var fixPosition = function($menu){ // correct the position of the menu in respect to #menuContainer
var h = $menu.outerHeight(true); // take the height of the menu
var menuBottom = $menu.offset().top + h - BASE_OFFSET; // the baseline of the menu (taking into consideration the BASE_OFFSET)
if(menuBottom > MAX_OFFSET){ // if this is outside the MAX height
var diff = MAX_OFFSET - menuBottom; // calculate the difference
var newTop = $menu.position().top + diff; // modify current positioning with the calculated diff value
$menu.css('top', newTop + 'px'); // apply it to top (which is also used by jquery to position submenus
}
$.fx.off = false; // switch animations back on
};
$( "#menu" ).menu().on('menufocus', function(ev, ui){ // on the event menufocus
var $ui = $(ui.item); //take the focused element
var $menu = $ui.children('ul'); // take its related submenu
if($menu.length === 0){ // if there is none
return; // just terminate
}
$.fx.off = true; // switch off jQuery effects (otherwise you'll have glitches)
whenVisible($menu, function(){fixPosition($menu);}); // execute fixPosition when $menu is visible
});