CSS + HTML下拉菜单重叠问题

6
我有一个下拉菜单子元素重叠父元素的问题。请查看我的fiddle以了解问题:Fiddle示例 HTML代码:
<div id="main_category_menu">
<ul id="menu">
        <li>
            <a href="#">Category</a>
            <div class="menu-container">
            <h3>Text goes here</h3>
            Items count: tralala<hr/>
            <ul class="menu_category">
                <li class="menu_subcategory">
                    <a href="browse.php?id=76">
                        Advertising(0)
                    </a>
                </li>
                <li class="menu_subcategory">
                    <a href="browse.php?id=76">
                        Blalala(0)
                    </a>
                </li>
                <li class="menu_subcategory">
                    <a href="browse.php?id=76">
                        Super megatron(0)
                    </a>
                </li>
            </ul>
            </div>
        </li>
</ul>
</div>

CSS代码:
#main_category_menu{
width: 100%;
}

#menu ul, #menu li {
  line-height:22px;
  text-align:left;
  font-size:14px;
}

#menu {
  list-style:none;
  width:100%;
  margin:0 auto;
  height:45px;
  padding:5px 30px;
}

#menu li {
  float:left;
  display:block;
  position:relative;
  text-align:center;
  padding:4px 10px;
  margin:7px 30px 0 0;
  border:none;
}
#menu li:hover {
  border:1px solid #b7b7b7;
  border-bottom: none;
  padding:4px 9px;
  background: yellow;
      border-radius:5px 5px 0 0;
  -moz-border-radius:5px 5px 0 0;
  -webkit-border-radius:5px 5px 0 0;
  z-index: 10;
}
#menu li a {
  font-size:14px;
  color: #444444;
  display:block;
  outline:0;
  text-decoration:none;
}
#menu li:hover a {
  color:#161616;
}

#menu .menu-container{
  margin:0px auto;
  float:left;
  position:absolute;
  left:-999em;
  text-align:left;
  padding:10px 5px;
  border:1px solid #b7b7b7;
  background-color: #ffffff;

      border-radius:0 5px 5px 5px;
  -moz-border-radius:0 5px 5px 5px;
  -webkit-border-radius:0 5px 5px 5px;
}
#menu .menu-container {
  width:280px;
  background: transparent url('logo.gif') no-repeat right bottom;
}
#menu li:hover .menu-container{
  top:auto;
  left:-1px;
}

#menu p, #menu h2, #menu h3, #menu ul li {
  line-height:21px;
  font-size:12px;
  text-align:left;
}
#menu p {
  line-height:18px;
  margin-bottom:10px;
  color:#F2E8E8;
}
#menu h3, #menu h2 {
  font-size:11px;
  margin:7px 0 14px 0;
  padding-bottom:5px;
  text-transform:uppercase;
  color: #999999;
}
#menu li:hover div a {
  color: #666666;
  font-size: 11px;
  padding-left: 6px;
}
#menu li:hover div a:hover {
  color: #FAFAFA;
  background:#99DE00;
}
#menu li ul {
  list-style:none;
  padding:0;
  margin-bottom:12px;
}  
#menu li ul li {
  float: none;
  font-size: 12px;
  line-height: 24px;
  margin: 0;
  padding: 0;
  position: relative;
  text-align: left;
  width: 100%;
}
#menu li ul li:hover {
  background: none;
  border: medium none;
  margin: 0;
  padding: 0;
}

我需要这样的效果: 结果图片示例

我尝试添加z-index,但它对我没有用。任何建议都将不胜感激。 谢谢! :)

你希望li:hover不会重叠在menu_container上吗? - user2628521
现在menu-container重叠li:hover。我需要li:hover重叠menu-container :) - spwin
4个回答

3
您可以使用如下的 :after 伪元素来实现这一点:
#menu > li:hover:after {
    content: '';
    background: yellow;
    position: absolute;
    top: 100%;
    width: 100%;
    height: 4px;
    left: 0;
    margin-top: -4px;
    z-index: 2;
}

你可以使用像span或div这样的额外元素来代替:after,并将其添加到标记中。

http://jsfiddle.net/ncqke/7/


3
问题出在堆叠顺序上。由于 li 包含 .menu-container,而且 li 已经有一个堆叠上下文,.menu-container 在其中创建了一个子上下文,因此永远无法显示在其下方。你需要做的是将 li 移出堆叠顺序,然后给 .menu-container 一个负的 z-index,以便它可以显示在其下方。但是,如果 li 的祖先没有处于堆叠上下文中,则你的 .menu-container 可能会显示在页面内容下方。因此,你应该让 li 的父元素具有一个 z-index 和相应的定位,以便将其放入堆叠顺序中。
我不确定这是否适用于 IE6/IE7。

这里是一个分支的JSFiddle,展示了更改。li不再具有z-index.menu-container现在具有负z-index;同时父级ul#menu现在被放置到堆叠顺序中,以便.menu-container不会显示在页面内容下方)


谢谢您的回复。这是一个解决方案,但它会将页面的所有内容带到.menu-container的前面; 因此我需要为整个页面添加z-index :) - spwin
感谢点赞。 :) 我已经更新了 JSFiddle 并修复了这个问题。基本上,我只是将父元素 ul#menu 放入堆叠顺序中;因此现在子元素(例如 .menu-container)不会低于 ul#menu - jsea
没错,它按预期工作了,再次感谢 :) 我认为这比添加新的伪元素更好。即使是IE也能正确显示所有内容。 - spwin
1
这里的关键是 z-index: 10; - Linga

0

背景的必要性是什么?

background: transparent url('logo.gif') no-repeat right bottom;

{{链接1:FIDDLE}}


我使用透明背景来展示问题。这不是我所需的,请看一下结果图像,无论如何谢谢 :) 我需要菜单容器顶部边框部分被li:hover覆盖。 - spwin
我现在看到了结果,让我再看一遍。 - Riskbreaker

0

使用 before 或 after 等类似的部分边框可以帮助您检查此 fiddle

   #menu .menu-container:before{
    content: '';
width: 222px;
margin-left: 64px;
height: 1px;
background: #b7b7b7;
position: absolute;
top: -0.5px;
}

http://jsfiddle.net/ncqke/9/


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