來自微軟的純CSS下拉式功能表

來源:互聯網
上載者:User

結合JavaScript的下拉式功能表,純CSS的下拉式功能表我也寫過很多了。不過在微軟 Microsoft Expression Web 的相關網站上看到這個純CSS下拉式功能表的時候,我還是覺得很讚賞。這應該是最精簡、最乾淨的純CSS下拉式功能表了。

先看一下效果(這是我重新實現的):

下面是實現方法:

首先是菜單的XHTML代碼:

<ul>  <li><a href="#">菜單一</a></li>  <li><a href="#">菜單二</a>    <ul>      <li><a href="#">子功能表一</a></li>      <li><a href="#">子功能表二</a></li>      <li><a href="#">子功能表三</a></li>    </ul>  </li>  <li><a href="#">菜單三</a></li>  <li><a href="#">菜單四</a>    <ul>      <li><a href="#">子功能表一</a></li>      <li><a href="#">子功能表二</a></li>      <li><a href="#">子功能表三</a></li>    </ul>  </li>  <li><a href="#">菜單五</a></li></ul>

 

不設定任何CSS類,實在是乾淨到極點了(當然,考慮到實際應用的複雜性,我估計你不可能真的什麼都不加。要麼把這段代碼放到一個特定的容器裡,要麼給第一層的ul加一個id或者class。

假設這是在一個新的HTML文檔裡,那麼我們現在沒有任何的CSS定義,這時候的網頁顯示效果是這樣的:

在我們的下拉式功能表中,不需要內補丁、外邊距這些東西,即使需要,我們也要自己重新設定,所以我們首先添加第一條規則:

ul {    margin: 0px;    padding: 0px;}

為了跨瀏覽器安全色,必須同時把外邊距和內補丁都設定為0,因為有的瀏覽器預設使用外邊距,有的則預設使用內補丁。這樣設定以後,頁面上可以看到兩層清單項目前面的縮排都沒了,實心和空心的列表符號也不見了。然後設定第二條規則:

ul li {    float: left;    display: inline;    font: 0.9em Arial, Helvetica, sans-serif;    height: 30px;    width: 100px;    list-style: none;}

這是讓原本各佔一行的li元素變成嵌入式(inline)顯示,另一種說法是把list-item元素變成行內元素。總而言之就是讓li不要各佔一行,並列起來,這樣才能成為菜單。設定後,效果如下:

這樣就得到了下拉式功能表的雛形,當然了,外觀很醜陋,下拉功能也還沒實現。這裡要說明的是,最好給功能表項目設定高度和寬度,否則有可能出現不可預料的結果(取決於頁面或容器的寬度)。為了讓功能表項目看起來像菜單,我們繼續添加規則:

ul li a {    color: #FFF;    text-decoration: none;    line-height: 29px;    width: 91px;    margin: 0px;    padding: 0px 0px 0px 8px;    display: block;    border-right: solid 1px #ccc;    border-bottom:solid 1px #ccc;    background: #808080;}

這一條規則比較長,從作用上說呢,就是加上背景和菜單間的隔離線,把預設有底線藍色的文字變成白色無底線。增加了規則後的效果:

從外觀上,這就已經是我們最終的下拉式功能表樣式了。不過,我們還要在細節上修飾一下,比如讓子功能表和一級菜單的樣式有所區別(當然了,由於字型設定的0.9em,所以在文字大小上已經有區別了,但是還不夠,而且對於中文來說,很多時候我們未必能通過文字大小來區別,因為適合中文的常規文字大小就12px和14px而已),所以我們修改一下子功能表的背景色,並且讓子功能表比一級菜單的高度要小一些。規則:

ul li ul li { height:25px; }ul li ul li a {    background: #666;    line-height:24px;}

這裡包含兩條規則,第一條是將子功能表的清單項目高度由之前統一設定的30px減小為25,第二是將子功能表項的背景改為#666,並且文字行高對應地減小到24設定完成後(清單項目高度-1,減去的1正好是上邊框的1像素),效果如下:

通常我們滑鼠滑過某個功能表項目的時候,要讓它跟其它項目有所區別(表示當前菜單處於啟用狀態,術語叫“高亮” ,所以我們對一級菜單的滑鼠滑過樣式做一下定義:

ul li a:hover { background: #666; }

注意,這裡為滑鼠滑過時設定的背景色和子功能表的背景色一樣,原因?看效果就知道了:

這裡的第二個功能表項目就是滑鼠滑過時候的樣式,這樣就跟彈出的(現在還不會彈出)子功能表背景色一致了。現在整個菜單的樣式都設定完了,但是,這隻是靜態菜單啊,我們要的是會動的。所以工作還沒完成。接下來是什麼呢?當然是預設情況下把二級菜單隱藏起來。我們要寫JS來隱藏他們嗎?No!樣式如下:

ul li ul { visibility: hidden; }

這樣,子功能表並不是像“display:none”一樣不顯示,它還是在那個位置,文檔結構什麼的都沒有發生任何改變,只是看不到它而已,而且下拉式功能表中的連結當然也沒不可以點擊。

最後一條規則,讓滑鼠滑過有下拉項的時候,顯示下拉式功能表。當然我們實際設定的是:如果某一個下拉式功能表的父級元素(一級功能表項目)被滑鼠滑過,那麼就讓該下拉式功能表可以被看見:

ul li:hover ul { visibility: visible; }

這樣就完成了整個設定下拉式功能表製作,當然你還可以進一步修飾這個菜單,比如我們應該讓子功能表中的項目在滑鼠滑過的時候也變色:

ul li ul li a:hover { background: #333; }

最終效果

 

 

 

 

要強調的一點:這個下拉式功能表在各主流瀏覽器(IE6以下的版本除外)中的外觀及行為都是完全一致的。相容性非常好。為什麼不支援IE6呢?因為IE8都出來了,我們是不是應該徹底拋棄那個給網頁設計師帶來無限痛苦的萬惡的IE6了?

如果IE6的相容性對你的網站來說非常重要,那麼你可以參考這盤文章:http://wukangrui.com/2009/06/22/whatever-hover-pseudo-class-without-javascript.html。

本文參考:http://www.microsoft.com/china/expression/newsletter/2008-11/article05.aspx

本文首發自 刀刀部落格,部落格園同步更新。如需轉載,請註明作者及出處。
相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.