原生JS實現N級菜單

来源:http://www.cnblogs.com/cq-lcq/archive/2017/05/21/6884123.html
-Advertisement-
Play Games

需求分析 簡單的分析一下,要實現N級菜單,首先從佈局入手,即判斷是否有下級菜單 圖:1 初步實現 1.實現是否存在 > 註意: 下麵凡是擔憂 xxx yyy ? xxx : xxx都是利用三元表達式,來表達思路。 HTML結構如下: 圖:2 要實現圖一的效果,我們只需要判斷li標簽裡面的childr ...


需求分析

簡單的分析一下,要實現N級菜單,首先從佈局入手,即判斷是否有下級菜單

  1. 沒有下一級菜單,直接排列
  2. 有下級菜單,又分為下級菜單排放位置,和在上級菜單顯示類似 '>' 的符號,效果如圖:

圖:1

 初步實現

1.實現是否存在   >

註意: 下麵凡是擔憂 xxx===yyy ? xxx : xxx都是利用三元表達式,來表達思路。

HTML結構如下:

圖:2

  • 要實現圖一的效果,我們只需要判斷li標簽裡面的children.length===2 ? 'span存在' : 'span移除'

2.下級菜單出現位置

HTML結構如下:

  • 實現這一需求,也需要判斷children.length===2 ? '上級菜單相對定位, top為0,left為上級的offsetWidth,下級菜單絕對定位' : '不做任何處理'

具體代碼即實現

效果圖如下:

代碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        * {
            margin: 0;
            padding: 0;
        }
        #box {
            margin: 200px 0 0 50px;
            text-align: center;
            color: #ccc;
        }
        ul {
            list-style: none;
            float: left;
        }
        li {
            width: 150px;
            height: 40px;
            line-height: 40px;
            background-color: #124520;
            border: 1px solid #eee;
            position: relative;
        }
        li span {
            position: absolute;
            top: 0;
            right: 10px;
        }
        li:hover {
            background-color: #666;
            transition: background-color .5s;
        }
        ul {
            display: none;
        }
        ul.first {
            display: block;
        }
        .relative {
            position:relative;
            top: 0;
            left: 0;
        }
        .absolute {
            position: absolute;
            left: 0;
            top: 0;
        }
        .show {
            display: block;
        }
        .hide {
            display: none;
        }
    </style>
</head>
<body>
    <div id="box">
        <ul class="first">
            <li>一級菜單
                <span>></span>
            </li>
            <li>一級菜單
                <span>></span>
                <ul>
                    <li>二級菜單
                        <span>></span>
                        <ul>
                            <li>三級菜單
                                <span>></span>
                            </li>
                            <li>三級菜單
                                <span>></span>
                            </li>
                            <li>三級菜單
                                <span>></span>
                            </li>
                            <li>三級菜單
                                <span>></span>
                            </li>
                        </ul>
                    </li>
                    <li>二級菜單
                        <span>></span>
                        <ul>
                            <li>三級菜單
                                <span>></span>
                            </li>
                            <li>三級菜單
                                <span>></span>
                            </li>
                            <li>三級菜單
                                <span>></span>
                            </li>
                            <li>三級菜單
                                <span>></span>
                            </li>
                        </ul>
                    </li>
                    <li>二級菜單
                        <span>></span>
                    </li>
                    <li>二級菜單
                        <span>></span>
                        <ul>
                            <li>三級菜單
                                <span>></span>
                            </li>
                            <li>三級菜單
                                <span>></span>
                            </li>
                            <li>三級菜單
                                <span>></span>
                            </li>
                            <li>三級菜單
                                <span>></span>
                            </li>
                        </ul>
                    </li>
                </ul>
            </li>
            <li>一級菜單
                <span>></span>
                <ul>
                    <li>二級菜單
                        <span>></span>
                    </li>
                    <li>二級菜單
                        <span>></span>
                        <ul>
                            <li>三級菜單
                                <span>></span>
                            </li>
                            <li>三級菜單
                                <span>></span>
                            </li>
                            <li>三級菜單
                                <span>></span>
                            </li>
                        </ul>

                    </li>
                    <li>二級菜單
                        <span>></span>
                        <ul>
                            <li>三級菜單
                                <span>></span>
                            </li>
                            <li>三級菜單
                                <span>></span>
                            </li>
                            <li>三級菜單
                                <span>></span>
                            </li>
                            <li>三級菜單
                                <span>></span>
                            </li>
                        </ul>
                    </li>
                    <li>二級菜單
                        <span>></span>
                        <ul>
                            <li>三級菜單
                                <span>></span>
                            </li>
                            <li>三級菜單
                                <span>></span>
                            </li>
                            <li>三級菜單
                                <span>></span>
                            </li>
                            <li>三級菜單
                                <span>></span>
                            </li>
                        </ul>
                    </li>
                </ul>
            </li>
            <li>一級菜單
                <span>></span>
            </li>
        </ul>
    </div>
</body>
<script type="text/javascript">
let uls = document.querySelectorAll("ul"); //獲取所有的ul
let lis = document.querySelectorAll("li"); //獲取所有的li
let liWidth = document.querySelector("#box ul").offsetWidth-2  //li的寬度 -2是為了好看

/*  佈局start  */
/*
 * 
 * 通過下麵佈局中代碼實現每個 li.children.length 要麼為0 要麼為2
 * 0 無下級菜單
 * 2 有下級菜單
 * 
 */
for (let i = uls.length - 1; i >= 0; i--) {
    if(uls[i].parentNode.nodeName === "LI") {
        uls[i].parentNode.classList.add("relative"); //相對定位
        uls[i].classList.add("absolute");  // 絕對定位
        uls[i].style.left = liWidth + "px"; 
    }
}
for (var i = 0; i < lis.length; i++) {
    if( lis[i].children.length === 1) { //沒有下一級菜單直接刪除
        lis[i].children[0].outerHTML = "";
    };
}

/*  佈局end  */



for (let i = 0; i < lis.length; i++) { // 控制每一個li

    lis[i].onmouseover = function() {
        if( lis[i].children.length === 2) {
            this.children[1].classList.remove("hide");
            this.children[1].classList.add("show");
        } 
    }
    lis[i].onmouseout = function() {

        if( lis[i].children.length === 2) {
            this.children[1].classList.remove("show");
            this.children[1].classList.add("hide");
        }
    }
}


</script>
</html>

 

上面代碼實現了,只要用ul,li結構嵌套在li標簽裡面即可


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文轉載自:http://www.cnblogs.com/lovesong/p/5745893.html meta標簽作用 META標簽是HTML標記HEAD區的一個關鍵標簽,提供文檔字元集、使用語言、作者等基本信息,以及對關鍵詞和網頁等級的設定等,最大的作用是能夠做搜索引擎優化(SEO)。 PS: ...
  • 1.<label hidden>看得見嗎</label> //hidden為隱藏屬性 2. <input tabindex="1" /> <textarea tabindex="2" spellcheck="true" cols="60" rows="5"></textarea> //spellch ...
  • 盒子陰影樣式單詞:box-shadow 語法 <style> div{box-shadow:0 0 1px #000 inset;} </style> 其中,第一個和第二個0分別代表邊框間距靠左和靠上;1px表示陰影範圍;#000表示陰影顏色為黑色;inset 代表框內陰影 ,沒有inset 則代表 ...
  • 解構賦值(destructuring assignment)語法是一個 Javascript 表達式,這種語法能夠更方便的提取出 Object 或者 Array 中的數據。這種語法可以在接受提取的數據的地方使用,比如一個表達式的左邊。有明確的語法模式來告訴我們如何使用這種語法提取需要的數據值。 ...
  • 1.<meta http-equiv="Pragma" content="no-cache"/> //禁止頁面緩存 2.<script defer src="http://code.jquery.com/jquery-1.10.1.min.js" onload="alert('a')"></scri ...
  • 一、安裝D3.js 1.網路連接 2.命令行安裝 cnpm || npm install d3 --save => 我採用的是cnpm install d3 --save 3.創建node 伺服器 a. cnpm || npm install express --save =>前面教程已經說了exp ...
  • 簡單介紹了自製的WebGL模型編輯器“Newland”的使用方法和設計思路 ...
  • 求數組的最小值和最大值 寫一個函數,功能就是求參數中的平均數,裡面涉及到arguments這個類數組 並且把這個類數組轉換成數組 然後利用數組的方法進行求平均數 再寫一種方法 更加對call的用法的理解 以及對類數組轉換成數組的理解 再寫點註意的事情:在IE6至IE8中 對 arguments 這個 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...