我设计了一个导航菜单,它可以在Chrome,Firefox和IE8上正常运行。
似乎在IE7上无法正常工作,<li>
的边距和大小太小,子菜单没有完整显示,并且#background
也丢失了。
它的外观应与Chrome和Firefox相同。
请参见示例:http://jsfiddle.net/FFWfp/
如何解决这个问题?
的HTML
<div id="background">
<div class="nav-block">
<ul id="nav">
<li><a class="active" href="/">Home</a></li>
<li>
<a href="/">Category</a>
<ul class='subnav'>
<li><a href='#'>PHP </a></li>
<li><a href='#'>HTML</a></li>
<li><a href='#'>CSS</a></li>
</ul>
</li>
<li>
<a href="/">Account</a>
<ul class='subnav'>
<li><a href='#'>One</a></li>
<li><a href='#'>Two</a></li>
<li><a href='#'>Three</a></li>
</ul>
</li>
<li><a href="/admin/reports">Logout</a></li>
</ul>
</div>
</div>
的CSS
<style>
#background {
background-color:#EBE9E1;
overflow:hidden;
}
.nav-block{
background-color:black;
height:50px;
}
#nav {
padding:12px;
list-style:none;
}
#nav li{
display:inline;
margin:0 1px 0 -1px;
padding:3px 15px;
float:left;
font-size:14px;
}
#nav a {
background-color:white;
color:#C51721;
padding:10px;
text-decoration: none;
}
#nav .subnav {
padding:0px;
list-style:none;
width:130px;
border-right: 2px solid black;
border-bottom: 2px solid black;
border-left: 2px solid black;
color:#000000;
margin-top:9px;
margin-left:-2px;
background-color:white;
}
#nav .subnav li {
padding:0px;
float: none;
width:100px;
color:#000000;
margin:0px;
}
#nav .subnav li a {
padding:3px;
padding-left:10px;
display:block;
background-color:white;
color:#C51721;
text-decoration: none;
border-bottom:1px solid #DEDEDE;
}
</style>
最佳答案
这应该是简单的,clearfix的,包含浮点等等。但这不是复合的hasLayout错误,这是罕见的情况,其中您需要删除haslayout,但是不可能这样做。
编写代码的方式(顺便说一句没错!)表示#background div
需要hasLayout包含浮动的子代(即使尝试额外的clearing元素也不起作用,这会显示出IE错误。)您的代码使用overflow : hidden;
进行了此操作,但是由于50px的高度在.nav-block
上具有hasLayout,因此该高度在IE7中就是“包含”的-这当然是错误的,因为浮动列表是#background
的子元素也是如此..但是,由于错误,hasLayout甚至可以包含浮点数,因此争论规范没有用!
我尝试了所有我知道的技巧,但最简单的方法是重写代码,并在可能的情况下避免使用hasLayout,而改用边距和行高-因此我反转了两个包含块的颜色。我将background
设为黑色,将.nav-block
设为灰色,并为背景设置了50px的顶部填充,以制作黑色条形。然后,我将位于灰色位内的菜单移动了43px,顶部空白为负值。这是43像素,因为在您的示例中,我以50像素测量黑条;顶部链接的高度为36px,这意味着要使它们在黑条上垂直居中,因此需要50px-36px = 14px / 2 = 7px
顶部和底部的“间距”。
然后.nav-block
div必须是用来容纳浮动子元素的div,但是overflow: hidden
现在由于负的上边距将无法工作,它将隐藏顶部的链接!因此,我将其向左浮动,并使其宽度为100%;这是创建新的块格式上下文并为IE提供所需的hasLayout而不剪切内容的另一种方法。
那么我几乎会遵循您为实现顶部短链接和全宽度(130px)子链接所做的操作,这些子链接仅使顶部链接浮动,这样它们就会“ shinkwrap”-如果子列表上没有浮动,则子链接可以设为,因此它们采用display: block
的完整宽度。对于顶部链接的高度,IE同时需要行高和填充,但是子链接上的ul
就足够了,因为line-height
Example Fiddle
HTML与上面的相同。
CSS:
html, body {margin: 0; padding: 0;}
#background { /* black bar */
background: #000;
padding: 50px 0 0 0;
}
.nav-block {
background: #EBE9E1;
float: left;
width: 100%;
padding-bottom: 3px;
}
#nav, #nav ul {
margin: 0;
padding: 0;
list-style:none;
}
#nav { /* black bar = 50px, top links = 36px, difference = 14px, = 7px from top */
margin-top: -43px;
}
#nav ul {
width:130px;
border-right: 2px solid black;
border-bottom: 2px solid black;
border-left: 2px solid black;
margin-left:-2px;
}
#nav > li { /* top links only */
float: left;
margin: 0 0 0 30px;
}
#nav a {
line-height: 36px;
background-color:white;
color:#C51721;
padding: 10px;
text-decoration: none;
}
#nav ul a { /* child list links */
display: block;
padding: 0 10px;
line-height: 24px;
border-bottom:1px solid #DEDEDE;
}