2007-11
09

探究纯粹的CSS下拉菜单

鼠标悬停下拉菜单在网页中很常见,一般的下拉菜单都是通过 javascript 对菜单的显示和隐藏进行控制,其实用纯粹的 css 也可以实现。用 css 的几点好处是,不需要考虑客户端浏览器是否禁用了 js,而且用 css 实现下拉菜单效率比 js 要高,还可以方便地制定样式和定位。我查阅了一些资料,用纯粹的 css 实现了下拉菜单,并且支持 IE6,分享给需要的朋友。

首先写出 html 代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
<title>css下拉菜单</title>
    
<link rel="stylesheet" type="text/css" href="test.css" />
</head>
<body>
    
<ul id="navigation">
        
<li>
            
<a href="#"><h3>栏目1</h3></a>
            
<ul>
                
<li><a href="#">栏目1-->菜单1</a></li>
                
<li><a href="#">栏目1-->菜单2</a></li>
                
<li><a href="#">栏目1-->菜单3</a></li>
                
<li><a href="#">栏目1-->菜单4</a></li>
            
</ul>
        
</li>
        
<li>
            
<a href="#"><h3>栏目2</h3></a>
            
<ul>
                
<li><a href="#">栏目2-->菜单1</a></li>
                
<li><a href="#">栏目2-->菜单2</a></li>
                
<li><a href="#">栏目2-->菜单3</a></li>
                
<li><a href="#">栏目2-->菜单4</a></li>
                
<li><a href="#">栏目2-->菜单5</a></li>
            
</ul>
        
</li>
        
<li>
            
<a href="#"><h3>栏目3</h3></a>
            
<ul>
                
<li><a href="#">栏目3-->菜单1</a></li>
                
<li><a href="#">栏目3-->菜单2</a></li>
                
<li><a href="#">栏目3-->菜单3</a></li>
            
</ul>
        
</li>
    
</ul>
</body>
</html>

在没有 css 的情况下,它显示为一个最基本的无序列表的样式:

无序列表

下面编写 css,代码如下:

body {
    
font-family:verdana, sans-serif;
    
font-size:small;
}
#navigation , #navigation li ul{
    
padding:0;
    
margin:0;
    
list-style-type: none;
}
#navigation li {
    
float:left;
    
text-align:center;
    
position:relative;
}
#navigation h3 {
    
margin:0;
}
#navigation li a:link, #navigation li a:visited {
    
display:block;
    
text-decoration:none;
    
color:#000;
    
width:120px;
    
height:40px;
    
line-height:40px;
    
border:1px solid #fff;
    
border-width:1px 1px 0 0;
    
background:#c5dbf2;
    
padding-left:10px;
}
#navigation li ul {
    
display: none;
}
 
/
* 以下只支持非IE6浏览器 */
#navigation li:hover a {
    
color:#fff;
    
background:#2687eb;
}
#navigation li:hover ul {
    
display:block;
    
position:absolute;
    
top:40px;
    
margin-top:1px;
    
left:0;
    
width:120px;
}
#navigation li:hover ul li a {
    
display:block;
    
background:#c5dbf2;
    
color:#000;
    
height:20px;
    
line-height:20px;
    
padding:5px 10px;
    
width:110px;
}
#navigation li:hover ul li a:hover {
    
color:#fff;
    
background:#6b839c;
}

把 css 引入页面后,下拉菜单就做好了,效果是这样的(鼠标停在“栏目1”上的效果):

下拉菜单

你可能注意到了,我在 css 代码中使用了 li:hover 这个伪类选择器,这在 firefox、opera 等浏览器中都没有问题,但是有一个很严重的问题就是:在 IE6 中,hover 伪类仅可用于 a 对象,li:hover 在 IE6 中是无效的。所以,这个下拉并没有在 IE6 中实现,我们需要针对 IE6 作出一些改进。既然它只支持 a:hover,那我们就想办法把需要控制的下拉菜单写进 <a></a> 标签中。

改进后的 html 代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
<title>css下拉菜单</title>
    
<!--[if IE 7]><!--><link rel="stylesheet" type="text/css" href="test.css" /><!--<![endif]-->
    
<!--[if lte IE 6]><link rel="stylesheet" type="text/css" href="testforIE.css" /><![endif]-->
</head>
<body>
    
<ul id="navigation">
        
<li>
            
<a href="#"><h3>栏目1</h3>
                
<!--[if IE 7]><!-->
                
</a>
                
<!--<![endif]-->
            
<table><tr><td>
            
<ul>
                
<li><a href="#">栏目1-->菜单1</a></li>
                
<li><a href="#">栏目1-->菜单2</a></li>
                
<li><a href="#">栏目1-->菜单3</a></li>
                
<li><a href="#">栏目1-->菜单4</a></li>
            
</ul>
            
</td></tr></table>
            
<!--[if lte IE 6]>
            </a>
            <![endif]-->

        
</li>
        
<li>
            
<a href="#"><h3>栏目2</h3><!--[if IE 7]><!-->
                
</a>
                
<!--<![endif]-->
            
<table><tr><td>
            
<ul>
                
<li><a href="#">栏目2-->菜单1</a></li>
                
<li><a href="#">栏目2-->菜单2</a></li>
                
<li><a href="#">栏目2-->菜单3</a></li>
                
<li><a href="#">栏目2-->菜单4</a></li>
                
<li><a href="#">栏目2-->菜单5</a></li>
            
</ul>
            
</td></tr></table>
            
<!--[if lte IE 6]>
            </a>
            <![endif]-->

        
</li>
        
<li>
            
<a href="#"><h3>栏目3</h3><!--[if IE 7]><!-->
                
</a>
                
<!--<![endif]-->
            
<table><tr><td>
            
<ul>
                
<li><a href="#">栏目3-->菜单1</a></li>
                
<li><a href="#">栏目3-->菜单2</a></li>
                
<li><a href="#">栏目3-->菜单3</a></li>
            
</ul>
            
</td></tr></table>
            
<!--[if lte IE 6]>
            </a>
            <![endif]-->

        
</li>
    
</ul>
</body>
</html>

针对 IE6 的 css 代码如下:

body {
    
font-family:verdana, sans-serif;
    
font-size:small;
}
#navigation , #navigation li ul{
    
padding:0;
    
margin:0;
    
list-style-type: none;
}
#navigation li {
    
float:left;
    
text-align:center;
    
position:relative;
}
#navigation li h3 {
    
margin:0;
}
#navigation li a:link, #navigation li a:visited {
    
display:block;
    
text-decoration:none;
    
color:#000;
    
width:120px;
    
height:40px;
    
line-height:40px;
    
border:1px solid #fff;
    
border-width:1px 1px 0 0;
    
background:#c5dbf2;
    
padding-left:10px;
}
#navigation li ul{
    
display: none;
}
table {
    
margin:-1px;
    
border-collapse:collapse;
}
/
* 以下针对IE6 */
#navigation li a:hover {
    
color:#fff;
    
background:#2687eb;
}
#navigation li a:hover ul {
    
display:block;
    
position:absolute;
    
top:40px;
    
margin-top:1px;
    
left:0;
    
width:120px;
}
#navigation li a:hover ul li a {
    
display:block;
    
background:#c5dbf2;
    
color:#000;
    
height:20px;
    
line-height:20px;
    
padding:5px 10px;
    
width:110px;
}
#navigation li a:hover ul li a:hover {
    
color:#fff;
    
background:#6b839c;
}

改进之后已经达到了我们预期的目的,在多种浏览器中都实现了鼠标悬停下拉菜单,可以在这里查看演示效果。

改进的地方主要有:针对 IE6 重新写了一个 css,命名为 testforIE.css;通过 IE 和非 IE 浏览器的条件注释 <!–[if lte IE 6]><![endif]–> 实现了针对不同的浏览器设定 <a></a> 标签不同的结束位置,从而可以在 IE6 中通过 a:hover 来控制下拉菜单;把下拉菜单的 <ul> 放在了一个只有一行一列的表格中,因为我目前发现只有这样才可以在 IE6 中正常显示,具体的原因还不是很清楚。

到此,用纯 css 实现的下拉菜单就制作完成了,这些都是我在网上查阅了一些资料后总结出来的,欢迎交流,希望高手指教。

7 条评论(我有话要说

  1. sofish @2007-11-09 22:23

    晕,用截图的方式…怎么用,有空发个email给我啊,要这个东东,哈哈,我正准备用呢…

    [回复]

  2. sofish @2007-11-10 00:22

    OK了,哈哈…先收藏了,改天来改…但还需要css代码..

    [回复]

  3. 小胖 @2007-11-10 11:02

    @sofish css代码不是写出来了吗?代码不是截图……

    [回复]

  4. 刘涛 @2007-11-11 12:01

    弄的还不错

    [回复]

  5. yunyuaner @2007-11-18 16:12

    不错,来支持一下

    [回复]

  6. zEUS. @2007-12-20 20:40

    值得研究!
    之前就一直没弄出来再 IE6 下的效果…

    [回复]

  7. 小胖 @2007-12-20 21:05

    @zEUS 恩,这个最主要的就是通过一点小技巧解决了在IE6下的问题

    [回复]

发表评论