【问题标题】:Z-index not working on fixed header and fixed drop down menuZ-index 不适用于固定标题和固定下拉菜单
【发布时间】:2013-08-18 19:09:44
【问题描述】:

我正在尝试设计一个固定的下拉菜单,当它被较小的视图端口查看时,它会滑动然后位于我的网站的固定标题下。我一定没有正确理解某些东西,因为尽管正确设置了位置并在导航上使用了比其父级的 z-index lower,但它仍然无法正常工作。在下拉时,它会在我创建的菜单按钮下滑动,但在标题上方,然后停留在标题上方。这是我的代码:

HTML:

<header>
    <div id="menu-button" class="up">menu</div>
    <nav role="primary" class="hide">
        <ul>
            <li><a href="#">foobar</a></li>
            <li><a href="#">foobar</a></li>
            <li><a href="#">foobar</a></li>
            <li><a href="#">foobar</a></li>
            <li><a href="#">foobar</a></li>
            <li><a href="#">foobar</a></li>
        </ul>
    </nav>
</header>

CSS:

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
}
header {
    display: block;
    float: left;
    width: 100%;
    height: 50px;
    background-color: hsla(0, 0%, 20%, 1);
    box-shadow: 0px 2px 8px #222;
    position: fixed;
    top: 0;
    z-index: 99;
}
#menu-button {
    display: block;
    float: left;
    background-color: hsla(0, 0%, 50%, 1);
    color: #fff;
    border: 2px solid #222;
    border-radius: 6px;
    padding: .25em .5em;
    margin-left: 10px;
    margin-top: 10px;
    cursor: pointer;
}
.up {
    background-image: linear-gradient(hsla(0, 0%, 100%, .2), hsla(0, 0%, 0%, .2));
}
.down {
    background-image: linear-gradient(hsla(0, 0%, 0%, .2), hsla(0, 0%, 100%, .2));
}
nav ul {
    list-style:none;
    width: 100%;
    position: fixed;
    z-index: -1;
    transition: all .6s ease;
    -webkit-transition: all .6s ease;
    -moz-transition: all .6s ease;
    -o-transition: all .6s ease;
}
.hide ul {
    top: -500px;
}
.reveal ul {
    top: 50px;
}
nav ul li a, nav ul li a:visited {
    display: block;
    float: left;
    width: 50%;
    background-color: hsla(0, 0%, 35%, 1);
    text-decoration: none;
    text-align: center;
    color: #fff;
    padding: 1em;
    border-right: 1px solid #fff;
    border-bottom: 1px solid #fff;
    transition: .4s all;
    -webkit-transition: .4s all;
    -moz-transition: .4s all;
    -o-transition: .4s all;
}
nav ul li:nth-child(even) a {
    border-right: none;
}
nav ul li:hover a {
    background-color: hsla(0, 0%, 50%, 1);
}

jQuery:

$('#menu-button').click(function () {
    $(this).toggleClass('down');
    $('nav').toggleClass('reveal');
});

这是我为它制作的 jsfiddle:

http://jsfiddle.net/kyleshevlin/yaJyK/6/

【问题讨论】:

  • 问题是孩子不能覆盖其父母的z-index。因此,您可能不得不更改一些 HTML 标记,正如 dc5 建议的那样

标签: css z-index


【解决方案1】:

做到这一点并保持您的固定标题要求的一种方法是在菜单按钮周围添加一个包装器:

<div class='menu-wrap'>
    <div id="menu-button" class="up">menu</div>
</div>
<nav role="primary" class="hide">
    …
</nav>

使菜单包装为菜单栏的整个宽度/高度:

.menu-wrap {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background-color: blue; /* just to make it obvious… */
}

Demo fiddle

【讨论】:

  • 感谢 dc5 似乎做了我想做的一切。我想知道你是怎么想的。它看起来并不直观,但我发现并不是所有的编码都是直观的。
【解决方案2】:

移除父级(标题)上的 z-index 并添加一个 position:relative。

【讨论】:

  • 嗯,我不知道为什么会这样。但以防万一我遗漏了什么,我在他的小提琴中试了一下。它似乎没有用。也许更多解释会有所帮助?
  • 那行得通。我不是 OP,但如果您能添加解释,我会非常感兴趣。或者至少是一些相关文档的链接。
  • @lansen,虽然这有效(我实际上注意到在我发布之前更改了固定位置),但我需要将标题留在页面顶部,以便您可以滚动其余部分它下面的页面。相对位置将允许标题滚动。编辑:刚刚注意到你有两个职位。由于CSS向后读取规则,固定的不会取消相对吗?
  • @lansen,我还选择在你的小提琴中添加一些虚拟文本,并且标题不会保持固定,文本现在位于菜单顶部因此,我需要能够给出菜单的正 z-index 仍然低于标题,因此它位于文本上方但标题下方。
【解决方案3】:

您不能在固定元素(具有更大的 z-index)内拥有菜单(您想要的具有较低 z-index 的菜单)。 您必须将这两者分开,使它们都固定,并将您的内容放在下面的绝对定位容器中,顶部 = 标题高度(或边缘顶部)

然后标题和菜单都将保留在原位,您可以单独设置每个 z-index (like this)

header {
    display: block;
    width: 100%;
    height: 50px;
    background-color: hsla(0, 0%, 20%, 1);
    box-shadow: 0px 2px 8px #222;
    position: fixed;
    top: 0;
    z-index:1;
}
nav{
    position:fixed;
    transition: all .6s ease;
    -webkit-transition: all .6s ease;
    -moz-transition: all .6s ease;
    -o-transition: all .6s ease;
    width:100%;
}

<header>
    <div id="menu-button" class="up">menu</div>
</header>
<nav role="primary" class="hide">
    <ul>
        <li><a href="#">foobar</a></li>
        ...

【讨论】:

  • 感谢您的回答!您的小提琴仍然在菜单顶部显示文本,但了解我无法覆盖父 z-index 有助于我理解为什么我的项目无法正常工作。
  • 是的,只需增加标题和菜单的z-index 即可。 jsfiddle.net/yaJyK/14
【解决方案4】:

我有一个 inner &lt;div&gt; 和一个 outer &lt;div&gt;

我的 inner div z-index 无法正常工作,因为 outer div 没有定义 z-index

.inner {z-index:999}
.outer {z-index:111} /*<-- explicitly defined*/

【讨论】:

    猜你喜欢
    • 2011-07-10
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多