CSS兩種實現下拉菜單的方法


CSS偽類的一個非常重要的應用就是下拉菜單。

最近在學習中發現網上純粹用CSS實現的下拉菜單主要有兩種思路:一種是通過visibility屬性的切換,另一種是基於display屬性的切換。二者在大體的結構上是一致的,只是對於二級子菜單的隱藏和顯示的實現策略上有所不同。

下拉菜單的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="nav1.css" /> -->
<!-- <link rel="stylesheet" type="text/css" href="nav2.css" /> -->
</head>

<body>
<div class="menu">
<ul>
<li>
<a href="#">menu_0</a>
<ul>
<li><a href="#">item_0</a></li>
<li><a href="#">item_1</a></li>
<li><a href="#">item_2</a></li>
<li><a href="#">item_3</a></li>
<li><a href="#">item_4</a></li>
</ul>
</li>
<li>
<a href="#">menu_1</a>
<ul>
<li><a href="#">item_5</a></li>
<li><a href="#">item_6</a></li>
<li><a href="#">item_7</a></li>
<li><a href="#">item_8</a></li>
<li><a href="#">item_9</a></li>
</ul>
</li>
<li>
<a href="#">menu_2</a>
<ul>
<li><a href="#">item_10</a></li>
<li><a href="#">item_11</a></li>
<li><a href="#">item_12</a></li>
<li><a href="#">item_13</a></li>
<li><a href="#">item_14</a></li>
</ul>
</li>
<li>
<a href="#">menu_3</a>
<ul>
<li><a href="#">item_15</a></li>
<li><a href="#">item_16</a></li>
<li><a href="#">item_17</a></li>
<li><a href="#">item_18</a></li>
<li><a href="#">item_19</a></li>
</ul>
</li>
<li>
<a href="#">menu_4</a>
<ul>
<li><a href="#">item_20</a></li>
<li><a href="#">item_21</a></li>
<li><a href="#">item_22</a></li>
<li><a href="#">item_23</a></li>
<li><a href="#">item_24</a></li>
</ul>
</li>
</ul>
</div>
<div style="clear: left;">Content!</div>
</body>
</html>

在不添加CSS的情況下,下拉菜單實際上就是二級無序列表。在CSS中通過對子列表的隱藏與顯示的操作來達到下拉的效果。

 

兩種實現下拉的方法的共同點在於:

1.        必須將最外層的ul元素的padding屬性設為0,以保證整個下拉菜單中的沒有無序列表中的自動縮進。同時,將list-style-type設為none,以去除列表項前的標記。

2.        如果主菜單需要橫向,則需要把li元素設置為浮動元素,即float: left。

3.        使二級子菜單呈一列的方法是將二級列表的ul元素和li元素設置為相同的寬度。

4.        必須把二級列表的ul元素的position屬性為absolute,以保證將該元素及其子元素從文件流中去除,這樣一來當二級菜單顯示的時候不會影響下面的其它元素。

5.        下拉菜單后面的頁面元素,需要把clear屬性設置為left或者both。這是因為下拉菜單被設為了浮動元素,如果不這樣做的話后面的頁面元素的位置將會不恰當。

6.        需要通過偽類:link、:visited以及:hover來設置元素有焦點和沒有焦點時的顏色狀態等。

 

不同點如前所述,即是:當一級菜單項沒有焦點的時候,方法一會把二級菜單的ul元素的visibility屬性設為hidden,使整個二級菜單不可見;當有焦點的時候,需要把相應的二級菜單的visibility屬性改為visible,使其可見。而方法二則將需要不可見的二級菜單ul元素的display元素設為none,當需要可見的時候改為block。

上述狀態的切換均通過偽類來完成而不調用JavaScript。

 

詳細代碼如下:

nav1.css(通過切換visibility屬性)

.menu {  
font-family
: Arial, Helvetica, sans-serif;
width
: 455px;
margin
: 0 auto;
}

.menu ul
{
padding
: 0;
list-style-type
: none;
}

.menu ul li
{
float
: left;
width
: 90px;
text-align
: center;
line-height
: 30px;
background
: #FC0;
border
: #fff 1px solid;
border-width
: 0 1px 0 0;

}

.menu ul li a:link, .menu ul li a:visited
{
text-decoration
: none;
color
: #000;
}

.menu ul li:hover
{
background
: #F60;
}

.menu ul li:hover a
{
color
: #fff;
}

.menu ul li ul
{
visibility
: hidden;
position
: absolute;
width
: 90px;
}

.menu ul li:hover ul li
{
visibility
: visible;
background
: #F96;
color
: #000;
width
: 90px;
}

.menu ul li ul li a:link, .menu ul li ul li a:visited
{
color
: #000;
}

.menu ul li ul li:hover
{
background
: #39F;
}

 

nav2.css(通過切換display屬性)

.menu {  
font-family
: Georgia, "Times New Roman", Times, serif;
margin
: 0 auto;
width
: 505px;
}

.menu ul
{
padding
: 0;
list-style-type
: none;
}

.menu ul li
{
float
: left;
}

.menu ul li a:link, .menu ul li a:visited
{
background
: #3CF;
color
: #000;
text-decoration
: none;
display
: block;
width
: 100px;
height
: 30px;
text-align
: center;
}

.menu ul li:hover a
{
background
: #009;
color
: #fff;
font-weight
: bold;
}

.menu ul li ul
{
display
: none;
}

.menu ul li:hover ul
{
display
: block;
width
: 100px;
position
: absolute;
}

.menu ul li ul li a:link, .menu ul li ul li a:visited
{
background
: #6FF;
color
: #000;
}

.menu ul li ul li:hover a
{
background
: #60F;
color
: #F60;
font-weight
: bold;
}

 

二者在效果上並沒有多大區別,個人感覺切換display屬性的方法比較方便,而且將其擴展到三級下拉菜單也更簡單。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM