選單中應用於寬度較窄的版面,由下方延伸是比較好的方式,配合多層收合架構控制節省版面空間。
之前專案中有製作過用css的多層選單,但有個問題是次選單滑入後會往右下方延伸,如果又是多層的話自然所用的空間會更多,如果又是最右的多層選單的話,沒留好空間自然就會有超出視窗,而超出的部份也就無法選到了,除非這使用 JavaScript 來處理,但這好像工程很大。
在苦思與找資料看到梅干的一篇文章 (Bootstrap教學-「Bootstrap Navbar導覽列強化!」支援多層級下拉選單)正好可以適合應用,而也把相關的內容做個應証。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <div class="navbar navbar-inverse" role="navigation"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="#">多層級下拉選單-1</a> </div> <div class="collapse navbar-collapse"> <ul class="nav navbar-nav navbar-right"> <li><a href="#">選單1</a></li> <li class="dropdown-submenu"><a href="#" data-toggle="dropdown">選單2 </a> <ul class="dropdown-menu"> <li><a href="#">次選單1</a></li> <li class="dropdown-submenu"><a href="#" data-toggle="dropdown">次選單2</a> <ul class="dropdown-menu"> <li><a href="#">次次選單1</a></li> <li><a href="#">次次選單2</a></li> <li class="dropdown-submenu"><a href="#" data-toggle="dropdown">次次選單3</a> <ul class="dropdown-menu"> <li><a href="#">次次次選單1</a></li> <li><a href="#">次次次選單2</a></li> </ul> </li> </ul> </li> <li><a href="#">次選單3</a></li> </ul> </li> <li><a href="#">選單3</a></li> <li><a href="#">選單4</a></li> </ul> </div> </div> </div> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | /* 將子選單加入+號 */ li.dropdown-submenu>a:after{ display:block; content:"+"; float:right; font-size: 15px; margin-top:-1px; margin-left:5px; border: solid 1px #ccc; padding:0 4px; border-radius: 3px; } /* 選單開啟時變- */ li.dropdown-submenu.open>a:after{ content:"-"; } li.open ul.dropdown-menu>li.open>ul.dropdown-menu{ position: relative; border: 0; border-radius: 0; box-shadow: none; } li.open ul.dropdown-menu>li.open>ul.dropdown-menu>li{ padding-left: 20px; } /* 滑入選單時變換底色 */ .dropdown-menu>li>a:focus, .dropdown-menu>li>a:hover { background: rgba(0,0,0,0.1) !important; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 | $(function(){ $('ul.dropdown-menu [data-toggle=dropdown]').on('click', function(event) { //點擊時避免跟隨href位置 event.preventDefault(); //避免在點擊時關閉菜單 event.stopPropagation(); if($(this).parent().hasClass('open') == false){ //當class=open為否時 $(this).parent().addClass('open'); }else{ $(this).parent().removeClass('open'); } }); }); |
See the Pen BootStrap-Navbar導覽列-多層級下拉選單-1 by Jimmy_Wu (@Jimmy_Wu) on CodePen.
參照內容做出來的nav選單,是可以正常使用,不過確有個問題在 firefox ,次層收合選單的icon確會下移一行。
針對此bug查找了開發者工具,只要在加上這css就可修正,另外也修改偽元素內的字元。
1 2 3 4 | /*修正開合icon在firefox下擠問題*/ .dropdown-menu > li > a{ white-space: normal; } |
See the Pen BootStrap-Navbar導覽列-多層級下拉選單-2 by Jimmy_Wu (@Jimmy_Wu) on CodePen.
修改次選單與次次選單的樣式,主要可直接看出下層位置到何處,如果用手機的話在拉動還可以明白目前的階層。
css第二三階的修改,每多一階的話就要多對應的樣式
1 2 3 4 5 6 7 8 9 10 11 12 | /*次次選單退位*/ li.open ul.dropdown-menu>li.open>ul.dropdown-menu>li>a{ margin-left: 2.5rem; border-left: 1px #ccc solid; padding-left: .5rem; } /*次次次選單退位*/ li.open ul.dropdown-menu>li.open>ul.dropdown-menu>li.open>ul.dropdown-menu>li>a { margin-left: 3.5rem; border-left: 1px #ccc solid; padding-left: .5rem; } |
See the Pen BootStrap-Navbar導覽列-多層級下拉選單-3 by Jimmy_Wu (@Jimmy_Wu) on CodePen.