Bootstrap เมนูย่อยแบบหล่นลงหายไป


324

Bootstrap 3 ยังอยู่ที่ RC แต่ฉันแค่พยายามใช้มัน ฉันไม่สามารถหาวิธีวางคลาสเมนูย่อยได้ แม้จะไม่มีคลาสใน CSS และแม้แต่เอกสารใหม่ก็ไม่พูดอะไรเกี่ยวกับมัน

มันอยู่ที่นั่นใน 2.x พร้อมชื่อคลาสเป็นดรอปดาวน์ - เมนูย่อย


2
โปรดจำไว้ว่าองค์ประกอบบางอย่างมีการเปลี่ยนแปลงในรุ่น 3 รวมถึงเมนู navs และ modals
Deividi Cavarzan

11
การขาดการสนับสนุนดั้งเดิมสำหรับคุณลักษณะที่มีประโยชน์ (imho) ใน BS3 นี้เป็นหนึ่งในเหตุผลหลักที่ฉันยังไม่ได้เปลี่ยนไป ในขณะที่ผมเห็นว่ามันไม่เป็นประโยชน์ในโทรศัพท์มือถือและพวกเขามี 'มือถือครั้งแรก' วิธีการตอนนี้มันดูเหมือนว่าสั้นไปเอาคุณลักษณะที่พวกเขาดำเนินการแล้วว่าเป็นประโยชน์อย่างมากบนเดสก์ทอป
แอนดรูบราวน์

4
ตกลงกันว่ามันเป็นสายตาสั้นที่จะลบฟังก์ชั่นที่คาดหวัง การเปลี่ยนแปลงที่รุนแรงเช่นนี้ทำให้ผู้พัฒนาองค์กรไม่ดี
RJB

ในการทำรายการแบบเลื่อนลงให้ใช้ css codepen.io/Gothburz/pen/GpJKqP
Gothburz

คำตอบ:


555

อัปเดตในปี 2018

dropdown-submenuได้ถูกลบออกใน Bootstrap 3 RC ในคำพูดของ Bootstrap ผู้เขียน Mark Otto ..

"เมนูย่อยไม่มีสถานที่บนเว็บมากตอนนี้โดยเฉพาะเว็บบนมือถือพวกเขาจะถูกลบด้วย 3.0" - https://github.com/twbs/bootstrap/pull/6342

แต่ด้วย CSS พิเศษเล็กน้อยคุณจะได้รับฟังก์ชั่นเดียวกัน

Bootstrap 4 (เมนูย่อย navbar เมื่อเลื่อน)

.navbar-nav li:hover > ul.dropdown-menu {
    display: block;
}
.dropdown-submenu {
    position:relative;
}
.dropdown-submenu>.dropdown-menu {
    top:0;
    left:100%;
    margin-top:-6px;
}

เมนูย่อย Navbar เลื่อนลงเลื่อนลงเมนูย่อยเลื่อนลง
Navbar เมนูย่อย (จัดชิดขวา)
เมนูย่อยเลื่อน Navbar เมนูเลื่อนลง (ชิดขวา)
Navbar เลื่อนเมนูย่อย (ไม่มีเมนูย่อย)


Bootstrap 3

นี่คือตัวอย่างที่ใช้ 3.0 RC 1: http://bootply.com/71520

นี่คือตัวอย่างที่ใช้ Bootstrap 3.0.0 (สุดท้าย): http://bootply.com/86684

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 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:#cccccc;
    margin-top:5px;
    margin-right:-10px;
}
.dropdown-submenu:hover>a:after {
    border-left-color:#ffffff;
}
.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;
}

ตัวอย่างมาร์กอัป

<div class="navbar navbar-default navbar-fixed-top" role="navigation">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">  
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
        </div>
        <div class="collapse navbar-collapse navbar-ex1-collapse">
            <ul class="nav navbar-nav">
                <li class="menu-item dropdown">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">Drop Down<b class="caret"></b></a>
                    <ul class="dropdown-menu">
                        <li class="menu-item dropdown dropdown-submenu">
                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Level 1</a>
                            <ul class="dropdown-menu">
                                <li class="menu-item ">
                                    <a href="#">Link 1</a>
                                </li>
                                <li class="menu-item dropdown dropdown-submenu">
                                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">Level 2</a>
                                    <ul class="dropdown-menu">
                                        <li>
                                            <a href="#">Link 3</a>
                                        </li>
                                    </ul>
                                </li>
                            </ul>
                        </li>
                    </ul>
                </li>
            </ul>
        </div>
    </div>
</div>

PS - ตัวอย่างใน navbar ที่ปรับตำแหน่งซ้าย: http://bootply.com/92442


5
ใช่ขอบคุณฉันได้เพิ่มสไตล์ชีทของธีมของฉันแล้วเพียงคัดลอกวางจาก bootstrap รุ่นเก่าwordpress.org/themes/bikaner
DevC

8
ตัวอย่างเช่นbootply.com/86684ให้เพิ่มบรรทัดต่อไปนี้ใน css สำหรับการวางเมาส์บนพื้นหลังที่ถูกต้องของรายการเมนูหลักเมื่อแสดงเมนูย่อย: .dropdown-submenu:hover {background: #e2e1e1;}
Eduardo Moralles

1
ทำงานร่วมกับ 3.1.1 เช่นกัน ขอบคุณมากสำหรับการแก้ปัญหา ฉันตีหัวกับกำแพงพยายามเปลี่ยนไฟล์ bootstrap.js ให้ทำงานอย่างถูกต้อง
Joel Kinzel

2
ฉันทุกคนกำลังพยายามทำให้สิ่งต่าง ๆ เรียบง่ายที่สุดเท่าที่จะเป็นไปได้ แต่มีความจำเป็นสำหรับเว็บไซต์ขนาดใหญ่ที่ไม่มีการนำทางในหลายระดับ (เช่นเว็บไซต์ของรัฐบาล)
Troy Templeman

1
เมนูย่อยหายไปก่อนที่ฉันจะสามารถเลื่อนเมาส์ไปได้ดังนั้นการโฮเวอร์ไม่ทำงาน! มันไม่ได้โฮเวอร์อาศัยการคลิก แต่ก็ใช้งานได้ดี
Polv

61

วิธีแก้ปัญหา @ เคลลี่เป็นสิ่งที่ดี แต่จะไม่ทำงานบนอุปกรณ์มือถือเนื่องจากสถานะโฮเวอร์จะไม่ทำงาน

ฉันได้เพิ่ม JS เล็กน้อยเพื่อให้ได้พฤติกรรม BS 2.3.2 กลับมา

PS: มันจะทำงานร่วมกับ CSS ที่คุณไปที่นั่น: http://bootply.com/71520แม้ว่าคุณสามารถแสดงความคิดเห็นในส่วนต่อไปนี้:

CSS:

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

JS:

$('ul.dropdown-menu [data-toggle=dropdown]').on('click', function(event) {
  // Avoid following the href location when clicking
  event.preventDefault();
  // Avoid having the menu to close when clicking
  event.stopPropagation();
  // If a menu is already open we close it
  $('ul.dropdown-menu [data-toggle=dropdown]').parent().removeClass('open');
  // opening the one you clicked on
  $(this).parent().addClass('open');
});

ผลลัพธ์สามารถพบได้ในธีม WordPress ของฉัน (ด้านบนของหน้า): http://shprinkone.julienrenaux.fr/


5
คุณเป็นคนที่ฉลาดที่สุดในโพสต์นี้
user1143669

2
วิธีนี้ไม่ได้หมายความว่าต้องการให้โฮเวอร์ทำงานเมื่ออยู่บนเดสก์ท็อปและจะไม่ทำงานสำหรับเมนูย่อยระดับที่สอง เพื่อให้การทำงานในระดับเมนูย่อยมากขึ้นให้เปลี่ยนสองบรรทัดสุดท้ายเป็นบรรทัดต่อไปนี้: $(this).closest(".dropdown-submenu").toggleClass("open");ซึ่งจะเปิด / ปิดรายการเมนูลิงก์ เพื่อให้โฮเวอร์บนเดสก์ท็อปตรวจสอบความกว้างของวิวพอร์ตของเบราว์เซอร์เป็นสิ่งที่จำเป็นและจะแตกต่างกันไปในแต่ละไซต์
edhedges

ขอบคุณสำหรับรหัสของคุณ แต่ในโทรศัพท์มือถือรหัสของคุณมีข้อบกพร่อง
เจียนแดน

42

จนถึงวันนี้ (9 มกราคม 2014) Bootstrap 3 ยังไม่รองรับเมนูแบบเลื่อนลง

ฉันค้นหา Google เกี่ยวกับเมนูนำทางที่ตอบสนองต่อและพบว่านี่เป็นสิ่งที่ดีที่สุดสำหรับฉัน

มันเป็นเมนูสมาร์ท http://www.smartmenus.org/

ฉันหวังว่านี่จะเป็นทางออกสำหรับทุกคนที่ต้องการเมนูนำทางด้วยเมนูย่อยหลายระดับ

อัพเดท 2015-02-17 ตอนนี้เมนูสมาร์ทสนับสนุนสไตล์ Bootstrap สำหรับเมนูย่อยอย่างเต็มที่ สำหรับข้อมูลเพิ่มเติมโปรดดูที่เว็บไซต์เมนูสมาร์ท


ฉันมีปัญหาในการพยายามใช้ bootstrap เพื่อวางเมาส์บนพีซีและคลิกที่แท็บเล็ตที่มีหลายระดับ คุณทำให้วันนี้ดี! ใช้งานได้อย่างสวยงาม - ใช้มาร์กอัปเดียวกันกับ bootstrap ขอบคุณ! :)
Hippie

2
วิธีแก้ปัญหานี้ฟรีโอเพนซอร์ซและใช้งานได้ดีกับ BootStrap 3
Patrick Desjardins

5
! ที่น่าตื่นตาตื่นใจ ง่าย! สำหรับรายละเอียดเฉพาะเกี่ยวกับการรวม Bootstrap 3 ดูที่นี่: vadikom.github.io/smartmenus/src/demo/bootstrap-navbar.html
manafire

1
Smartmenus นั้นดี แต่ใช้งานได้กับ navbars ไม่ใช่ด้วยปุ่มแบบเลื่อนลง
Nikolai Prokoschenko

1
คุณบันทึกโครงการของฉัน :-)
Sikander

5

รหัสของ Shprink ช่วยฉันได้มากที่สุด แต่เพื่อหลีกเลี่ยงการดรอปดาวน์เพื่อออกจากหน้าจอฉันได้อัปเดตเป็น:

JS:

$('ul.dropdown-menu [data-toggle=dropdown]').on('click', function(event) {
    // Avoid following the href location when clicking
    event.preventDefault(); 
    // Avoid having the menu to close when clicking
    event.stopPropagation(); 
    // If a menu is already open we close it
    $('ul.dropdown-menu [data-toggle=dropdown]').parent().removeClass('open');
    // opening the one you clicked on
    $(this).parent().addClass('open');

    var menu = $(this).parent().find("ul");
    var menupos = $(menu).offset();

    if (menupos.left + menu.width() > $(window).width()) {
        var newpos = -$(menu).width();
        menu.css({ left: newpos });    
    } else {
        var newpos = $(this).parent().width();
        menu.css({ left: newpos });
    }

});

CSS: จากสีพื้นหลัง: #eeeeee เป็นสีพื้นหลัง: # c5c5c5 - ตัวอักษรสีขาวและพื้นหลังสีอ่อนดูไม่ดี

.nav .open > a,
.nav .open > a:hover,
.nav .open > a:focus {
  background-color: #c5c5c5;
  border-color: #428bca;
}

ฉันหวังว่านี่จะช่วยผู้คนได้มากเท่าที่ฉันคิด!

แต่ฉันหวังว่า Bootstrap จะเพิ่มคุณสมบัติย่อยกลับมาโดยเร็ว


4

แสดงความคิดเห็นเพื่อแก้ปัญหาที่เป็นประโยชน์จริงๆของ Skelly : ใน Bootstrap-เขื่อง 3.3.6, utilities.scss สาย 19: มี.pull-left float:left !importantตั้งแต่นั้นมาฉันแนะนำให้ใช้! สำคัญใน CSS ของเขาเช่นกัน:

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

2

ฉันชนกับปัญหานี้เมื่อไม่กี่วันที่ผ่านมา ฉันลองวิธีแก้ปัญหามากมายและไม่มีใครทำงานให้ฉันได้ในตอนท้ายฉันได้สร้าง extenion / override ของรหัสดรอปดาวน์ของ bootstrap มันเป็นสำเนาของรหัสต้นฉบับที่มีการเปลี่ยนแปลงฟังก์ชั่น closeMenus

ฉันคิดว่ามันเป็นทางออกที่ดีเพราะไม่มีผลต่อคลาสหลักของ bootstrap js

คุณสามารถตรวจสอบได้ที่ gihub: https://github.com/djokodonev/bootstrap-multilevel-dropdown


นี่เป็นทางออกที่ดีมากสำหรับการเลื่อนลงหลายระดับฉันชอบที่จะใช้มัน
huncyrus

ฉันดีใจที่คุณชอบ :-)
George Donev

-2

ฉันทำวิธีอื่นในการเลื่อนลง หวังว่านี่จะเป็นประโยชน์เพียงเพิ่มสคริปต์ js นี้

<script type="text/javascript"> jQuery("document").ready(function() {
  jQuery("ul.dropdown-menu > .dropdown.parent").click(function(e) {
    e.preventDefault();
    e.stopPropagation();
    if (jQuery(this).hasClass('open2'))
      jQuery(this).removeClass('open2');
    else {
      jQuery(this).addClass('open2');
    }

  });
}); < /script>

<style type="text/css">.open2{display:block; position:relative;}</style>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.