1. 程式人生 > >純CSS實現下拉選單導航

純CSS實現下拉選單導航

        前言:本題是網易雲課堂的前端微專業《頁面製作》課程的作業題,當時對題意理解錯誤沒有實現題目要求,成了心中永遠的痛,所謂念念不忘必有迴響,在學校圖書館花了幾個小時做出來並對相關知識點進行了總結,寫了這篇博文。好,進入正題。

---------------------華麗的分割線------------------------

0.需求:當滑鼠hover到按鈕上時,出現下拉選單導航條。


1.問題拆解:

(1)HTML應該如何組織比較方便合理

因為題中要求下拉選單位於按鈕的正下方,可以使用列表<li>中巢狀無序列表<ul>的方式,設定<ul>padding值為0。

(2)如何實現下拉選單在滑鼠沒有hover到按鈕上時不出現

使用定位隱藏,設定下拉選單為絕對定位,設定一個負的很大的值。

(3)如何實現下拉選單在滑鼠hover時出現

設定滑鼠hover時,<ul>列表的left值。

2.HTML結構

<body>
    <li class="btn"><a class="btn1" href="#">按鈕</a>
        <ul>
            <li><a href="#">下拉選單項</a></li>
            <li><a href="#">下拉選單項</a></li>
            <li><a href="#">下拉選單項</a></li>
            <li><a class="last" href="#">下拉選單項</a></li>
        </ul>
    </li>
</body>

3.設定樣式

(1)首先重置預設的<li>,<a>標籤樣式

        li,
        li a {
            text-decoration: none;
            list-style-type: none;
            font-family: "宋體";
            font-size: 12px;
            color: #000;
        }

(2)設定按鈕的邊框等,此時我設定的是外層<li>標籤中<a>標籤的樣式,此時將內層<a>標籤設定成塊級block,這樣可以設定寬高,並且後面有用(後面再說)。

       .btn1 {
            display: block;
            border: 1px solid #ddd;
            width: 50px;
            height: 28px;
            text-align: center;
            line-height: 28px;
        }

(3)將下拉選單隱藏設定成不可見
        ul {
            margin-top: 1px;
            position: absolute; /*設定絕對定位*/
            left: -999em;   /*設定隱藏*/
            padding: 0;  /*離它的父元素的邊界為0,所以可以位於父元素<li>的正下方*/
        }


(4)為下拉選單項新增樣式

        ul li a {
            display: inline-block;  /*選單項寬度未知,設定inline-block寬度為內容寬度*/
            border-top: 1px solid #ddd;
            border-left: 1px solid #ddd;  /*這方法很笨,千萬別學我*/
            border-right: 1px solid #ddd;
            height: 30px;
            padding: 0 10px;
            line-height: 30px;
        }

(5)不能忘了最後一個

        .last {
            border-bottom: 1px solid #ddd;
        }


(6)設定滑鼠hover時出現下拉選單

        .btn:hover ul {
            left: auto; /*預設ul的padding為0,位於按鈕正下方*/
        }

(7)設定hover時改變背景顏色

        ul li a:hover {
            background-color: #ddd;
        }


(8)此時會有一個小bug,滑鼠hover到按鈕整一行時都會出現下拉選單,因為此時最外層的<li>標籤是塊級元素,塊級元素沒有設定寬度預設的寬度是父元素寬度,而它的父元素是body,第(6)步寫的是hover整個外層<li>標籤,所以會出現這種情況。

解決辦法:   可以在父元素<li>設定inline-block,子元素設定block,當子元素內容超出時,父元素寬度根據內容變化,所以,可以將按鈕hover區域控制按鈕邊框之內。

        .btn{
            display: inline-block; /*設定btn是inline-block,
            預設寬度為內容寬度,則滑鼠只會在hover到按鈕區域時才會展開下拉選單*/
        }


以上是我的一些想法以及實現,如有錯誤之處,歡迎各位前端大神留言評論拍磚。如果你有好的想法也可以和我交流,我的程式碼寫的有很多不足之處,希望多和各位交流提高,謝謝!!!

如有需要可加我QQ:965093975

以下是完整程式碼:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>純css實現下拉選單</title>
    <style>
        li,
        li a {
            text-decoration: none;
            list-style-type: none;
            font-family: "宋體";
            font-size: 12px;
            color: #000;
        }
        
        .btn1 {
            display: block;
            border: 1px solid #ddd;
            width: 50px;
            height: 28px;
            text-align: center;
            line-height: 28px;
        }
        
        ul {
            margin-top: 1px;
            position: absolute; /*設定絕對定位,寬度為內容寬度*/
            left: -999em;   /*設定隱藏*/
            padding: 0;  /*離它的父元素的邊界為0,所以可以位於父元素li的正下方*/
        }
        
        ul li a {
            display: inline-block;  /*選單項寬度未知,設定inline-block寬度為內容寬度*/
            border-top: 1px solid #ddd;
            border-left: 1px solid #ddd;
            border-right: 1px solid #ddd;
            height: 30px;
            padding: 0 10px;
            line-height: 30px;
        }
        
        .last {
            border-bottom: 1px solid #ddd;
        }
        
        .btn:hover ul {
            left: auto; /*預設ul的padding為0,位於按鈕正下方*/
        }
        
        ul li a:hover {
            background-color: #ddd;
        }
        .btn{
            display: inline-block; /*設定btn是inline-block,
            預設寬度為內容寬度,則滑鼠只會在hover到按鈕區域時才會展開下拉選單*/
        }
    </style>
</head>

<body>
    <li class="btn"><a class="btn1" href="#">按鈕</a>
        <ul>
            <li><a href="#">下拉選單項</a></li>
            <li><a href="#">下拉選單項</a></li>
            <li><a href="#">下拉選單項</a></li>
            <li><a class="last" href="#">下拉選單項</a></li>
        </ul>
    </li>
</body>
</html>