原文是司徒正美大神的,两篇文章地址如下:
http://www.cnblogs.com/rubylouvre/archive/2009/09/27/1575220.html
http://www.cnblogs.com/rubylouvre/archive/2009/09/28/1575294.html
现在发布的内容,我稍作修改,如有谬误,请回上方两文地址拜读大神原作.
--------------------------------------------------------------------------------------
首先,我们用span作为子菜单进行测试探索.
Version 1
1 <!doctype html> 2 <head> 3 <meta charset="gbk"/> 4 <meta name="keywords" content="纯CSS多级菜单 by 司徒正美" /> 5 <meta name="description" content="纯CSS多级菜单 by 司徒正美" /> 6 <title>纯CSS相册 by 司徒正美</title> 7 </head> 8 <body> 9 <style type="text/css"> 10 * { 11 margin:0; 12 padding:0; 13 font-size:12px; 14 } 15 .menu{ 16 width:100%; 17 height:32px; 18 background:#FF6600; 19 } 20 .menu li { 21 float:left; 22 list-style:none; 23 } 24 .menu a { 25 display:block; 26 position:relative; 27 height:32px;line-height:32px;text-align:center; /*前两句保证垂直居中,第三句保证水平居中*/ 28 width:100px; 29 background:#FF6600; 30 color:#6699FF; 31 text-decoration:none; 32 } 33 .menu a:hover { 34 background:#00CCCC; 35 color:#000000; 36 } 37 /*下拉菜单样式*/ 38 .menu li span { 39 display:none; 40 position:absolute; 41 left:0; 42 top:32px; 43 width:200px; 44 height:150px; 45 background:#FFCC99; 46 } 47 .menu a:hover span { 48 display:block; 49 } 50 51 </style> 52 53 <h1>纯CSS多级菜单 by 司徒正美</h1> 54 <div class="menu"> 55 <ul> 56 <li> 57 <a href="http://www.cnblogs.com/rubylouvre/"> 58 菜单一<span></span> 59 </a> 60 </li> 61 <li> 62 <a href="http://www.cnblogs.com/rubylouvre/"> 63 菜单二<span></span> 64 </a> 65 </li> 66 <li> 67 <a href="http://www.cnblogs.com/rubylouvre/"> 68 菜单三<span></span> 69 </a> 70 </li> 71 <li class="last"> 72 <a href="http://www.cnblogs.com/rubylouvre/"> 73 菜单四<span></span> 74 </a> 75 </li> 76 </ul> 77 </div> 78 </body> 79 </html>
经过测试后,发现IE6会出现子菜单不消失的情况
原因:
这是IE6特有的,就是子菜单在对应的包含块mouseout后仍不消失的问题。
hover伪类相当于moverover与moverout。我们在可以在mouseover给它的子孙元素认定一种样式,mouseout时认定另一种。
换言之,display现在在IE6无法切换(img元素除外)。
解决方法:
用visibility 代替display.
/*下拉菜单样式*/ .menu li span { /*display:none;*/ visibility:hidden; position:absolute; left:0; top:32px; width:200px; height:150px; background:#FFCC99; } .menu a:hover span { /* display:block;*/ visibility:visible; }
只需把原来的display注释掉,在下面各加一行visibility相关的CSS设置即可.
测试后,我们发现,IE6也可以了.
注意,这里的hover写到了a标签上,下拉菜单也只是用了一个简单的span,在这个状态下,我们鼠标放到二级菜单上时,它对应的一级菜单可以保持hover的样式.
-------------------------------------------------------------------------------------------------------------
在实际应用中,我们要使用<ul><li><a href=""></a></li></ul>作为子下拉菜单.所以,我们要对HTML结构进行改动.
把有关span的CSS全删掉,并在结构层原span的位置改为如下代码:
<ul> <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_11</a></li> <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_12</a></li> </ul>
修改完成后,代码暂时如下:
<!doctype html> <head> <meta charset="gbk"/> <meta name="keywords" content="纯CSS多级菜单 by 司徒正美" /> <meta name="description" content="纯CSS多级菜单 by 司徒正美" /> <title>纯CSS相册 by 司徒正美</title> </head> <body> <style type="text/css"> * { margin:0; padding:0; font-size:12px; } .menu{ width:100%; height:32px; background:#FF6600; } .menu li { float:left; list-style:none; } .menu a { display:block; position:relative; height:32px;line-height:32px;text-align:center; /*前两句保证垂直居中,第三句保证水平居中*/ width:100px; background:#FF6600; color:#6699FF; text-decoration:none; } .menu a:hover { background:#00CCCC; color:#000000; } </style> <h1>纯CSS多级菜单 by 司徒正美</h1> <div class="menu"> <ul> <li> <a href="http://www.cnblogs.com/rubylouvre/"> 菜单一 <ul> <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_11</a></li> <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_12</a></li> </ul> </a> </li> <li> <a href="http://www.cnblogs.com/rubylouvre/"> 菜单二 <ul> <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_21</a></li> <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_22</a></li> </ul> </a> </li> <li> <a href="http://www.cnblogs.com/rubylouvre/"> 菜单三 <ul> <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_31</a></li> <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_32</a></li> </ul> </a> </li> <li class="last"> <a href="http://www.cnblogs.com/rubylouvre/"> 菜单四 <ul> <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_41</a></li> <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_42</a></li> </ul> </a> </li> </ul> </div> </body> </html>
这时,我们需要作一些改变:
HTML结构方面:
我们把二级菜单部分放到a标签之外li标签之内
CSS方面:
我们把相对定位部分从a迁移到li元素上
同时给子菜单添加样式
完成修改后,代码如下:
1 <!doctype html> 2 <head> 3 <meta charset="gbk"/> 4 <meta name="keywords" content="纯CSS多级菜单 by 司徒正美" /> 5 <meta name="description" content="纯CSS多级菜单 by 司徒正美" /> 6 <title>纯CSS相册 by 司徒正美</title> 7 </head> 8 <body> 9 <style type="text/css"> 10 * { 11 margin:0; 12 padding:0; 13 font-size:12px; 14 } 15 .menu{ 16 width:100%; 17 height:32px; 18 background:#FF6600; 19 } 20 .menu li { 21 float:left; 22 list-style:none; 23 position:relative; 24 } 25 .menu a { 26 display:block; 27 /*position:relative; 28 设置此项时,在标准游览器中惨不忍睹, 29 和纯CSS相册3的第一个运行框在chrome中遇到的bug一样*/ 30 height:32px;line-height:32px;text-align:center; /*前两句保证垂直居中,第三句保证水平居中*/ 31 width:100px; 32 background:#FF6600; 33 color:#6699FF; 34 text-decoration:none; 35 } 36 .menu a:hover { 37 background:#00CCCC; 38 color:#000000; 39 } 40 /*下面是子下拉菜单部分*/ 41 .menu ul ul{ 42 visibility:hidden; /*初始为隐藏*/ 43 position:absolute; 44 left:0px; 45 top:32px; 46 } 47 48 .menu ul a:hover ul{ 49 visibility:visible; 50 } 51 52 .menu ul ul li{ 53 clear:both;/*清除li的浮动,保证垂直显示*/ 54 } 55 56 57 </style> 58 59 <h1>纯CSS多级菜单 by 司徒正美</h1> 60 <div class="menu"> 61 <ul> 62 <li> 63 <a href="http://www.cnblogs.com/rubylouvre/"> 64 菜单一 65 <ul> 66 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_11</a></li> 67 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_12</a></li> 68 </ul> 69 </a> 70 </li> 71 <li> 72 <a href="http://www.cnblogs.com/rubylouvre/"> 73 菜单二 74 <ul> 75 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_21</a></li> 76 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_22</a></li> 77 </ul> 78 </a> 79 </li> 80 <li> 81 <a href="http://www.cnblogs.com/rubylouvre/"> 82 菜单三 83 <ul> 84 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_31</a></li> 85 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_32</a></li> 86 </ul> 87 </a> 88 </li> 89 <li class="last"> 90 <a href="http://www.cnblogs.com/rubylouvre/"> 91 菜单四 92 <ul> 93 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_41</a></li> 94 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_42</a></li> 95 </ul> 96 </a> 97 </li> 98 </ul> 99 </div> 100 </body> 101 </html>
运行后,我们发现,完全失效。标准浏览器的所有元素都支持hover,而IE6只有带href的a标签才支持hover,那么,我们先把hover写到li上,先做到对标准浏览器的支持,IE6放到后面我们慢慢炮制它。
.menu ul a:hover ul{
visibility:visible;
}
改为:
.menu ul li:hover ul,/*非IE6*/
.menu ul a:hover ul{/*IE6*/
visibility:visible;
}
最终代码如下:
1 <!doctype html> 2 <head> 3 <meta charset="gbk"/> 4 <meta name="keywords" content="纯CSS多级菜单 by 司徒正美" /> 5 <meta name="description" content="纯CSS多级菜单 by 司徒正美" /> 6 <title>纯CSS相册 by 司徒正美</title> 7 </head> 8 <body> 9 <style type="text/css"> 10 * { 11 margin:0; 12 padding:0; 13 font-size:12px; 14 } 15 .menu{ 16 width:100%; 17 height:32px; 18 background:#FF6600; 19 } 20 .menu li { 21 float:left; 22 list-style:none; 23 position:relative; 24 } 25 .menu a { 26 display:block; 27 /*position:relative; 28 设置此项时,在标准游览器中惨不忍睹, 29 和纯CSS相册3的第一个运行框在chrome中遇到的bug一样*/ 30 height:32px;line-height:32px;text-align:center; /*前两句保证垂直居中,第三句保证水平居中*/ 31 width:100px; 32 background:#FF6600; 33 color:#6699FF; 34 text-decoration:none; 35 } 36 .menu a:hover { 37 background:#00CCCC; 38 color:#000000; 39 } 40 /*下面是子下拉菜单部分*/ 41 .menu ul ul{ 42 visibility:hidden; /*初始为隐藏*/ 43 position:absolute; 44 left:0px; 45 top:32px; 46 } 47 48 .menu ul li:hover ul,/*非IE6*/ 49 .menu ul a:hover ul{/*IE6*/ 50 visibility:visible; 51 } 52 53 .menu ul ul li{ 54 clear:both;/*清除li的浮动,保证垂直显示*/ 55 } 56 57 58 </style> 59 60 <h1>纯CSS多级菜单 by 司徒正美</h1> 61 <div class="menu"> 62 <ul> 63 <li> 64 <a href="http://www.cnblogs.com/rubylouvre/"> 65 菜单一 66 <ul> 67 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_11</a></li> 68 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_12</a></li> 69 </ul> 70 </a> 71 </li> 72 <li> 73 <a href="http://www.cnblogs.com/rubylouvre/"> 74 菜单二 75 <ul> 76 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_21</a></li> 77 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_22</a></li> 78 </ul> 79 </a> 80 </li> 81 <li> 82 <a href="http://www.cnblogs.com/rubylouvre/"> 83 菜单三 84 <ul> 85 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_31</a></li> 86 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_32</a></li> 87 </ul> 88 </a> 89 </li> 90 <li class="last"> 91 <a href="http://www.cnblogs.com/rubylouvre/"> 92 菜单四 93 <ul> 94 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_41</a></li> 95 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_42</a></li> 96 </ul> 97 </a> 98 </li> 99 </ul> 100 </div> 101 </body> 102 </html>
运行后,我们可以发现,二级菜单能弹出来了,但那个神秘的li元素也现形了。司徒大神说他用双重浮动的收缩包围(shrink-wrapping)现象都无法消除这个神秘的li元素。
他说参考外国的代码,方法是,把整个子菜单放到a元素的外面,然后用li:hover控制样式的切换。于是结构层改写如下:
<div class="menu"> <ul> <li> <a href="http://www.cnblogs.com/rubylouvre/">菜单一 </a> <ul> <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_11</a></li> <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_12</a></li> </ul> </li> ..... </ul> </div>
修改完成后,Version2代码:
1 <!doctype html> 2 <head> 3 <meta charset="gbk"/> 4 <meta name="keywords" content="纯CSS多级菜单 by 司徒正美" /> 5 <meta name="description" content="纯CSS多级菜单 by 司徒正美" /> 6 <title>纯CSS相册 by 司徒正美</title> 7 </head> 8 <body> 9 <style type="text/css"> 10 * { 11 margin:0; 12 padding:0; 13 font-size:12px; 14 } 15 .menu{ 16 width:100%; 17 height:32px; 18 background:#FF6600; 19 } 20 .menu li { 21 float:left; 22 list-style:none; 23 position:relative; 24 } 25 .menu a { 26 display:block; 27 /*position:relative; 28 设置此项时,在标准游览器中惨不忍睹, 29 和纯CSS相册3的第一个运行框在chrome中遇到的bug一样*/ 30 height:32px;line-height:32px;text-align:center; /*前两句保证垂直居中,第三句保证水平居中*/ 31 width:100px; 32 background:#FF6600; 33 color:#6699FF; 34 text-decoration:none; 35 } 36 .menu a:hover { 37 background:#00CCCC; 38 color:#000000; 39 } 40 /*下面是子下拉菜单部分*/ 41 .menu ul ul{ 42 visibility:hidden; /*初始为隐藏*/ 43 position:absolute; 44 left:0px; 45 top:32px; 46 } 47 48 .menu ul li:hover ul,/*非IE6*/ 49 .menu ul a:hover ul{/*IE6*/ 50 visibility:visible; 51 } 52 53 .menu ul ul li{ 54 clear:both;/*清除li的浮动,保证垂直显示*/ 55 } 56 57 58 </style> 59 60 <h1>纯CSS多级菜单 by 司徒正美</h1> 61 <div class="menu"> 62 <ul> 63 <li> 64 <a href="http://www.cnblogs.com/rubylouvre/"> 65 菜单一</a> 66 <ul> 67 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_11</a></li> 68 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_12</a></li> 69 </ul> 70 </li> 71 <li> 72 <a href="http://www.cnblogs.com/rubylouvre/"> 73 菜单二</a> 74 <ul> 75 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_21</a></li> 76 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_22</a></li> 77 </ul> 78 </li> 79 <li> 80 <a href="http://www.cnblogs.com/rubylouvre/"> 81 菜单三</a> 82 <ul> 83 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_31</a></li> 84 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_32</a></li> 85 </ul> 86 </li> 87 <li class="last"> 88 <a href="http://www.cnblogs.com/rubylouvre/"> 89 菜单四</a> 90 <ul> 91 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_41</a></li> 92 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_42</a></li> 93 </ul> 94 </li> 95 </ul> 96 </div> 97 </body> 98 </html>
运行后,我们发现,终于搞定了除IE6之外的浏览器.
由于IE6能支持的伪类少得可怜,仅支持a元素的hover与visited与active。为了让IE6显示隐藏的二级菜单,我们必须把二级菜单的那个无序列表放到a元素下,但这样一来标准浏览器阵营那边又发难了。
这时我们就要请出IE的条件注释,让页面在IE6下呈现一套结构层,在其他浏览器下呈现另一套。
下面是Version3代码:
1 <!doctype html> 2 <head> 3 <meta charset="gbk"/> 4 <meta name="keywords" content="纯CSS多级菜单 by 司徒正美" /> 5 <meta name="description" content="纯CSS多级菜单 by 司徒正美" /> 6 <title>纯CSS相册 by 司徒正美</title> 7 </head> 8 <body> 9 <style type="text/css"> 10 * { 11 margin:0; 12 padding:0; 13 font-size:12px; 14 } 15 .menu{ 16 width:100%; 17 height:32px; 18 background:#FF6600; 19 } 20 .menu li { 21 float:left; 22 list-style:none; 23 position:relative; 24 } 25 .menu a { 26 display:block; 27 /*position:relative; 28 设置此项时,在标准游览器中惨不忍睹, 29 和纯CSS相册3的第一个运行框在chrome中遇到的bug一样*/ 30 height:32px;line-height:32px;text-align:center; /*前两句保证垂直居中,第三句保证水平居中*/ 31 width:100px; 32 background:#FF6600; 33 color:#6699FF; 34 text-decoration:none; 35 } 36 .menu a:hover { 37 background:#00CCCC; 38 color:#000000; 39 } 40 /*下面是子下拉菜单部分*/ 41 .menu ul ul{ 42 visibility:hidden; /*初始为隐藏*/ 43 position:absolute; 44 left:0px; 45 top:32px; 46 } 47 48 .menu ul li:hover ul,/*非IE6*/ 49 .menu ul a:hover ul{/*IE6*/ 50 visibility:visible; 51 } 52 53 .menu ul ul li{ 54 clear:both;/*清除li的浮动,保证垂直显示*/ 55 } 56 57 58 </style> 59 60 <h1>纯CSS多级菜单 by 司徒正美</h1> 61 <div class="menu"> 62 <ul> 63 <li> 64 <a href="http://www.cnblogs.com/rubylouvre/"> 65 菜单一<!--[if !IE 6]><!--></a><!--<![endif]--> 66 <ul> 67 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_11</a></li> 68 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_12</a></li> 69 </ul> 70 <!--[if lte IE 6]></a><![endif]--> 71 </li> 72 <li> 73 <a href="http://www.cnblogs.com/rubylouvre/"> 74 菜单二<!--[if !IE 6]><!--></a><!--<![endif]--> 75 <ul> 76 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_21</a></li> 77 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_22</a></li> 78 </ul> 79 <!--[if lte IE 6]></a><![endif]--> 80 </li> 81 <li> 82 <a href="http://www.cnblogs.com/rubylouvre/"> 83 菜单三<!--[if !IE 6]><!--></a><!--<![endif]--> 84 <ul> 85 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_31</a></li> 86 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_32</a></li> 87 </ul> 88 <!--[if lte IE 6]></a><![endif]--> 89 </li> 90 <li class="last"> 91 <a href="http://www.cnblogs.com/rubylouvre/"> 92 菜单四<!--[if !IE 6]><!--></a><!--<![endif]--> 93 <ul> 94 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_41</a></li> 95 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_42</a></li> 96 </ul> 97 <!--[if lte IE 6]></a><![endif]--> 98 </li> 99 </ul> 100 </div> 101 </body> 102 </html>
这时,我们发现,除IE6以上的IE浏览器和其他浏览器都没有什么问题,而IE6不但没有弹出子下拉菜单,还在样式上仍然有那个神秘的li元素,其实,如果我们的.menu没有设置width:100%,高度未给32px,也可以解决这个问题,但是,我们在工作中,经常用到导航条100%的width。IE用hover切换绝对定位子元素时存在问题,但具体情形又分许多种,解法也不一。但针对多级菜单的这种多层子元素,最常用的方法是把它们套在table中,这相当于table布局。因为table的容错能力是最强的,这多得人们一直用它来布局,于是浏览器一直在增强它在这方面的优势。感谢table,我们终于收拾IE6这个怪胎了。为了保持多数浏览器下HTML的结构尽量简洁,我们把它写到IE注释中.
Version4代码:
1 <!doctype html> 2 <head> 3 <meta charset="gbk"/> 4 <meta name="keywords" content="纯CSS多级菜单 by 司徒正美" /> 5 <meta name="description" content="纯CSS多级菜单 by 司徒正美" /> 6 <title>纯CSS相册 by 司徒正美</title> 7 </head> 8 <body> 9 <style type="text/css"> 10 * { 11 margin:0; 12 padding:0; 13 font-size:12px; 14 } 15 .menu{ 16 width:100%; 17 height:32px; 18 background:#FF6600; 19 } 20 .menu li { 21 float:left; 22 list-style:none; 23 position:relative; 24 } 25 .menu a { 26 display:block; 27 /*position:relative; 28 设置此项时,在标准游览器中惨不忍睹, 29 和纯CSS相册3的第一个运行框在chrome中遇到的bug一样*/ 30 height:32px;line-height:32px;text-align:center; /*前两句保证垂直居中,第三句保证水平居中*/ 31 width:100px; 32 background:#FF6600; 33 color:#6699FF; 34 text-decoration:none; 35 } 36 .menu a:hover { 37 background:#00CCCC; 38 color:#000000; 39 } 40 /*下面是子下拉菜单部分*/ 41 .menu ul ul{ 42 visibility:hidden; /*初始为隐藏*/ 43 position:absolute; 44 left:0px; 45 top:32px; 46 } 47 48 .menu ul li:hover ul,/*非IE6*/ 49 .menu ul a:hover ul{/*IE6*/ 50 visibility:visible; 51 } 52 53 .menu ul ul li{ 54 clear:both;/*清除li的浮动,保证垂直显示*/ 55 } 56 57 58 </style> 59 60 <h1>纯CSS多级菜单 by 司徒正美</h1> 61 <div class="menu"> 62 <ul> 63 <li> 64 <a href="http://www.cnblogs.com/rubylouvre/"> 65 菜单一 66 <!--[if !IE 6]><!--></a><!--<![endif]--> 67 <!--[if lte IE 6]><table><tr><td><![endif]--> 68 <ul> 69 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_11</a></li> 70 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_12</a></li> 71 </ul> 72 <!--[if lte IE 6]></td></tr></table></a><![endif]--> 73 </li> 74 <li> 75 <a href="http://www.cnblogs.com/rubylouvre/"> 76 菜单二 77 <!--[if !IE 6]><!--></a><!--<![endif]--> 78 <!--[if lte IE 6]><table><tr><td><![endif]--> 79 <ul> 80 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_21</a></li> 81 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_22</a></li> 82 </ul> 83 <!--[if lte IE 6]></td></tr></table></a><![endif]--> 84 </li> 85 <li> 86 <a href="http://www.cnblogs.com/rubylouvre/"> 87 菜单三 88 <!--[if !IE 6]><!--></a><!--<![endif]--> 89 <!--[if lte IE 6]><table><tr><td><![endif]--> 90 <ul> 91 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_31</a></li> 92 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_32</a></li> 93 </ul> 94 <!--[if lte IE 6]></td></tr></table></a><![endif]--> 95 </li> 96 <li> 97 <a href="http://www.cnblogs.com/rubylouvre/"> 98 菜单四 99 <!--[if !IE 6]><!--></a><!--<![endif]--> 100 <!--[if lte IE 6]><table><tr><td><![endif]--> 101 <ul> 102 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_41</a></li> 103 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_42</a></li> 104 </ul> 105 <!--[if lte IE 6]></td></tr></table></a><![endif]--> 106 </li> 107 </ul> 108 </div> 109 </body> 110 </html>
运行之后,我们发现,IE6基本正常,但是,同时我们应该留意到IE6水平菜单的异常高度,这是IE6的li元素在包含块级显示元素时会多出5px空隙。由于li元素包含的结构比较复杂,以前用对付img元素的几种方法行不通了。我们可以显式设置a元素的高度,让多余的部分隐藏掉就是。这就唯一不用CSS hack的方法。在.menu a{}是添加overflow:hidden;
Version5代码如下:
1 <!doctype html> 2 <head> 3 <meta charset="gbk"/> 4 <meta name="keywords" content="纯CSS多级菜单 by 司徒正美" /> 5 <meta name="description" content="纯CSS多级菜单 by 司徒正美" /> 6 <title>纯CSS相册 by 司徒正美</title> 7 </head> 8 <body> 9 <style type="text/css"> 10 * { 11 margin:0; 12 padding:0; 13 font-size:12px; 14 } 15 .menu{ 16 width:100%; 17 height:32px; 18 background:#FF6600; 19 } 20 .menu li { 21 float:left; 22 list-style:none; 23 position:relative; 24 } 25 .menu a { 26 display:block; 27 /*position:relative; 28 设置此项时,在标准游览器中惨不忍睹, 29 和纯CSS相册3的第一个运行框在chrome中遇到的bug一样*/ 30 height:32px;line-height:32px;text-align:center; /*前两句保证垂直居中,第三句保证水平居中*/ 31 width:100px; 32 background:#FF6600; 33 color:#6699FF; 34 text-decoration:none; 35 overflow:hidden; 36 } 37 .menu a:hover { 38 background:#00CCCC; 39 color:#000000; 40 } 41 /*下面是子下拉菜单部分*/ 42 .menu ul ul{ 43 visibility:hidden; /*初始为隐藏*/ 44 position:absolute; 45 left:0px; 46 top:32px; 47 } 48 49 .menu ul li:hover ul,/*非IE6*/ 50 .menu ul a:hover ul{/*IE6*/ 51 visibility:visible; 52 } 53 54 .menu ul ul li{ 55 clear:both;/*清除li的浮动,保证垂直显示*/ 56 } 57 58 59 </style> 60 61 <h1>纯CSS多级菜单 by 司徒正美</h1> 62 <div class="menu"> 63 <ul> 64 <li> 65 <a href="http://www.cnblogs.com/rubylouvre/"> 66 菜单一 67 <!--[if !IE 6]><!--></a><!--<![endif]--> 68 <!--[if lte IE 6]><table><tr><td><![endif]--> 69 <ul> 70 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_11</a></li> 71 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_12</a></li> 72 </ul> 73 <!--[if lte IE 6]></td></tr></table></a><![endif]--> 74 </li> 75 <li> 76 <a href="http://www.cnblogs.com/rubylouvre/"> 77 菜单二 78 <!--[if !IE 6]><!--></a><!--<![endif]--> 79 <!--[if lte IE 6]><table><tr><td><![endif]--> 80 <ul> 81 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_21</a></li> 82 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_22</a></li> 83 </ul> 84 <!--[if lte IE 6]></td></tr></table></a><![endif]--> 85 </li> 86 <li> 87 <a href="http://www.cnblogs.com/rubylouvre/"> 88 菜单三 89 <!--[if !IE 6]><!--></a><!--<![endif]--> 90 <!--[if lte IE 6]><table><tr><td><![endif]--> 91 <ul> 92 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_31</a></li> 93 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_32</a></li> 94 </ul> 95 <!--[if lte IE 6]></td></tr></table></a><![endif]--> 96 </li> 97 <li> 98 <a href="http://www.cnblogs.com/rubylouvre/"> 99 菜单四 100 <!--[if !IE 6]><!--></a><!--<![endif]--> 101 <!--[if lte IE 6]><table><tr><td><![endif]--> 102 <ul> 103 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_41</a></li> 104 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_42</a></li> 105 </ul> 106 <!--[if lte IE 6]></td></tr></table></a><![endif]--> 107 </li> 108 </ul> 109 </div> 110 </body> 111 </html>
这次运行后,IE6的问题完美解决。
以上面这个版本为基本,我们可以一直扩展到多级菜单,下面给出《HTML+CSS兼容IE6,IE8的十级菜单代码》:
1 <!doctype html> 2 <head> 3 <meta charset="gbk"/> 4 <meta name="keywords" content="纯CSS多级菜单 by 司徒正美" /> 5 <meta name="description" content="纯CSS多级菜单 by 司徒正美" /> 6 <title>纯CSS相册 by 司徒正美</title> 7 </head> 8 <body> 9 <style type="text/css"> 10 * { 11 margin:0; 12 padding:0; 13 font-size:12px; 14 } 15 .menu{ 16 width:100%; 17 height:32px; 18 background:#FF6600; 19 } 20 .menu li { 21 float:left; 22 list-style:none; 23 position:relative; 24 } 25 .menu a { 26 display:block; 27 /*position:relative; 28 设置此项时,在标准游览器中惨不忍睹, 29 和纯CSS相册3的第一个运行框在chrome中遇到的bug一样*/ 30 height:32px;line-height:32px;text-align:center; /*前两句保证垂直居中,第三句保证水平居中*/ 31 width:100px; 32 background:#FF6600; 33 color:#6699FF; 34 text-decoration:none; 35 overflow:hidden; 36 } 37 .menu a:hover { 38 background:#00CCCC; 39 color:#000000; 40 } 41 /*下面是子下拉菜单部分*/ 42 .menu ul ul{ 43 visibility:hidden; /*初始为隐藏*/ 44 position:absolute; 45 left:0px; 46 top:32px; 47 } 48 49 /*指定是显示二级子菜单*/ 50 .menu ul li:hover ul.second,/*非IE6*/ 51 .menu ul a:hover ul.second{/*IE6*/ 52 visibility:visible; 53 } 54 55 .menu ul ul li { 56 clear:both;/*垂直显示*/ 57 text-align:left; 58 } 59 .menu .third, .menu .fourth,.menu .fifth,.menu .sixth,.menu .seventh,.menu .eigth,.menu .ninth,.menu .tenth{/*6级菜单*/ 60 top:0px;/*重设子菜单相对于包含块哪个位置出现*/ 61 left:100px; 62 } 63 /*指定是显示三级子菜单*/ 64 .menu ul ul li:hover ul.third, 65 .menu ul ul a:hover ul.third{ 66 visibility:visible; 67 } 68 /*指定是显示四级子菜单*/ 69 .menu ul ul ul li:hover ul.fourth, 70 .menu ul ul ul a:hover ul.fourth{ 71 visibility:visible; 72 } 73 /*指定是显示五级子菜单*/ 74 .menu ul ul ul ul li:hover ul.fifth, 75 .menu ul ul ul ul a:hover ul.fifth{ 76 visibility:visible; 77 } 78 /*指定是显示六级子菜单*/ 79 .menu ul ul ul ul ul li:hover ul.sixth, 80 .menu ul ul ul ul ul a:hover ul.sixth{ 81 visibility:visible; 82 } 83 84 /*指定是显示七级子菜单*/ 85 .menu ul ul ul ul ul ul li:hover ul.seventh, 86 .menu ul ul ul ul ul ul a:hover ul.seventh{ 87 visibility:visible; 88 } 89 90 /*指定是显示八级子菜单*/ 91 .menu ul ul ul ul ul ul ul li:hover ul.eigth, 92 .menu ul ul ul ul ul ul ul a:hover ul.eigth{ 93 visibility:visible; 94 } 95 96 /*指定是显示九级子菜单*/ 97 .menu ul ul ul ul ul ul ul ul li:hover ul.ninth, 98 .menu ul ul ul ul ul ul ul ul a:hover ul.ninth{ 99 visibility:visible; 100 } 101 102 /*指定是显示十级子菜单*/ 103 .menu ul ul ul ul ul ul ul ul ul li:hover ul.tenth, 104 .menu ul ul ul ul ul ul ul ul ul a:hover ul.tenth{ 105 visibility:visible; 106 } 107 108 .menu table{ 109 border-collapse:collapse; 110 } 111 112 113 </style> 114 115 <h1>纯CSS多级菜单 by 司徒正美</h1> 116 <div class="menu"> 117 <ul> 118 <li> 119 <a href="http://www.cnblogs.com/rubylouvre/"> 120 菜单一 121 <!--[if !IE 6]><!--></a><!--<![endif]--> 122 <!--[if lte IE 6]><table><tr><td><![endif]--> 123 <ul class="second"> 124 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_11</a></li> 125 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_12</a></li> 126 </ul> 127 <!--[if lte IE 6]></td></tr></table></a><![endif]--> 128 </li> 129 <li> 130 <a href="http://www.cnblogs.com/rubylouvre/"> 131 菜单二 132 <!--[if !IE 6]><!--></a><!--<![endif]--> 133 <!--[if lte IE 6]><table><tr><td><![endif]--> 134 <ul class="second"> 135 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_21</a></li> 136 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_21</a></li> 137 <li><a href="http://www.cnblogs.com/rubylouvre/"> 138 二级菜单_22 139 <!--[if !IE 6]><!--></a><!--<![endif]--> 140 <!--[if lte IE 6]><table><tr><td><![endif]--> 141 <ul class="third"> 142 <li><a href="http://www.cnblogs.com/rubylouvre/">三级菜单31</a></li> 143 <li> 144 <a href="http://www.cnblogs.com/rubylouvre/"> 145 三级菜单_32 146 <!--[if !IE 6]><!--></a><!--<![endif]--> 147 <!--[if lte IE 6]><table><tr><td><![endif]--> 148 <ul class="fourth"> 149 <li><a href="http://www.cnblogs.com/rubylouvre/">四级菜单_41</a></li> 150 <li><a href="http://www.cnblogs.com/rubylouvre/">四级菜单_41</a></li> 151 <li><a href="http://www.cnblogs.com/rubylouvre/">四级菜单_41</a></li> 152 <li> 153 <a href="http://www.cnblogs.com/rubylouvre/"> 154 四级菜单_42 155 <!--[if !IE 6]><!--></a><!--<![endif]--> 156 <!--[if lte IE 6]><table><tr><td><![endif]--> 157 <ul class="fifth"> 158 <li><a href="http://www.cnblogs.com/rubylouvre/">五级菜单_51</a></li> 159 <li> 160 <a href="http://www.cnblogs.com/rubylouvre/"> 161 五级菜单_52 162 <!--[if !IE 6]><!--></a><!--<![endif]--> 163 <!--[if lte IE 6]><table><tr><td><![endif]--> 164 <ul class="sixth"> 165 <li><a href="http://www.cnblogs.com/rubylouvre/">六级菜单_61</a></li> 166 <li> 167 <a href="http://www.cnblogs.com/rubylouvre/"> 168 六级菜单_62 169 <!--[if !IE 6]><!--></a><!--<![endif]--> 170 <!--[if lte IE 6]><table><tr><td><![endif]--> 171 <ul class="seventh"> 172 <li><a href="http://www.cnblogs.com/rubylouvre/">七级菜单_71</a></li> 173 <li> 174 <a href="http://www.cnblogs.com/rubylouvre/"> 175 七级菜单_72 176 <!--[if !IE 6]><!--></a><!--<![endif]--> 177 <!--[if lte IE 6]><table><tr><td><![endif]--> 178 <ul class="eigth"> 179 <li><a href="http://www.cnblogs.com/rubylouvre/">八级菜单_81</a></li> 180 <li> 181 <a href="http://www.cnblogs.com/rubylouvre/"> 182 八级菜单_82 183 <!--[if !IE 6]><!--></a><!--<![endif]--> 184 <!--[if lte IE 6]><table><tr><td><![endif]--> 185 <ul class="ninth"> 186 <li><a href="http://www.cnblogs.com/rubylouvre/">九级菜单_91</a></li> 187 <li> 188 <a href="http://www.cnblogs.com/rubylouvre/"> 189 九级菜单_92 190 <!--[if !IE 6]><!--></a><!--<![endif]--> 191 <!--[if lte IE 6]><table><tr><td><![endif]--> 192 <ul class="tenth"> 193 <li><a href="http://www.cnblogs.com/rubylouvre/">十级菜单_10_1</a></li> 194 <li> 195 <a href="http://www.cnblogs.com/rubylouvre/">十级菜单_10_2</a></li> 196 </ul> 197 <!--[if lte IE 6]></td></tr></table></a><![endif]--> 198 </li> 199 </ul> 200 <!--[if lte IE 6]></td></tr></table></a><![endif]--> 201 </li> 202 </ul> 203 <!--[if lte IE 6]></td></tr></table></a><![endif]--> 204 </li> 205 </ul> 206 <!--[if lte IE 6]></td></tr></table></a><![endif]--> 207 </li> 208 </ul> 209 <!--[if lte IE 6]></td></tr></table></a><![endif]--> 210 </li> 211 </ul> 212 <!--[if lte IE 6]></td></tr></table></a><![endif]--> 213 </li> 214 </ul> 215 <!--[if lte IE 6]></td></tr></table></a><![endif]--> 216 </li> 217 </ul> 218 <!--[if lte IE 6]></td></tr></table></a><![endif]--> 219 </li> 220 </ul> 221 <!--[if lte IE 6]></td></tr></table></a><![endif]--> 222 </li> 223 <li> 224 <a href="http://www.cnblogs.com/rubylouvre/"> 225 菜单三 226 <!--[if !IE 6]><!--></a><!--<![endif]--> 227 <!--[if lte IE 6]><table><tr><td><![endif]--> 228 <ul class="second"> 229 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_31</a></li> 230 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_32</a></li> 231 </ul> 232 <!--[if lte IE 6]></td></tr></table></a><![endif]--> 233 </li> 234 <li> 235 <a href="http://www.cnblogs.com/rubylouvre/"> 236 菜单四 237 <!--[if !IE 6]><!--></a><!--<![endif]--> 238 <!--[if lte IE 6]><table><tr><td><![endif]--> 239 <ul class="second"> 240 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_41</a></li> 241 <li><a href="http://www.cnblogs.com/rubylouvre/">二级菜单_42</a></li> 242 </ul> 243 <!--[if lte IE 6]></td></tr></table></a><![endif]--> 244 </li> 245 </ul> 246 </div> 247 </body> 248 </html>