【问题标题】:Positioning jQuery dropdown menu so that it displays completely on the screen on a mobile device定位 jQuery 下拉菜单,使其完全显示在移动设备的屏幕上
【发布时间】:2012-06-12 13:44:46
【问题描述】:

我有一个基本的 jQuery 下拉菜单,并且正在移动设备上进行测试,特别是手机。

我遇到的一个问题是右侧的子菜单有时会超出屏幕边缘,因为其中一个或多个项目中的文本太长。当然,用户可以稍微向右滚动,但这不是一个很好的解决方案。有一个类似的问题here,但我无法得到建议的答案(另外我还在摸索,因为我对 JS/jQuery 还是完全陌生)。

一般的想法似乎是获取当前子菜单的左侧位置+宽度(确保它们首先显示,然后再次隐藏它们或显示它们并在用户点击菜单时移动它们)并查看该值是否大于屏幕宽度。如果是,那么它应该由差值向左移动。但是,我的尝试似乎对元素没有任何作用,并且菜单部分显示在屏幕外。目前,我有这个(在身体加载后运行):

var menus = $('#navbar').find('.subMenu');
menus.show();
menus.each(function(index) {
  var offsetMenu = $(this).offset();
  var diff = screen.width - ($(this).outerWidth + offsetMenu.left);
  if(diff < 0) {
    $(this).offset({top:offsetMenu.top, left:offsetMenu + diff});
  }
  });
menus.hide();

jQuery版本为1.7.2,HTML结构如下(简化版):

<div id="navbar">
  <ul>
    <li class="dropdown"><a href="#">Link A</a></li>
    <li class="dropdown"><a href="#">Link B</a>
      <ul class="subMenu">
        <li><a href="#">Link 1</a></li>
        <li><a href="#">Link 2</a></li>
      </ul>
    </li>
  </ul>
</div>

我怎样才能让它工作?

编辑:这也是相关的 CSS。

#navbar ul.subMenu {
    position:absolute;
    display:none;
    background-color:#FFAF1E;
}
#navbar ul.subMenu li {
    clear:both;
}
#navbar a {
    text-decoration:none;
    color:#0C1F6E;
    display:block;
    padding-right:10px;
    padding-left:10px;
}

【问题讨论】:

    标签: javascript jquery mobile


    【解决方案1】:

    我终于得到了以下工作:

    function adjustSubMenus()
      {
          var menus = $('#navbar').find('.subMenu');
          menus.each(function(){
              $(this).css("left","");
              adjustSingleMenu($(this))
              } );
      }
      function adjustSingleMenu(element)
      {
          element.show();
          var thisMenuWidth = element.outerWidth();
          var thisMenuPos = element.offset();
          var diff = (thisMenuWidth + thisMenuPos.left) - window.outerWidth;
          if(diff > 0) {
              element.css("left", function() { return thisMenuPos.left - diff; });
          }
          element.hide();
      }
      $('body').ready(function() {
          $(window).resize(adjustSubMenus());
          if(window.outerWidth <= 720) {
              $('html').mousedown(function() {
                  $('#navbar').find('.subMenu').each(function(index) { 
                    if($(this).is(":visible") ) {
                        $(this).css("left","");
                        $(this).hide(); 
                        }
                  } );
              });
    
              $('#navbar').mousedown(function(event) {
                  event.stopPropagation();
              });
    
              $('.dropdown').mousedown(function() {
                  var ele = $(this).find('.subMenu');
                  $('#navbar').find('.subMenu').each(function(index) { 
                    if(!$(this).is(ele) && $(this).is(":visible") ) {
                        $(this).css("left","");
                        $(this).hide(); 
                        }
                  } );
                  if(ele.is(":visible")) {
                      ele.css("left","");
                      ele.hide();
                  }
                  else {
                      adjustSingleMenu(ele);
                      ele.show();                 
                  }
                  });
          }
          else
          {
              $('.dropdown').hover(
                  function() { $(this).find('.subMenu').stop(true,true).slideDown("fast"); },
                  function() { $(this).find('.subMenu').stop(true,true).hide(); } 
              );
          }
      });
    

    唯一需要注意的是,如果您在更改手机方向时打开了一个菜单,则该菜单可能会出现在屏幕之外。关闭并重新打开菜单将解决此问题。其他一切都完美无缺。

    【讨论】:

      【解决方案2】:

      您可以尝试创建适用于移动设备的 CSS(与 CSS 类名称相关联),然后在检测到窄屏幕或移动设备时,将 CSS 类添加到您的元素。

      Javascript:

      if (is_mobile)
      {
          $(".subMenu").addClass('mobile');
      }
      

      CSS:

      /* CSS */
      .mobile { width:100%; left:0 !important; position:absolute; }
      

      【讨论】:

      • 如果可能的话,我宁愿重新定位元素。
      【解决方案3】:

      函数不应该检查子菜单的宽度加上它的偏移量,然后如果它大于屏幕宽度,那么将左边的值设置为0并将其宽度设置为屏幕宽度?

      例如

          var menus = $('#navbar').find('.subMenu'),
              screenWidth = $(window).width();
              //screenWidth = screen.width; //I assume this calculates the screens width properly
          menus.show();
          menus.each(function(index) {
            var thisMenu = $(this),
                thisMenuWidth = thisMenu.outerWidth(),
                thisMenuLeft = thisMenu.offset().left;
            if(screenWidth < (thisMenuWidth + thisMenuLeft)) {
              thisMenu
                  .width(screenWidth)
                  .css({ //could replace this with .addClass("yourClass") and add this styling to that "yourClass" instead
                   "left": "0", 
                   "position": "absolute"
                  });
            }
            });
          menus.hide();
      

      更新:

      我假设 screen.width 是您已经为移动设备设计的一些特殊计算。我现在改变了这条线。以上应该工作。我看到你已经有了一个解决方案,尽管它不能修复菜单的宽度。如果菜单比屏幕宽,上面将固定它的宽度。

      【讨论】:

      • 很遗憾,没用。是否会将元素浮动到右侧调整它以使其完全与屏幕保持一致?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-28
      • 1970-01-01
      • 1970-01-01
      • 2018-07-11
      • 2015-07-26
      • 1970-01-01
      相关资源
      最近更新 更多