【问题标题】:Position sticky with submenu not scrolling位置粘滞,子菜单不滚动
【发布时间】:2017-10-30 13:59:51
【问题描述】:

我正在使用 bootstrap v-4 beta2,我想创建带有子菜单的置顶菜单。一切都在桌面上运行,但是当我在移动设备上单击打开子菜单时,我看不到整个子菜单,当我滚动整个网站但没有菜单时。我发现我必须对 li.dropdown 做点什么——当我添加绝对位置时,它有点乱,但我看到了菜单。但我无法得到我应该做的。代码如下:

li.dropdown:hover>.dropdown-menu {
  display: block;
}

li.dropdown {
  position: static;
}

.multi-columns {
  width: 100%;
}
<div class="nav-wrapper sticky-top">
  <div class="container">
    <nav class="navbar navbar-expand-lg navbar-light text-uppercase">
      <a class="navbar-brand" href="/"></a>
      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
          </button>
      <div class="collapse navbar-collapse" id="navbarNav">
        <ul class="navbar-nav mr-auto">
          <li class="nav-item">
            <a class="nav-link" href="index.html">Domov <span class="sr-only">(current)</span></a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="blog.html">Blog</a>
          </li>
          <li class="nav-item active">
            <a class="nav-link" href="eshop.html">E-shop</a>
          </li>
          <li class="nav-item dropdown">
            <a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">Dropdown</a>
            <div class="dropdown-menu multi-columns">
              <div class="row">
                <div class="col-md-3">
                  <h3 class="h5">Blog</h3>
                  <a class="dropdown-item" href="#">Action</a>
                  <a class="dropdown-item" href="#">Another action</a>
                  <a class="dropdown-item" href="#">Something else here</a>
                </div>
                <div class="col-md-3">
                  <h3 class="h5">Blog 2</h3>
                  <a class="dropdown-item" href="#">Action</a>
                  <a class="dropdown-item" href="#">Another action</a>
                  <a class="dropdown-item" href="#">Something else here</a>
                </div>
                <div class="col-md-3">
                  <h3 class="h5">Blog 3</h3>
                  <a class="dropdown-item" href="#">Action</a>
                  <a class="dropdown-item" href="#">Another action</a>
                  <a class="dropdown-item" href="#">Something else here</a>
                </div>
                <div class="col-md-3">
                  <h3 class="h5">Blog 4</h3>
                  <a class="dropdown-item" href="#">Action</a>
                  <a class="dropdown-item" href="#">Another action</a>
                  <a class="dropdown-item" href="#">Something else here</a>
                </div>
              </div>
            </div>
          </li>
        </ul>
        <form action="" class="form-inline">
          <select class="select2 form-control" style="width: 100%;">
    
              </select>
        </form>
      </div>
    </nav>
    <!-- /.nav -->
  </div>
  <!-- /.container -->
</div>
<!-- /.nav-wrapper -->

此外,当我将鼠标悬停在“下拉菜单”上时,它会显示在桌面上,但当我将鼠标放在子菜单上时,它就会消失。我应该像这样移动带有 margin-top: -10px 或 smh 的子菜单吗?或者有什么解决办法?

编辑

主要是子菜单大于视口,然后我根本无法滚动它

【问题讨论】:

  • position: sticky 还是position: fixed?这是两种不同的定位属性,为了清楚起见,应该对它们进行区分。看起来您的问题也可以使用更多样式规则来准确地将问题重现为最小完整可验证示例,请参阅:stackoverflow.com/help/mcve

标签: html css twitter-bootstrap twitter-bootstrap-4


【解决方案1】:

如果您需要子菜单在内容内滚动,您需要指定max-heightoverflow: scroll;

您还需要在dropdown-menu multi-columns 部门内将col-md-3 更改为col-lg-3

CSS

@media (max-width: 991px){
.multi-columns{
  max-height: 300px;
  overflow: auto;
     }
  }

演示片段:

li.dropdown:hover>.dropdown-menu {
  display: block;
}

li.dropdown {
  position: static;
}

.multi-columns {
  width: 100%;
}
@media (max-width: 991px){
.multi-columns{
  max-height: 300px;
  overflow: auto;
     }
  }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-beta/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-beta/js/bootstrap.min.js"></script>


<div class="nav-wrapper sticky-top">
  <div class="container">
    <nav class="navbar navbar-expand-lg navbar-light text-uppercase">
      <a class="navbar-brand" href="/"></a>
      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
          </button>
      <div class="collapse navbar-collapse" id="navbarNav">
        <ul class="navbar-nav mr-auto">
          <li class="nav-item">
            <a class="nav-link" href="index.html">Domov <span class="sr-only">(current)</span></a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="blog.html">Blog</a>
          </li>
          <li class="nav-item active">
            <a class="nav-link" href="eshop.html">E-shop</a>
          </li>
          <li class="nav-item dropdown">
            <a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">Dropdown</a>
            <div class="dropdown-menu multi-columns">
              <div class="row">
                <div class="col-lg-3">
                  <h3 class="h5">Blog</h3>
                  <a class="dropdown-item" href="#">Action</a>
                  <a class="dropdown-item" href="#">Another action</a>
                  <a class="dropdown-item" href="#">Something else here</a>
                </div>
                <div class="col-lg-3">
                  <h3 class="h5">Blog 2</h3>
                  <a class="dropdown-item" href="#">Action</a>
                  <a class="dropdown-item" href="#">Another action</a>
                  <a class="dropdown-item" href="#">Something else here</a>
                </div>
                <div class="col-lg-3">
                  <h3 class="h5">Blog 3</h3>
                  <a class="dropdown-item" href="#">Action</a>
                  <a class="dropdown-item" href="#">Another action</a>
                  <a class="dropdown-item" href="#">Something else here</a>
                </div>
                <div class="col-lg-3">
                  <h3 class="h5">Blog 4</h3>
                  <a class="dropdown-item" href="#">Action</a>
                  <a class="dropdown-item" href="#">Another action</a>
                  <a class="dropdown-item" href="#">Something else here</a>
                </div>
              </div>
            </div>
          </li>
        </ul>
        <form action="" class="form-inline">
          <select class="select2 form-control" style="width: 100%;">
    
              </select>
        </form>
      </div>
    </nav>
    <!-- /.nav -->
  </div>
  <!-- /.container -->
</div>
<!-- /.nav-wrapper -->

希望这对您有所帮助。 Codepen demo link. 谢谢。

【讨论】:

  • 谢谢,我花了一段时间才有机会测试它,但它的工作原理:) 享受你的奖励:D
  • 感谢您的奖励。如果您遇到任何问题,请告诉我:)。
【解决方案2】:

请看以下解决方案:

https://jsfiddle.net/ard5rg6f/1/

我已经使用了几行 jQuery 在菜单打开时将类添加到粘性 div。

$(document).ready(function() {
            $('#navbarNav').on('shown.bs.collapse', function () {
                $('.nav-wrapper.sticky-top').addClass('menu-opened');
            });
            $('#navbarNav').on('hidden.bs.collapse', function () {
                $('.nav-wrapper.sticky-top').removeClass('menu-opened');
            });
        });

并移除下拉菜单的绝对位置属性并添加滚动到粘性div。

.nav-wrapper.sticky-top {
            position: fixed;
        }
        .nav-wrapper.sticky-top.menu-opened {
            overflow: scroll;
            height: 100vh;
        }
        .dropdown-menu {
            display: block;
            position: inherit;
        }

【讨论】:

    【解决方案3】:

    如果您希望导航汉堡按钮在滚动时“粘”在网站上,则需要将其定位为固定位置。

    编辑:我忘记了子菜单,但在启用移动模式的 chrome devtools 中,这可以正常工作。单击子菜单打开菜单,然后再次单击它,将其关闭。

    li.dropdown:hover>.dropdown-menu {
      display: block;
    }
    
    li.dropdown {
      position: static;
    }
    
    .multi-columns {
      width: 100%;
    }
    
    .body {
      height: 1000px;
    }
    
    .nav-wrapper.sticky-top {
      position: fixed;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js"></script>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" rel="stylesheet" />
    <div class="body">
      <div class="container">
        <div class="nav-wrapper sticky-top">
          <div class="container">
            <nav class="navbar navbar-expand-lg navbar-light text-uppercase">
              <a class="navbar-brand" href="/"></a>
              <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
          </button>
              <div class="collapse navbar-collapse" id="navbarNav">
                <ul class="navbar-nav mr-auto">
                  <li class="nav-item">
                    <a class="nav-link" href="index.html">Domov <span class="sr-only">(current)</span></a>
                  </li>
                  <li class="nav-item">
                    <a class="nav-link" href="blog.html">Blog</a>
                  </li>
                  <li class="nav-item active">
                    <a class="nav-link" href="eshop.html">E-shop</a>
                  </li>
                  <li class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">Dropdown</a>
                    <div class="dropdown-menu multi-columns">
                      <div class="row">
                        <div class="col-md-3">
                          <h3 class="h5">Blog</h3>
                          <a class="dropdown-item" href="#">Action</a>
                          <a class="dropdown-item" href="#">Another action</a>
                          <a class="dropdown-item" href="#">Something else here</a>
                        </div>
                        <div class="col-md-3">
                          <h3 class="h5">Blog 2</h3>
                          <a class="dropdown-item" href="#">Action</a>
                          <a class="dropdown-item" href="#">Another action</a>
                          <a class="dropdown-item" href="#">Something else here</a>
                        </div>
                        <div class="col-md-3">
                          <h3 class="h5">Blog 3</h3>
                          <a class="dropdown-item" href="#">Action</a>
                          <a class="dropdown-item" href="#">Another action</a>
                          <a class="dropdown-item" href="#">Something else here</a>
                        </div>
                        <div class="col-md-3">
                          <h3 class="h5">Blog 4</h3>
                          <a class="dropdown-item" href="#">Action</a>
                          <a class="dropdown-item" href="#">Another action</a>
                          <a class="dropdown-item" href="#">Something else here</a>
                        </div>
                      </div>
                    </div>
                  </li>
                </ul>
                <form action="" class="form-inline">
                  <select class="select2 form-control" style="width: 100%;">
    
              </select>
                </form>
              </div>
            </nav>
            <!-- /.nav -->
          </div>
          <!-- /.container -->
        </div>
        <!-- /.nav-wrapper -->
      </div>
    </div>

    【讨论】:

    • 修复的问题是如果菜单长于设备屏幕高度会裁剪。
    • 我可以打开它,但我无法滚动查看子菜单
    猜你喜欢
    • 1970-01-01
    • 2014-07-26
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多