【问题标题】:Why isn't z-index working on positioned elements?为什么 z-index 不适用于定位元素?
【发布时间】:2016-09-09 13:10:08
【问题描述】:

我希望我的 Bootstrap 下拉菜单出现在下方导航栏,但它似乎不尊重 z-index 样式。

一般来说,我的布局是这样的:

<nav>         <!-- z-index: 2; -->
  <ul>
    <li>
      <ul>    <!-- z-index: 1; -->
        ...

&lt;nav&gt;&lt;ul&gt; 都有 position 样式。完整代码如下:

.nav-submenu {
  top: 20px;
  position: absolute;
  z-index: 1;
}
.navitem-left {
  position: relative;
}
nav {
  height: 72px;
  box-shadow: 0 2px 7px 0 rgba(0, 0, 0, 0.10);
  padding-top: 30px;
  position: fixed;
  z-index: 2;
  width: 100%;
}
nav ul {
  list-style-type: none;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<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.7/js/bootstrap.min.js"></script>
<nav>
  <ul>
    <li class="navitem-left">
      <a href="#" class="dropdown-toggle" id="menu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">CLICK ME!</a>
      <ul class="dropdown-menu nav-submenu" aria-labelledby="menu1">
        <li>
          <a href="#">Why aren't I behind the nav?</a>
        </li>
      </ul>
    </li>
  </ul>
</nav>

为什么堆叠对我不起作用?

【问题讨论】:

    标签: html css twitter-bootstrap z-index


    【解决方案1】:

    它不在导航后面,因为它是导航的子节点。孩子总是高于父母。如果您希望它位于导航后面,则它必须位于与导航不同的容器中。不过,我想知道您为什么首先希望它位于导航后面...?

    无论如何,孩子总是继承父母的 z-index。如果父母高于某物,它的孩子也将高于所说的东西。你只能决定哪一个重叠,当他们是兄弟时(平等嵌套)

    但是,是的,与其帮助您编写代码,我宁愿建议您不要尝试这样做。这几乎不可能在响应式页面(适应不同的屏幕尺寸)中维护,因为您必须将子导航元素放在实际导航栏之外,只是根据另一个容器正确定位它们。

    绝对不推荐。

    【讨论】:

    • 只是为这个好答案添加一些颜色:孩子的 z-index 是相对于其容器进行解释的(技术上是“堆叠上下文”)。一个参考是w3.org/TR/CSS22/zindex.html,它的细节相当详尽。
    • “一个孩子总是在它的父母之上”是不正确的。父级可能没有建立堆叠上下文。例如,请参阅我的答案。
    • “一个孩子总是继承父母的z-index”,这也不是真的,它只是定义了它的基本堆叠上下文,如果设置...
    【解决方案2】:

    你误解了z-index。它指定了该元素相对于它所属的堆叠上下文的索引。

    准确地说,由于你在nav上使用了z-index: 2,所以ul属于nav建立的堆栈上下文!

    删除z-index 以阻止nav 建立堆叠上下文,将z-index 设置为ul 并使用非透明背景。

    哦,去年 CSS WD decided 那个固定定位的元素总是会建立一个堆叠上下文,所以使用另一个定位。

    @import 'https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css';
    .nav-submenu {
      top: 20px;
      position: absolute;
      z-index: -10;
    }
    .navitem-left {
      position: relative;
      float: left;
    }
    nav {
      height: 72px;
      box-shadow: 0 2px 7px 0 rgba(0, 0, 0, 0.10);
      padding-top: 30px;
      position: absolute;
      width: 100%;
      background: #fff;
    }
    nav ul {
      list-style-type: none;
      margin: 0;
    }
    <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.7/js/bootstrap.min.js"></script>
    <nav>
      <ul>
        <li class="navitem-left">
          <a href="#" class="dropdown-toggle" id="menu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">CLICK ME!</a>
          <ul class="dropdown-menu nav-submenu" aria-labelledby="menu1">
            <li>
              <a href="#">Why aren't I behind the nav?</a>
            </li>
          </ul>
        </li>
      </ul>
    </nav>

    【讨论】:

    • 你说得对,这行得通。但它也不起作用。我说这不起作用的原因是因为定位子菜单的右侧变得非常困难。除了父母之外,他们很可能会消失在任何其他 div 后面。比如说,内容。特别是在响应式设计中。确保它始终处于领先地位将是一项相当大的挑战。也许在它周围再放一个包装器并给它一个 Z-index 会起作用吗?我想知道。
    • @Babydead 是的,将 nav 包装在一个建立堆叠上下文的元素中可能是防止 ul 意外被不需要的元素覆盖的好主意。
    • 在这种特定情况下,我认为您的答案比我的更完整。我想知道我是否应该删除我的,以便您的(更正确的)得到更多关注..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 2015-12-25
    相关资源
    最近更新 更多