เมนูแบบเลื่อนลงหลายระดับของ Twitter Bootstrap


89

เป็นไปได้ไหมที่จะมีเมนูแบบเลื่อนลงหลายระดับโดยใช้องค์ประกอบของ twitter bootstrap 2? เวอร์ชันดั้งเดิมไม่มีคุณสมบัตินี้


ค้นหาการนำไปใช้จริง แต่ฉันไม่โชคดี
Hellnar

บางทีคุณอาจต้องการเมนูปลาดูด? htmldog.com/articles/suckerfish/dropdowns
Elaine Marley

1
ดูสิ่งนี้ด้วย: github.com/twitter/bootstrap/issues/424
Paolo

คำตอบ:


113

คำตอบที่อัปเดต

* คำตอบที่อัปเดตซึ่งรองรับสไตล์ชีทเวอร์ชัน v2.1.1 ** bootstrap

** แต่โปรดระวังเนื่องจากโซลูชันนี้ถูกลบออกจาก v3 แล้ว

เพียงแค่ต้องการชี้ให้เห็นว่าโซลูชันนี้ไม่จำเป็นอีกต่อไปเนื่องจาก bootstrap ล่าสุดรองรับเมนูแบบเลื่อนลงหลายระดับตามค่าเริ่มต้นแล้ว คุณยังสามารถใช้งานได้หากคุณใช้เวอร์ชันเก่า แต่สำหรับผู้ที่อัปเดตเป็นเวอร์ชันล่าสุด (v2.1.1 ในขณะที่เขียน) ไม่จำเป็นอีกต่อไป นี่คือซอที่มีรายการแบบเลื่อนลงหลายระดับเริ่มต้นที่อัปเดตจากเอกสารประกอบ:

http://jsfiddle.net/2Smgv/2858/


คำตอบเดิม

มีปัญหาบางอย่างที่เกิดขึ้นในการสนับสนุนเมนูย่อยที่ github และมักจะถูกปิดโดยนักพัฒนา bootstrap เช่นปัญหานี้ดังนั้นฉันคิดว่ามันเหลือให้นักพัฒนาใช้ bootstrap เพื่อทำงานบางอย่าง นี่คือการสาธิตที่ฉันรวบรวมซึ่งแสดงให้คุณเห็นว่าคุณสามารถแฮ็กเมนูย่อยที่ใช้งานได้อย่างไร

รหัสที่เกี่ยวข้อง

CSS

.dropdown-menu .sub-menu {
    left: 100%;
    position: absolute;
    top: 0;
    visibility: hidden;
    margin-top: -1px;
}

.dropdown-menu li:hover .sub-menu {
    visibility: visible;
    display: block;
}

.navbar .sub-menu:before {
    border-bottom: 7px solid transparent;
    border-left: none;
    border-right: 7px solid rgba(0, 0, 0, 0.2);
    border-top: 7px solid transparent;
    left: -7px;
    top: 10px;
}
.navbar .sub-menu:after {
    border-top: 6px solid transparent;
    border-left: none;
    border-right: 6px solid #fff;
    border-bottom: 6px solid transparent;
    left: 10px;
    top: 11px;
    left: -6px;
}

สร้าง.sub-menuคลาสของตัวเองเพื่อใช้กับเมนูแบบเลื่อนลง 2 ระดับด้วยวิธีนี้เราสามารถวางตำแหน่งไว้ข้างรายการเมนูของเรา แก้ไขลูกศรเพื่อแสดงทางด้านซ้ายของกลุ่มเมนูย่อยด้วย

การสาธิต


2
ใน Bootstrap 2.0.4 คุณต้องมีคำประกาศ "display: block;" ด้วย ในตัวเลือก ".dropdown-menu li: hover .sub-menu"
Omar

ฉันพยายามที่จะใช้มันเมนูย่อยแรกใช้งานได้ดี แต่ถ้าฉันจะเพิ่มเมนูย่อยอื่นในเมนูเดียวกันแสดงว่าผิดพลาด ด้วยเหตุผลบางประการมันจะเปิดเมนูย่อยแรกแทนเมนูที่สอง ยินดีต้อนรับความคิดหรือเบาะแสใด ๆ ขอบคุณแล้ว :)
Arjan

Hermes - ดูคำตอบของฉันสำหรับวิธีแก้ไขการติดของเมนูย่อย
Sean Lynch

1
@ กรรณิการ์ระดมการแก้ไขนี้จะต้องมีมาร์กอัปพิเศษและอาจจาวาสคริปต์ด้วย ฉันขอแนะนำให้แสดงเนื้อหาแบบเลื่อนลงระดับที่สองแทนที่จะซ่อนไว้ในอุปกรณ์เคลื่อนที่เพื่อรักษาความสะอาด ฉันจะพยายามแก้ไขปัญหาในภายหลังในระหว่างวัน ฉันยังไม่ได้ทดสอบโซลูชัน bootstrap เริ่มต้นดังนั้นหากมีสิ่งใดที่คุณสามารถทำได้ตลอดเวลา
Andres Ilich

5
เวอร์ชันที่อัปเดตใช้งานได้กับ Bootstrap 2.3.2 เท่านั้นซึ่งจะถูกลบออกใน Bootstrap 3.0
seantomburke

34

[Twitter Bootstrap v3]

ในการสร้างเมนูแบบเลื่อนลงระดับ n (ระบบสัมผัสที่เป็นมิตรกับอุปกรณ์) ใน Twitter Bootstrap v3

  • jsfiddle-demo ของเมนูแบบเลื่อนลงระดับ n v3.0.0 | v3.1.1 | v3.3.0

CSS:

.dropdown-menu>li /* To prevent selection of text */
{   position:relative;
    -webkit-user-select: none; /* Chrome/Safari */        
    -moz-user-select: none; /* Firefox */
    -ms-user-select: none; /* IE10+ */
    /* Rules below not implemented in browsers yet */
    -o-user-select: none;
    user-select: none;
    cursor:pointer;
}
.dropdown-menu .sub-menu 
{
    left: 100%;
    position: absolute;
    top: 0;
    display:none;
    margin-top: -1px;
    border-top-left-radius:0;
    border-bottom-left-radius:0;
    border-left-color:#fff;
    box-shadow:none;
}
.right-caret:after,.left-caret:after
 {  content:"";
    border-bottom: 5px solid transparent;
    border-top: 5px solid transparent;
    display: inline-block;
    height: 0;
    vertical-align: middle;
    width: 0;
    margin-left:5px;
}
.right-caret:after
{   border-left: 5px solid #ffaf46;
}
.left-caret:after
{   border-right: 5px solid #ffaf46;
}

jQuery:

$(function(){
    $(".dropdown-menu > li > a.trigger").on("click",function(e){
        var current=$(this).next();
        var grandparent=$(this).parent().parent();
        if($(this).hasClass('left-caret')||$(this).hasClass('right-caret'))
            $(this).toggleClass('right-caret left-caret');
        grandparent.find('.left-caret').not(this).toggleClass('right-caret left-caret');
        grandparent.find(".sub-menu:visible").not(current).hide();
        current.toggle();
        e.stopPropagation();
    });
    $(".dropdown-menu > li > a:not(.trigger)").on("click",function(){
        var root=$(this).closest('.dropdown');
        root.find('.left-caret').toggleClass('right-caret left-caret');
        root.find('.sub-menu:visible').hide();
    });
});

HTML:

<div class="dropdown" style="position:relative">
    <a href="#" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">Click Here <span class="caret"></span></a>
    <ul class="dropdown-menu">
        <li>
            <a class="trigger right-caret">Level 1</a>
            <ul class="dropdown-menu sub-menu">
                <li><a href="#">Level 2</a></li>
                <li>
                    <a class="trigger right-caret">Level 2</a>
                    <ul class="dropdown-menu sub-menu">
                        <li><a href="#">Level 3</a></li>
                        <li><a href="#">Level 3</a></li>
                        <li>
                            <a class="trigger right-caret">Level 3</a>
                            <ul class="dropdown-menu sub-menu">
                                <li><a href="#">Level 4</a></li>
                                <li><a href="#">Level 4</a></li>
                                <li><a href="#">Level 4</a></li>
                            </ul>
                        </li>
                    </ul>
                </li>
                <li><a href="#">Level 2</a></li>
            </ul>
        </li>
        <li><a href="#">Level 1</a></li>
        <li><a href="#">Level 1</a></li>
    </ul>
</div>

น่าเสียดายที่นี่ไม่แสดงเมนูเมื่อปุ่ม "ยุบ" ของเมนูแสดงขึ้น ใน Chrome และใน FF
Ben Power

@BenPower คุณช่วยกรุณาให้ jsfiddle สาธิตของมันได้ไหมเพื่อที่ฉันจะได้ดูมันเพราะการสาธิต jsfiddle ที่ฉันให้นั้นใช้งานได้ดี คุณใช้ Bootstrap, JQuery และเว็บเบราว์เซอร์เวอร์ชันใด
Chirayu Chiripal

มันทำงานสำหรับ Bootstrap v3.0 บัดดี้ ... คุณช่วยสนับสนุน Bootstrap v2.3.2 ได้ไหม
Niks Jain

1
ฉันเพิ่มtrigger.off('click');ก่อนที่จะตั้งค่าผู้ฟังเพื่อป้องกันไม่ให้ "ฟังซ้ำ" ไปยังเหตุการณ์ในกรณีที่การเริ่มต้นจาวาสคริปต์ถูกทริกเกอร์มากกว่าหนึ่งครั้ง
FranBran

1
การเปลี่ยนคาเร็ตเป็นการเพิ่มโค้ดหลายบรรทัดและไม่จำเป็น
Ruben

23

ตัวอย่างนี้มาจากhttp://bootsnipp.com/snippets/featured/multi-level-dropdown-menu-bs3

ใช้ได้กับฉันใน Bootstrap v3.1.1

HTML

<div class="container">
<div class="row">
    <h2>Multi level dropdown menu in Bootstrap 3</h2>
    <hr>
    <div class="dropdown">
        <a id="dLabel" role="button" data-toggle="dropdown" class="btn btn-primary" data-target="#" href="/page.html">
            Dropdown <span class="caret"></span>
        </a>
        <ul class="dropdown-menu multi-level" role="menu" aria-labelledby="dropdownMenu">
          <li><a href="#">Some action</a></li>
          <li><a href="#">Some other action</a></li>
          <li class="divider"></li>
          <li class="dropdown-submenu">
            <a tabindex="-1" href="#">Hover me for more options</a>
            <ul class="dropdown-menu">
              <li><a tabindex="-1" href="#">Second level</a></li>
              <li class="dropdown-submenu">
                <a href="#">Even More..</a>
                <ul class="dropdown-menu">
                    <li><a href="#">3rd level</a></li>
                    <li><a href="#">3rd level</a></li>
                </ul>
              </li>
              <li><a href="#">Second level</a></li>
              <li><a href="#">Second level</a></li>
            </ul>
          </li>
        </ul>
    </div>
</div>

CSS

.dropdown-submenu {
position: relative;
}

.dropdown-submenu>.dropdown-menu {
top: 0;
left: 100%;
margin-top: -6px;
margin-left: -1px;
-webkit-border-radius: 0 6px 6px 6px;
-moz-border-radius: 0 6px 6px;
border-radius: 0 6px 6px 6px;
}

.dropdown-submenu:hover>.dropdown-menu {
display: block;
}

.dropdown-submenu>a:after {
display: block;
content: " ";
float: right;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
border-width: 5px 0 5px 5px;
border-left-color: #ccc;
margin-top: 5px;
margin-right: -10px;
}

.dropdown-submenu:hover>a:after {
border-left-color: #fff;
}

.dropdown-submenu.pull-left {
float: none;
}

.dropdown-submenu.pull-left>.dropdown-menu {
left: -100%;
margin-left: 10px;
-webkit-border-radius: 6px 0 6px 6px;
-moz-border-radius: 6px 0 6px 6px;
border-radius: 6px 0 6px 6px;
}

ขอบคุณ ! เวอร์ชัน 3.0 ไม่รองรับคำตอบที่ตรวจสอบแล้วอีกต่อไป
Asenar

13

ฉันสามารถแก้ไขเมนูย่อยที่ตรึงไว้ที่ด้านบนสุดของเมนูหลักจากคำตอบของ Andres ด้วยการเพิ่มดังต่อไปนี้:

.dropdown-menu li {
    position: relative;
}

ฉันยังเพิ่มไอคอน "icon-chevron-right" ในรายการที่มีเมนูย่อยของเมนูและเปลี่ยนไอคอนจากสีดำเป็นสีขาวเมื่อวางเมาส์เหนือ (เพื่อชมข้อความที่เปลี่ยนเป็นสีขาวและดูดีขึ้นด้วยพื้นหลังสีน้ำเงินที่เลือก)

นี่คือการเปลี่ยนแปลง less / css แบบเต็ม (แทนที่ด้านบนด้วยสิ่งนี้):

.dropdown-menu li {
    position: relative;

    [class^="icon-"] {
        float: right;
    }

    &:hover {
        // Switch to white icons on hover
        [class^="icon-"] {
            background-image: url("../img/glyphicons-halflings-white.png");
        }
    }
}


3

เนื่องจาก Bootstrap 3 ได้ลบส่วนเมนูย่อยออกไปและเราจำเป็นต้องปรับสไตล์ให้เข้ากับตัวเองฉันคิดว่าควรใช้ SmartMenu Bootstrap: https://vadikom.github.io/smartmenus/src/demo/bootstrap-navbar.html#

ซึ่งจะช่วยให้เราประหยัดเวลาในการตอบสนองและสไตล์บนมือถือ

ปลั๊กอินนี้ยังมีแนวโน้มมาก


คุณมีความเห็นอย่างไรเกี่ยวกับgithub.com/istvan-ujjmeszaros/bootstrap-dropdown-hover ฉันไม่สามารถตัดสินใจได้.
Csaba Toth

1
@CsabaToth อันนี้ก็อยู่ในการพิจารณาของฉันเช่นกันหากคุณต้องการมีเฉพาะ bootstrap javascript API คุณสามารถใช้อันนี้เบาพอที่จะเพิ่มและสามารถคุ้นเคยกับทักษะ bootstrap ทั่วไปหากคุณต้องการปรับแต่งใด ๆ
Osify

ในที่สุดฉันจะใช้หนึ่งในนั้นในโครงการหนึ่งและอีกโครงการหนึ่งในไซต์ร่วม วิธีแก้ปัญหาแต่ละข้อเหมาะกับหนึ่งในนั้นดีกว่า
Csaba Toth
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.