目次
实现原理
代码实现
完整示例
注意事项
总结
ホームページ ウェブフロントエンド htmlチュートリアル サイドナビゲーションバーのシングルオープンサブメニュー効果を実装する

サイドナビゲーションバーのシングルオープンサブメニュー効果を実装する

Aug 17, 2025 pm 11:45 PM

サイドナビゲーションバーのシングルオープンサブメニュー効果を実装する

本文旨在提供一个清晰、简洁的教程,指导开发者如何实现侧边导航栏中子菜单的单开效果。通过修改JavaScript代码,确保在任何时刻只有一个子菜单处于展开状态,提升用户体验。我们将详细讲解代码实现,并提供完整的示例,帮助你快速掌握这一技巧。

实现原理

核心思路在于,每次点击子菜单的头部时,首先检查当前是否有已展开的子菜单。如果有,则将其关闭,然后再展开当前点击的子菜单。这样就保证了始终只有一个子菜单处于展开状态。

代码实现

以下是如何修改 JavaScript 代码以实现此功能的步骤:

  1. 获取所有子菜单头部元素: 使用 document.querySelectorAll 获取所有 .sub_menu_header 元素。

  2. 为每个子菜单头部添加点击事件监听器: 遍历所有子菜单头部元素,并为每个元素添加点击事件监听器。

  3. 在点击事件处理函数中,首先关闭已打开的子菜单: 在点击事件处理函数中,首先使用 document.querySelector(".sub_menu_body.active") 查找当前是否有 .sub_menu_body 元素具有 active 类。 如果找到,则使用 classList.remove("active") 移除该类的名称。

  4. 然后,切换当前点击的子菜单的显示状态: 获取当前点击的子菜单对应的 sub_menu_body 元素,并切换其 active 类的状态。

以下是修改后的 JavaScript 代码:

const sub_menu = document.querySelectorAll('.sub_menu');
sub_menu.forEach((item) => {
    const subMenuHeader = item.querySelector('.sub_menu_header')
    const subMenuBody = item.querySelector('.sub_menu_body')
    subMenuHeader.addEventListener('click', () => {
        // 关闭已打开的子菜单
        if(document.querySelector(".sub_menu_body.active")) {
            document.querySelector(".sub_menu_body.active").classList.remove("active");
        }

        // 切换当前子菜单的显示状态
        subMenuBody.classList.toggle('active');
    })
})

这段代码首先检查是否存在已经激活的子菜单,如果存在,则移除其 active 类,从而关闭它。然后,它会切换当前点击的子菜单的 active 类,如果该子菜单是关闭的,则打开它;如果是打开的,则关闭它。

完整示例

以下是完整的 HTML、CSS 和 JavaScript 示例代码:

HTML (index.html):




    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <link rel="stylesheet" href="./style.css">
    <title>side nav</title>



    <nav id="nav_menu_query_off">
        <menu id="main_menu">
            <li class="main_list_item">
                <div class="menu_header">menu one</div>
                <div class="menu_body">
                    <menu class="sub_menu">
                        <div class="sub_menu_header">sub menu one</div>
                        <div class="sub_menu_body">
                            <li class="inner_list_item"><a href="">link one</a></li>
                            <li class="inner_list_item"><a href="">link two</a></li>
                            <li class="inner_list_item"><a href="">link three</a></li>
                            <li class="inner_list_item"><a href="">link four</a></li>
                            <li class="inner_list_item"><a href="">link five</a></li>
                            <li class="inner_list_item"><a href="">link six</a></li>
                            <li class="inner_list_item"><a href="">link seven</a></li>
                        </div>
                    </menu>
                    <menu class="sub_menu">
                        <div class="sub_menu_header">sub menu two</div>
                        <div class="sub_menu_body">
                            <li class="inner_list_item"><a href="">link one</a></li>
                            <li class="inner_list_item"><a href="">link two</a></li>
                            <li class="inner_list_item"><a href="">link three</a></li>
                            <li class="inner_list_item"><a href="">link four</a></li>
                            <li class="inner_list_item"><a href="">link five</a></li>
                            <li class="inner_list_item"><a href="">link six</a></li>
                            <li class="inner_list_item"><a href="">link seven</a></li>
                        </div>
                    </menu>
                    <menu class="sub_menu">
                        <div class="sub_menu_header">sub menu three</div>
                        <div class="sub_menu_body">
                            <li class="inner_list_item"><a href="">link one</a></li>
                            <li class="inner_list_item"><a href="">link two</a></li>
                            <li class="inner_list_item"><a href="">link three</a></li>
                            <li class="inner_list_item"><a href="">link four</a></li>
                            <li class="inner_list_item"><a href="">link five</a></li>
                            <li class="inner_list_item"><a href="">link six</a></li>
                            <li class="inner_list_item"><a href="">link seven</a></li>
                        </div>
                    </menu>
                </div>
            </li>
            <li class="main_list_item">
                <div class="menu_header">menu two</div>
                <div class="menu_body">
                    <menu class="sub_menu">
                        <div class="sub_menu_header">sub menu one</div>
                        <div class="sub_menu_body">
                            <li class="inner_list_item"><a href="">link one</a></li>
                            <li class="inner_list_item"><a href="">link two</a></li>
                            <li class="inner_list_item"><a href="">link three</a></li>
                            <li class="inner_list_item"><a href="">link four</a></li>
                            <li class="inner_list_item"><a href="">link five</a></li>
                            <li class="inner_list_item"><a href="">link six</a></li>
                            <li class="inner_list_item"><a href="">link seven</a></li>
                        </div>
                    </menu>
                    <menu class="sub_menu">
                        <div class="sub_menu_header">sub menu two</div>
                        <div class="sub_menu_body">
                            <li class="inner_list_item"><a href="">link one</a></li>
                            <li class="inner_list_item"><a href="">link two</a></li>
                            <li class="inner_list_item"><a href="">link three</a></li>
                            <li class="inner_list_item"><a href="">link four</a></li>
                            <li class="inner_list_item"><a href="">link five</a></li>
                            <li class="inner_list_item"><a href="">link six</a></li>
                            <li class="inner_list_item"><a href="">link seven</a></li>
                        </div>
                    </menu>
                    <menu class="sub_menu">
                        <div class="sub_menu_header">sub menu three</div>
                        <div class="sub_menu_body">
                            <li class="inner_list_item"><a href="">link one</a></li>
                            <li class="inner_list_item"><a href="">link two</a></li>
                            <li class="inner_list_item"><a href="">link three</a></li>
                            <li class="inner_list_item"><a href="">link four</a></li>
                            <li class="inner_list_item"><a href="">link five</a></li>
                            <li class="inner_list_item"><a href="">link six</a></li>
                            <li class="inner_list_item"><a href="">link seven</a></li>
                        </div>
                    </menu>
                </div>
            </li>
        </menu>
    </nav>



<script src="./script.js"></script>

CSS (style.css):

*{
    margin: 0;
    padding: 0;
    box-sizing: border-box;
    text-decoration: none;
    list-style: none;
}

body{
    font-family: 'Ebrima';
    background-color: #444444;
}



nav#nav_menu_query_off{
    position: fixed;
    top: 0;
    left: 0;
    width: 200px;
    height: 100vh;
    background-color: #222222;
    overflow: auto;
    z-index: 2;
    padding: 20px 0 20px 20px;
}
nav#nav_menu_query_off menu#main_menu li.main_list_item div.menu_header{
    text-transform: uppercase;
    padding-bottom: 10px;
}
nav#nav_menu_query_off menu li{
    color: #f0f0f0;
}
nav#nav_menu_query_off menu#main_menu li.main_list_item:not(:last-child){
    padding-bottom: 20px;
}
nav#nav_menu_query_off menu#main_menu li.main_list_item:not(:first-child){
    padding-top: 20px;
}
nav#nav_menu_query_off menu#main_menu div.menu_body{
    padding: 0px 0 0 20px;
    border-left: 1px solid #efefef;
}
nav#nav_menu_query_off menu#main_menu div.menu_body menu.sub_menu{
    padding: 10px 0px;
    border-bottom: 1px solid #efefef;
}
nav#nav_menu_query_off menu#main_menu div.menu_body menu.sub_menu div.sub_menu_header{
    text-transform: capitalize;
    font-size: 14px;
}
nav#nav_menu_query_off menu#main_menu div.menu_body menu.sub_menu div.sub_menu_header:hover{
    cursor: pointer;
}
nav#nav_menu_query_off menu#main_menu div.menu_body menu.sub_menu div.sub_menu_body{
    padding: 5px 0 0 0px;
    /* THIS HIDES ALL SUBMENUS */
    display: none;
}
nav#nav_menu_query_off menu#main_menu div.menu_body menu.sub_menu div.sub_menu_body.active{
    display: block;
}
nav#nav_menu_query_off menu#main_menu li.main_list_item div.menu_body menu.sub_menu div.sub_menu_body li.inner_list_item{
    font-size: 14px;
}

nav#nav_menu_query_off menu li .menu_body menu li a{
    color: #f0f0f0;
    display: block;
    padding: 5px 0 5px 20px;
}
nav#nav_menu_query_off menu li .menu_body menu li a:hover{
    background-color: #999999;
}

nav::-webkit-scrollbar{
    /* width: 4px; */
    /* helps remove scrollbar which resizes or shifts list items */
    display: none;
}

JavaScript (script.js):

const sub_menu = document.querySelectorAll('.sub_menu');
sub_menu.forEach((item) => {
    const subMenuHeader = item.querySelector('.sub_menu_header')
    const subMenuBody = item.querySelector('.sub_menu_body')
    subMenuHeader.addEventListener('click', () => {
        // 关闭已打开的子菜单
        if(document.querySelector(".sub_menu_body.active")) {
            document.querySelector(".sub_menu_body.active").classList.remove("active");
        }

        // 切换当前子菜单的显示状态
        subMenuBody.classList.toggle('active');
    })
})

注意事项

  • 确保 HTML 结构正确,.sub_menu_header 和 .sub_menu_body 元素之间的关系正确。
  • CSS 样式中的 display: none; 初始隐藏子菜单内容,display: block; 用于显示子菜单内容。
  • 此代码假设只有一个导航菜单。如果有多个导航菜单,需要修改选择器以确保只影响目标导航菜单。

总结

通过以上步骤,你就可以轻松サイドナビゲーションバーのシングルオープンサブメニュー効果を実装する,提升用户体验。这种方法简单易懂,易于维护,适用于各种 Web 项目。 希望本教程能帮助你解决实际问题。

以上がサイドナビゲーションバーのシングルオープンサブメニュー効果を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ホットトピック

初心者向けの不可欠なHTMLタグ 初心者向けの不可欠なHTMLタグ Jul 27, 2025 am 03:45 AM

HTMLをすばやく開始するには、Webスケルトンを構築するためにいくつかの基本的なタグをマスターするだけです。 1.ページ構造は不可欠であり、ルート要素であり、メタ情報が含まれ、コンテンツディスプレイ領域です。 2。タイトルを使用します。レベルが高いほど、数が小さくなります。タグを使用してテキストをセグメント化して、レベルをスキップしないようにします。 3.リンクはタグを使用してHREF属性を一致させ、画像はタグを使用し、SRCおよびALT属性が含まれます。 4.リストは、順序付けられていないリストと順序付けリストに分割されます。各エントリは表され、リストにネストする必要があります。 5.初心者は、すべてのタグを強制的に記憶する必要はありません。あなたが書いている間にそれらを書いてチェックする方がより効率的です。構造、テキスト、リンク、写真、リストをマスターして、基本的なWebページを作成します。

入力タグの名前属性は何ですか? 入力タグの名前属性は何ですか? Jul 27, 2025 am 04:14 AM

thenAmeattributeTheTogisusedisedifytheTheInputisputisUbsisubmitted; itstheasthekey-key-key-valuepairsenttotheserver、wheretheuser'sinputisthevalue.1.whenaformissubmitted、thenameattributebecomesthe keyanttheinputtheinupthe becomesthevalueintas

Shadow Domの概念とHTML統合 Shadow Domの概念とHTML統合 Jul 24, 2025 am 01:39 AM

Shadowdomは、孤立したDOMサブツリーを作成するためにWebコンポーネントテクノロジーで使用されるテクノロジーです。 1.独自のスタイルと行動を備えた通常のHTML要素上の独立したDOM構造のマウントを可能にし、メインドキュメントに影響しません。 2。AttachShadowメソッドの使用やモードの設定など、JavaScriptを介して作成されました。 3。HTMLと組み合わせて使用すると、3つの主要な機能があります。クリア構造、スタイル分離、コンテンツプロジェクション(スロット)。 4。ノートには、複雑なデバッグ、スタイルスコープ制御、パフォーマンスオーバーヘッド、フレームワークの互換性の問題が含まれます。要するに、Shadowdomは、再利用可能で汚染されていないUIコンポーネントを構築するためのネイティブカプセル化機能を提供します。

別のタグ内にタグを入れることはできますか? 別のタグ内にタグを入れることはできますか? Jul 27, 2025 am 04:15 AM

youcannotnesttagsinsisideantagbecuseit’sinvalidhtml; browsersautomatelycloseThefirsteforeopeningthenext、spedinginselementsied、useinlineelements like like like、orforstylingwithinaparagraph、またはblockainerslikegoriveparagragh

HTMLにPDFドキュメントを埋め込む方法は? HTMLにPDFドキュメントを埋め込む方法は? Aug 01, 2025 am 06:52 AM

タグを使用することは、最も簡単で推奨される方法です。構文は、最新のブラウザがPDFを直接埋め込むのに適しています。 2.タグを使用すると、より良いコントロールおよびバックアップコンテンツのサポートを提供できます。Syntaxはサポートされていない場合にバックアップソリューションとしてタグのダウンロードリンクを提供します。 3. Google DocsViewerを介して組み込むことはできますが、プライバシーとパフォーマンスの問題のために広く使用することはお勧めしません。 4.ユーザーエクスペリエンスを改善するには、適切な高さを設定する必要があります。レスポンシブサイズ(高さ:80VHなど)およびPDFダウンロードリンクを提供して、ユーザーが自分でダウンロードして表示できるようにする必要があります。

html `style`タグ:インラインと内部css html `style`タグ:インラインと内部css Jul 26, 2025 am 07:23 AM

シーンに従ってスタイル配置方法を選択する必要があります。 1。インラインは、操作によるボタンの色の変更など、単一要素または動的JS制御の一時的な変更に適しています。 2。内部CSSは、ページが少ないプロジェクトと単純な構造に適しています。これは、ログインページの基本スタイル設定など、スタイルの集中管理に便利です。 3。再利用、メンテナンス、パフォーマンスが優先され、大規模なプロジェクトの外部リンクCSSファイルを分割することをお勧めします。

HTMLで順序付けられていないリストを作成する方法は? HTMLで順序付けられていないリストを作成する方法は? Jul 30, 2025 am 04:50 AM

HTML Unoderedリストを作成するには、タグを使用してリストコンテナを定義する必要があります。各リストアイテムはタグで包まれており、ブラウザは自動的に弾丸を追加します。 1.タグを使用してリストを作成します。 2。各リスト項目はタグで定義されています。 3.ブラウザは、デフォルトのドットシンボルを自動的に生成します。 4。サブリストはネスティングを通じて実装できます。 5。CSSのリストスタイルタイプの属性を使用して、ディスク、サークル、スクエア、またはなしなどのシンボルスタイルを変更します。これらのタグを正しく使用して、標準の非秩序化リストを生成します。

コンテンツ誘導性の属性を使用する方法は? コンテンツ誘導性の属性を使用する方法は? Jul 28, 2025 am 02:24 AM

thecontentEdentedItedItableattributemakesanyhtmlementedabledaitbyaddingcontenteditable = "true"、avainusErstodirectlymodifyContentinthebrowser.2.ItiscommonlyLichTexteditors、note-takingApps、およびin-place-placeditingintingintingintingintingintingtintingtintingtediv

See all articles