RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1221048
Accepted
HamSter
HamSter
Asked:2021-12-19 21:07:54 +0000 UTC2021-12-19 21:07:54 +0000 UTC 2021-12-19 21:07:54 +0000 UTC

水平拉伸菜单

  • 772

有一个水平菜单和一个更多按钮。

如果菜单项不适合整个可用宽度,则其余项应“隐藏”在下拉菜单中。当您单击该按钮时,将打开一个菜单,其中包含“剩余项目。

所有这些都应该适用于调整大小和加载。

编码:

function adaptMenu() {
  var $category = $('.category'),
    $categoryList = $category.find('.category-list'),
    $categoryMore = $category.find('.category-more'),
    $categoryMoreDD = $categoryMore.closest('.dropdown'),
    $categoryMoreMenu = $categoryMoreDD.find('.dropdown-menu'),
    $categoryItems = $categoryList.find('.category-item');

  var $visible = [],
    $hidden = [];

  $categoryItems.hide();
  var $width = $categoryList.width();
  $categoryItems.show();
  var $total = 0;

  $categoryItems.each(function() {
    var item = $(this);

    item.css({
      'width': 'auto'
    });
    $total += item.width();

    if ($total < $width) {
      $visible.push(item);
    } else {
      $hidden.push(item);
    }

  });

  if ($hidden.length > 0) {
    $categoryMoreMenu.append($hidden);
  } else {
    $categoryMoreMenu.find('li').hide();
  }


}


$(window).on('load', function() {
  adaptMenu();
});

$(window).on('resize', function() {
  adaptMenu();
});

adaptMenu();
.category-list {
  overflow: hidden;
}

.dropdown .category-item {
  width: 100%;
  margin: 0 !important;
}

.dropdown .cat {
  width: 100%;
}
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js" integrity="sha512-bLT0Qm9VnAYZDflyKcBaQ2gg0hSYNQrJ8RilYldYQ1FxQYoCLtUjuuRuZo+fjqhx/qtq/1itJ0C2ejDxltZVFg==" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ho+j7jyWK8fNQe+A12Hb8AhRq26LrZ/JpcUGGOn+Y7RsweNrtN/tE3MoK7ZeZDyx" crossorigin="anonymous"></script>


<div class="category">
  <div class="container-fluid">
    <div class="row">
      <div class="col-9">
        <ul class="category-list list-unstyled d-flex w-100">
          <li class="category-item px-2"><a href="" class="cat btn btn-primary">1</a></li>
          <li class="category-item px-2"><a href="" class="cat btn btn-primary">2</a></li>
          <li class="category-item px-2"><a href="" class="cat btn btn-primary">3</a></li>
          <li class="category-item px-2"><a href="" class="cat btn btn-primary">4</a></li>
          <li class="category-item px-2"><a href="" class="cat btn btn-primary">5</a></li>
          <li class="category-item px-2"><a href="" class="cat btn btn-primary">6</a></li>
          <li class="category-item px-2"><a href="" class="cat btn btn-primary">7</a></li>
          <li class="category-item px-2"><a href="" class="cat btn btn-primary">8</a></li>
          <li class="category-item px-2"><a href="" class="cat btn btn-primary">9</a></li>
          <li class="category-item px-2"><a href="" class="cat btn btn-primary">10</a></li>
          <li class="category-item px-2"><a href="" class="cat btn btn-primary">11</a></li>
          <li class="category-item px-2"><a href="" class="cat btn btn-primary">12</a></li>
          <li class="category-item px-2"><a href="" class="cat btn btn-primary">13</a></li>
          <li class="category-item px-2"><a href="" class="cat btn btn-primary">14</a></li>
          <li class="category-item px-2"><a href="" class="cat btn btn-primary">15</a></li>
          <li class="category-item px-2"><a href="" class="cat btn btn-primary">16</a></li>
          <li class="category-item px-2"><a href="" class="cat btn btn-primary">17</a></li>
          <li class="category-item px-2"><a href="" class="cat btn btn-primary">18</a></li>
          <li class="category-item px-2"><a href="" class="cat btn btn-primary">19</a></li>
          <li class="category-item px-2"><a href="" class="cat btn btn-primary">20</a></li>
        </ul>
      </div>

      <div class="col-3">
        <div class="dropdown">
          <button class="category-more w-100 btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                More
              </button>
          <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

问题:如何在加载和调整大小时显示/隐藏不适合可用可见菜单宽度的下拉菜单中的菜单项?

jquery
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Sevastopol'
    2021-12-19T21:25:19Z2021-12-19T21:25:19Z

    我有一个有趣的解决方案。我真的不认识作者,但多亏了他,结果很好,不需要做任何其他事情。我将与您分享:

    var $nav = $('.nav');
    var $btn = $('.nav button');
    var $vlinks = $('.nav .visible-links');
    var $hlinks = $('.nav .hidden-links');
    var breaks = [];
    
    function updateNav() {
      var availableSpace = $btn.hasClass('hidden') ? $nav.width() : $nav.width() - $btn.width() - 30;
      if ($vlinks.width() > availableSpace) {
        breaks.push($vlinks.width());
        $vlinks.children().last().prependTo($hlinks);
        if ($btn.hasClass('hidden')) {
          $btn.removeClass('hidden');
        }
      } else {
        if (availableSpace > breaks[breaks.length - 1]) {
          $hlinks.children().first().appendTo($vlinks);
          breaks.pop();
        }
        if (breaks.length < 1) {
          $btn.addClass('hidden');
          $hlinks.addClass('hidden');
        }
      }
      $btn.attr("count", breaks.length);
      if ($vlinks.width() > availableSpace) {
        updateNav();
      }
    }
    $(window).resize(function() {
      updateNav();
    });
    $btn.on('click', function() {
      $hlinks.toggleClass('hidden');
    });
    updateNav();
    * {
      margin: 0;
      padding: 0;
    }
    
    body {
      margin: 50px 25px;
    }
    
    .nav {
      position: relative;
      min-width: 250px;
      background: gold;
      border-top: 1px solid red;
      border-bottom: 1px solid red;
    }
    
    .nav a {
      display: block;
      padding: 10px 20px;
      background: gold;
      font-size: 18px;
      color: black;
      text-decoration: none;
    }
    
    .nav a:hover {
      color: red;
    }
    
    .nav button {
      position: absolute;
      height: 100%;
      right: 0;
      padding: 0 15px;
      border: 0;
      outline: none;
      background-color: red;
      color: #fff;
      cursor: pointer;
    }
    
    .nav button:hover {
      background-color: indianred;
    }
    
    .nav button::after {
      content: attr(count);
      position: absolute;
      width: 25px;
      height: 25px;
      left: -16px;
      top: 7px;
      text-align: center;
      background-color: red;
      color: #fff;
      font-size: 14px;
      line-height: 25px;
      border-radius: 50%;
      border: 2px solid #fff;
      font-weight: bold;
    }
    
    .nav button:hover::after {
      transform: scale(1.05);
    }
    
    .nav .hamburger {
      position: relative;
      width: 32px;
      height: 4px;
      background: #fff;
      margin: auto;
    }
    
    .nav .hamburger:before,
    .nav .hamburger:after {
      content: '';
      position: absolute;
      left: 0;
      width: 32px;
      height: 4px;
      background: #fff;
    }
    
    .nav .hamburger:before {
      top: -8px;
    }
    
    .nav .hamburger:after {
      bottom: -8px;
    }
    
    .nav .visible-links {
      display: inline-table;
    }
    
    .nav .visible-links li {
      display: table-cell;
      border-left: 1px solid red;
    }
    
    .nav .hidden-links {
      position: absolute;
      right: 0px;
      top: 100%;
      border-left: 1px solid red;
      border-right: 1px solid red;
      border-bottom: 1px solid red;
    }
    
    .nav .hidden-links li {
      display: block;
      border-top: 1px solid red;
    }
    
    .nav .visible-links li:first-child {
      font-weight: bold;
    }
    
    .nav .visible-links li:first-child a {
      color: red !important;
    }
    
    .nav .hidden {
      visibility: hidden;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <nav class='nav'>
      <button><div class="hamburger"></div></button>
      <ul class='visible-links'>
        <li><a href='#'>Главная</a></li>
        <li><a href='#'>Проекты</a></li>
        <li><a href='#'>Заказы</a></li>
        <li><a href='#'>Выполненные работы</a></li>
        <li><a href='#'>Отзывы</a></li>
        <li><a href='#'>Наши планы</a></li>
        <li><a href='#'>Инвесторы</a></li>
        <li><a href='#'>Контакты</a></li>
      </ul>
      <ul class='hidden-links hidden'></ul>
    </nav>

    • 4

相关问题

  • jquery轨道输入点击

  • 滑块光滑 nextSlider + 1

  • jquery选择器+获取值

  • JQ Masked Input电话号码填写时如何避免输入数字7和8?

  • 如何获取相邻父级 jQuery 的元素?

  • 如何解析收到的json响应

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5