Superfish菜单 - 如果右侧没有足够的屏幕空间,则显示子项目

时间:2012-12-20 20:39:58

标签: jquery superfish

我有3级菜单。 我希望子菜单在左侧方向打开,而不是在没有足够的屏幕空间显示时向右打开。

请查看截图以获得确切的想法。

enter image description here

我想使用superfish菜单的onBeforeShow()函数来解决这个问题,但我无法让它按预期工作。

到目前为止,这是我的代码:

$("ul.sf-menu").superfish({
    delay: 1000,
    speed: 'fast',
    disableHI: true,
    onBeforeShow: function()
    {
      thisWidth = $(this).width();
      if  ( thisWidth > 0 ) 
      {
        thisParent = this.parent();
        parentLeft = thisParent.offset().left;
        parentWidth = this.parent().width();
        parentRight = parentWidth + parentLeft ;

        mainLeft =  document
          .getElementsByClassName('sf-menu')[0].offsetLeft;

        mainRight = document
          .getElementsByClassName('sf-menu')[0].offsetWidth;

        if  ( ( thisWidth + parentLeft ) < ( mainLeft + mainRight ) )   
        {
          if  ( thisWidth > ( parentLeft + parentHeight ) ) 
          {
            $(this).css('left', - (parentLeft - mainLeft));
          } 
          else 
          {
            // open left
            $(this).css('left', - (thisWidth - parentWidth));
          }
        }
      }
    }
});

3 个答案:

答案 0 :(得分:3)

我目前正在使用此代码解决我所处理的网站上的问题:

onBeforeShow: function() {
   if($(this).parents("ul").length > 1){
      var w = $(window).width();  
      var ul_offset = $(this).parents("ul").offset();
      var ul_width = $(this).parents("ul").outerWidth();

      // Shouldn't be necessary, but just doing the straight math
      // on dimensions can still allow the menu to float off screen
      // by a little bit.
      ul_width = ul_width + 50;

      if((ul_offset.left+ul_width > w-(ul_width/2)) && (ul_offset.left-ul_width > 0)) {
         $(this).addClass('too_narrow_fix');
      }
      else {
         $(this).removeClass('too_narrow_fix');
      }
   };
}

这是适用的CSS:

.too_narrow_fix {
   left: -14.5em !important;
   top: .5em  !important;
}

答案 1 :(得分:0)

虽然它很老,但我正在分享一个对我有用的解决方案,因为它可以帮助别人并节省时间。 我正在使用最新的jquery superfish菜单1.7.9来解决这个问题。我在该论坛中找到了另一个jquery插件'Supposition'来解决这个问题。

(function($) { //create closure so we can safely use $ as alias for jQuery

  $(document).ready(function() {

    // initialise plugin
    var example = $('#example').superfish({
      //add options here if required                    
    }).supposition();

  });

})(jQuery);

jsfiddle link1 jsfiddle link2

答案 2 :(得分:0)

使用CSS的快速修复程序。

ul.genesis-nav-menu li.menu-item:last-child .sub-menu {
    right: 0;
}