点击下拉菜单时,让内容向下推。

9
我正在尝试在用户选择带有下拉菜单的链接时将内容向下推。然而,当点击下拉菜单时,它会覆盖内容而不是将其向下推。
我尝试使用 position: relative/position: absolute等属性来实现所需的结果,但是没有成功。我看到其他类似的问题,但仍然没有帮助我。
如能解决此问题,将不胜感激。
我的HTML和CSS:

body {
  margin: 0;
  padding: 0;
  font-family: "Helvetica", "Arial", sans-serif;
  font-weight: 500;
  font-style: normal;
  font-size: 12px;
  line-height: 1.5;
}

.navbar-default {
  background-color: #ffffff;
}

.navbar {
  min-height: 65px;
  padding-top: 5px;
  margin-bottom: 0px;
  border-bottom: solid 2px #eee;
}

.navbar-header {
  margin-top: -12px;
}

.navbar-brand {
  padding-top: 0px !important;
}


/* for button placement*/

.navbar-toggle {
  margin-top: 26px;
}


/*for collapsed navbar*/

.navbar-collapse {
  margin-top: 12px;
}

.site-logo {
  max-width: 135px;
  min-width: 120px;
}

.navbar-default .navbar-nav>li>a {
  text-transform: uppercase;
  background-color: #ffffff !important;
  color: #333333;
}

.navbar-default .navbar-nav>li>a:hover {
  color: #3381d0;
}

.navbar-default .navbar-nav>li>a:hover,
.navbar-default .navbar-nav>.active>a,
.navbar-default .navbar-nav>.active>a:focus,
.navbar-default .navbar-nav>.active>a:hover {
  background-color: #ffffff;
  border-bottom: 2px solid #ff5d1c;
  color: #ff5d1c;
  bottom: -2px;
}

.nav>li {
  position: static !important;
}


/* For navbar dropdown*/

.navbar .dropdown-menu {
  min-width: 1349px;
  width: 100%;
  height: 120px;
  margin-top: 51px;
  z-index: 1;
  left: 0;
  text-align: center;
  padding-right: 10px;
  position: absolute;
  list-style-type: none;
  border-top: 2px solid #ff5d1c;
  border-bottom: 2px solid #333333;
  border-right: #ffffff;
  border-radius: 0;
  box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.1);
  border-left: 0;
  background-color: #337ab7;
}

.dropdown-menu {
  padding-left: 10px;
  padding-right: 10px;
  position: relative;
  list-style-type: none;
}

.navbar .dropdown-menu li {
  margin: 0;
  padding: 0;
  display: inline-block;
}

.dropdown-menu>li>a {
  color: #ffffff;
  line-height: 75px;
  padding: 3px;
}

.dropdown-menu>li>a:hover {
  color: #333333 !important;
}

.dropdown-menu>li>a:hover {
  color: #ffffff;
  background-color: #337ab7;
}

.m-pub {
  display: inline-block;
  margin: 3px 40px 0;
  font-size: 13px;
  font-weight: 400;
  text-transform: uppercase;
  letter-spacing: .14em;
  color: white;
  -webkit-transition: none;
  -moz-transition: none;
  -ms-transition: none;
  -o-transition: none;
  transition: none;
  position: relative;
}

.m-pub:after,
.m-pub:focus {
  color: #ffffff;
  background-color: #337ab7;
}

.dropdown-menu li .m-pub:hover:after {
  content: '';
  position: absolute;
  left: 50%;
  margin-left: -10px;
  margin-top: 55px;
  border-left: 0;
  border-bottom: 17px solid transparent;
  border-top: 17px solid transparent;
  border-left: 14px solid #333333;
  transform: rotate(-90deg);
  background: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js" crossorigin="anonymous"></script>

<body>
  <nav class="navbar navbar-default navbar-static-top">
    <div class="container-fluid">
      <div class="navbar-header">
        <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
                    <span class="sr-only">Toggle Navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
        <a class="navbar-brand" href="#">

        </a>
      </div>

      <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
        <ul class="nav navbar-nav" id="nav">
          <li class="nav-link active"><a href="#">Link</a></li>
          <li class="nav-link"><a href="#">Link</a></li>
          <li class="nav-link"><a href="#">Link</a></li>
          <li class="dropdown">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown" id="menu-trigger">Drop-Down Menu<i class="fa fa-angle-down flipped"></i></a>
            <ul class="dropdown-menu" id="menu">
              <li class="nav-link">
                <a href="#" class="m-pub"><i class="fa fa-microphone fa-2x"></i>Option</a>

              </li>
              <li class="nav-link">
                <a href="" class="m-pub"><i class="fa fa-newspaper-o fa-2x"></i>Option</a>

              </li>
            </ul>
          </li>

          <li class="nav-link"><a href="#">Link</a></li>
          <li class="nav-link"><a href="#">Link</a></li>
        </ul>
      </div>
    </div>
  </nav>


  <div class="container" style="background: red;height:100px; width: 100%;">

  </div>

</body>

我为您提供了一个jsfiddle链接:JSFiddle
2个回答

14

你猜对了,这个问题与定位有关。不幸的是,如果使用 position: absolute.dropdown-menu 将从文档流中移除,最终覆盖在其下方而不是将其移开。如果使用position: relative 则会强制其父级元素进行调整,进而破坏你的菜单。据我所知,没有使用纯 CSS 解决此问题的方法。但是,通过 JavaScript 有几种解决方案,由于 Bootstrap 已经使用了 JQuery,因此我们可以直接使用它。

为了在点击 dropdown-menu 时将内容向下移动,您需要更改 .container、内容本身或者相对于 dropdown-menu 的父/祖先元素。我选择向祖先元素(在本例中为 nav 元素)添加 margin-bottom。你也可以向.container 添加 margin-top。无论哪种方式,都需要将边距设置为 .dropdown-menu 的高度,该高度设置为 120px。我创建了以下规则来实现这一点:

nav.navbar.open {
  margin-bottom: 120px;
}

当单击 li.dropdown 时,JQuery 将添加额外的类 .open。我使用了这个简短的 JQuery 代码来实现:

$("li.dropdown").click(function() {
  $("nav.navbar" ).toggleClass( "open");
});

只需要这些。当点击 li.dropdown 时,会向 nav 元素添加一个 .open 类,从而将其底部边距增加到与 .dropdown-menu 相同的高度。由于 .dropdown-menu 被绝对定位,所以边距不会影响它,但会像 .dropdown-menu 没有从文档流中移除一样将 .container 推下去。之所以使用 li.dropdown 而不是 #menu-trigger(链接本身)是因为如果使用链接,然后单击 .dropdown-menu,菜单被关闭,但边距仍然存在。通过使用 dropdown-menu 的父元素,无论何时单击父元素的任何子元素时都会触发单击事件。如果使用兄弟,则触发器不会发生。

$("li.dropdown").click(function() {
  $("nav.navbar").toggleClass("open");
});
body {
  margin: 0;
  padding: 0;
  font-family: "Helvetica", "Arial", sans-serif;
  font-weight: 500;
  font-style: normal;
  font-size: 12px;
  line-height: 1.5;
}
.navbar-default {
  background-color: #ffffff;
}
.navbar {
  min-height: 65px;
  padding-top: 5px;
  margin-bottom: 0px;
  border-bottom: solid 2px #eee;
}
.navbar-header {
  margin-top: -12px;
}
.navbar-brand {
  padding-top: 0px !important;
}
/* for button placement*/

.navbar-toggle {
  margin-top: 26px;
}
/*for collapsed navbar*/

.navbar-collapse {
  margin-top: 12px;
}
.site-logo {
  max-width: 135px;
  min-width: 120px;
}
.navbar-default .navbar-nav > li > a {
  text-transform: uppercase;
  background-color: #ffffff !important;
  color: #333333;
}
.navbar-default .navbar-nav > li > a:hover {
  color: #3381d0;
}
.navbar-default .navbar-nav>li>a:hover,
.navbar-default .navbar-nav>.active>a,
.navbar-default .navbar-nav>.active>a:focus,
.navbar-default .navbar-nav>.active>a:hover {
  background-color: #ffffff;
  border-bottom: 2px solid #ff5d1c;
  color: #ff5d1c;
  bottom: -2px;
}
.nav>li {
  position: static !important;
}
/* For navbar dropdown*/

.navbar .dropdown-menu {
  min-width: 1349px;
  width: 100%;
  height: 120px;
  margin-top: 51px;
  z-index: 1;
  left: 0;
  text-align: center;
  padding-right: 10px;
  position: absolute;
  list-style-type: none;
  border-top: 2px solid #ff5d1c;
  border-bottom: 2px solid #333333;
  border-right: #ffffff;
  border-radius: 0;
  box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.1);
  border-left: 0;
  background-color: #337ab7;
}
.dropdown-menu {
  padding-left: 10px;
  padding-right: 10px;
  position: relative;
  list-style-type: none;
}
.navbar .dropdown-menu li {
  margin: 0;
  padding: 0;
  display: inline-block;
}
.dropdown-menu > li > a {
  color: #ffffff;
  line-height: 75px;
  padding: 3px;
}
.dropdown-menu > li > a:hover {
  color: #333333 !important;
}
.dropdown-menu > li > a:hover {
  color: #ffffff;
  background-color: #337ab7;
}
.m-pub {
  display: inline-block;
  margin: 3px 40px 0;
  font-size: 13px;
  font-weight: 400;
  text-transform: uppercase;
  letter-spacing: .14em;
  color: white;
  -webkit-transition: none;
  -moz-transition: none;
  -ms-transition: none;
  -o-transition: none;
  transition: none;
  position: relative;
}
.m-pub:after,
.m-pub:focus {
  color: #ffffff;
  background-color: #337ab7;
}
.dropdown-menu li .m-pub:hover:after {
  content: '';
  position: absolute;
  left: 50%;
  margin-left: -10px;
  margin-top: 55px;
  border-left: 0;
  border-bottom: 17px solid transparent;
  border-top: 17px solid transparent;
  border-left: 14px solid #333333;
  transform: rotate(-90deg);
  background: none;
}
nav.navbar.open {
  margin-bottom: 120px;
}
<head>
  <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" />
</head>

<body>
  <nav class="navbar navbar-default navbar-static-top">
    <div class="container-fluid">
      <div class="navbar-header">
        <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
          <span class="sr-only">Toggle Navigation</span>
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
        </button>
        <a class="navbar-brand" href="#"></a>
      </div>
      <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
        <ul class="nav navbar-nav" id="nav">
          <li class="nav-link active"><a href="#">Link</a>
          </li>
          <li class="nav-link"><a href="#">Link</a>
          </li>
          <li class="nav-link"><a href="#">Link</a>
          </li>
          <li class="dropdown">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown" id="menu-trigger">Drop-Down Menu<i class="fa fa-angle-down flipped"></i></a>
            <ul class="dropdown-menu" id="menu">
              <li class="nav-link">
                <a href="#" class="m-pub"><i class="fa fa-microphone fa-2x"></i>Option</a>
              </li>
              <li class="nav-link">
                <a href="" class="m-pub"><i class="fa fa-newspaper-o fa-2x"></i>Option</a>
              </li>
            </ul>
          </li>
          <li class="nav-link"><a href="#">Link</a>
          </li>
          <li class="nav-link"><a href="#">Link</a>
          </li>
        </ul>
      </div>
    </div>
  </nav>
  <div class="container" style="background: red;height:100px; width: 100%;">
  </div>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
</body>

这段代码很小,会触发移动视图,因此您需要在全屏模式下查看它。或者您可以查看codepen

需要注意的是,你添加到.dropdown-menu的一些样式可能会破坏移动版本,所以您可能需要重新审视它们,或者添加一些媒体查询来进行修复。


感谢您提供了这么棒的答案!您的解释对我帮助很大。 - user2538755
每当我打开下拉菜单并在页面的其他地方单击时,菜单就会消失,但边距仍然保持不变。有没有一种解决这个问题的方法,而不涉及toggleClass()函数?@David Mann - user2538755
我尝试添加一个监听器到整个文档以在单击任何东西时移除打开的类。不幸的是,Bootstrap似乎阻止了传播,因此事件从未触发。我能想到的唯一解决方法是深入研究Bootstrap的代码,并修改执行原始任务以切换类的功能,或者停止阻止传播的函数。 - David Mann
这是我尝试的函数,但由于与bootstrap的冲突,我无法知道它是否有效。 $(document).on('click', function(event) { if ($(event.target).closest('li.dropdown').length || $(nav.navbar).hasClass("open")) { $("nav.navbar").toggleClass("open"); } }); - David Mann
我已经成功解决了我的问题 jsfiddle ... 再次感谢您的帮助 @David Mann - user2538755

0

使用Bootstrap手风琴,它使用Bootstrap CSS,您可以将单个手风琴项目用作下拉菜单以将内容下推,这是Bootstrap代码,因此您只需复制并根据需要使用 class="collapse" class="show"即可打开或关闭。在导航栏中任何地方使用手风琴作为下拉菜单。

<div class="accordion accordion-flush" id="accordionFlushExample">
  <div class="accordion-item">
    <h2 class="accordion-header" id="flush-headingOne">
      <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-collapseOne" aria-expanded="false" aria-controls="flush-collapseOne">
        Accordion Item #1
      </button>
    </h2>
    <div id="flush-collapseOne" class="accordion-collapse collapse" aria-labelledby="flush-headingOne" data-bs-parent="#accordionFlushExample">
      <div class="accordion-body">Placeholder content for this accordion, which is intended to demonstrate the <code>.accordion-flush</code> class. This is the first item's accordion body.</div>
    </div>
  </div>
  <div class="accordion-item">
    <h2 class="accordion-header" id="flush-headingTwo">
      <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-collapseTwo" aria-expanded="false" aria-controls="flush-collapseTwo">
        Accordion Item #2
      </button>
    </h2>
    <div id="flush-collapseTwo" class="accordion-collapse collapse" aria-labelledby="flush-headingTwo" data-bs-parent="#accordionFlushExample">
      <div class="accordion-body">Placeholder content for this accordion, which is intended to demonstrate the <code>.accordion-flush</code> class. This is the second item's accordion body. Let's imagine this being filled with some actual content.</div>
    </div>
  </div>
  <div class="accordion-item">
    <h2 class="accordion-header" id="flush-headingThree">
      <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-collapseThree" aria-expanded="false" aria-controls="flush-collapseThree">
        Accordion Item #3
      </button>
    </h2>
    <div id="flush-collapseThree" class="accordion-collapse collapse" aria-labelledby="flush-headingThree" data-bs-parent="#accordionFlushExample">
      <div class="accordion-body">Placeholder content for this accordion, which is intended to demonstrate the <code>.accordion-flush</code> class. This is the third item's accordion body. Nothing more exciting happening here in terms of content, but just filling up the space to make it look, at least at first glance, a bit more representative of how this would look in a real-world application.</div>
    </div>
  </div>
</div>

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接