Menu phụ thả xuống Bootstrap bị thiếu


324

Bootstrap 3 vẫn ở RC, nhưng tôi chỉ cố gắng thực hiện nó. Tôi không thể tìm ra làm thế nào để đặt một lớp menu phụ. Ngay cả không có lớp trong css và thậm chí các tài liệu mới không nói gì về nó

Nó ở đó trong 2.x với tên lớp là menu thả xuống


2
Xin lưu ý rằng một số thành phần đã thay đổi trong phiên bản 3, bao gồm menu, điều hướng và phương thức.
Deividi Cavarzan

11
việc thiếu hỗ trợ riêng cho tính năng hữu ích (imho) này trong BS3 là một trong những lý do chính khiến tôi chưa chuyển đổi. Mặc dù tôi đồng ý rằng nó không hữu ích trong thiết bị di động và hiện tại họ có cách tiếp cận 'di động đầu tiên', nhưng dường như rất thiển cận để loại bỏ một tính năng mà họ đã triển khai, đó là RẤT hữu ích trên máy tính để bàn
Andrew Brown

4
Đồng ý rằng nó thiển cận để loại bỏ chức năng dự kiến. Loại thay đổi đột phá này mang lại cho các nhà phát triển doanh nghiệp một ngày tồi tệ.
RJB

Để thực hiện thả xuống, chỉ cần sử dụng css codepen.io/Gothburz/pen/GpJKqP
Gothburz

Câu trả lời:


555

Cập nhật 2018

Cái dropdown-submenuđã bị xóa trong Bootstrap 3 RC. Theo lời của tác giả Bootstrap Mark Otto ..

"Các menu con hiện tại không có nhiều vị trí trên web, đặc biệt là web di động. Chúng sẽ bị xóa bằng 3.0" - https://github.com/twbs/bootstrap/pull/6342

Nhưng, với một chút CSS bổ sung, bạn có thể có được chức năng tương tự.

Bootstrap 4 (menu con thanh điều hướng khi di chuột)

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

Menu thả xuống menu phụ Navbar Di chuột thả xuống menu phụ
Navbar (liên kết bên phải)
Menu thả xuống menu phụ Navbar nhấp chuột (căn phải)
Di chuột thả xuống Navbar (không có menu phụ)


Bootstrap 3

Dưới đây là một ví dụ sử dụng 3.0 RC 1: http://bootply.com/71520

Dưới đây là một ví dụ sử dụng Bootstrap 3.0.0 (bản cuối cùng): 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;
}

Đánh dấu mẫu

<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 - Ví dụ trong thanh điều hướng điều chỉnh vị trí bên trái: http://bootply.com/92442


5
Vâng Cảm ơn tôi đã thêm nó vào bản định kiểu của chủ đề của tôi, chỉ cần sao chép từ phiên bản cũ của bootstrap wordpress.org/theme/bikaner
DevC

8
Ví dụ: bootply.com/86684 , hãy thêm dòng sau vào css để di chuột nền chính xác của mục menu phụ khi hiển thị menu con: .dropdown-submenu:hover {background: #e2e1e1;}
Eduardo Moralles

1
Hoạt động với 3.1.1 là tốt. Rất cám ơn cho giải pháp. Tôi đang đập đầu vào tường cố gắng thay đổi tệp bootstrap.js để hoạt động chính xác.
Joel Kinzel

2
Tôi đang cố gắng đơn giản hóa mọi thứ nhiều nhất có thể nhưng cần có điều này trên các trang web lớn mà không có cách nào để điều hướng nhiều cấp độ (chẳng hạn như các trang web của chính phủ).
Troy Templeman

1
Menu con biến mất ngay cả trước khi tôi có thể di chuyển chuột đến nó, vì vậy việc di chuột không hoạt động! Nó không di chuột, dựa vào nhấp chuột, mặc dù nó hoạt động tốt.
Polv

61

Giải pháp @skelly là tốt nhưng sẽ không hoạt động trên thiết bị di động vì trạng thái di chuột sẽ không hoạt động.

Tôi đã thêm một chút JS để lấy lại hành vi BS 2.3.2.

PS: nó sẽ hoạt động với CSS mà bạn có ở đó: http://bootply.com/71520 mặc dù bạn có thể nhận xét phần sau:

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');
});

Kết quả có thể được tìm thấy trên chủ đề WordPress của tôi (Đầu trang): http://shprinkone.julienrenaux.fr/


5
Bạn là người thông minh nhất trong bài đăng này
user1143669

2
Giải pháp này không giải thích cho việc muốn giữ chức năng di chuột khi ở trên máy tính để bàn và nó cũng không hoạt động cho cấp độ thứ hai của menu con. Để làm việc này để có nhiều cấp độ con hơn, hãy thay đổi hai dòng cuối cùng thành dòng sau : $(this).closest(".dropdown-submenu").toggleClass("open");, nó sẽ mở / đóng các mục menu liên kết. Để tiếp tục di chuột trên màn hình, việc kiểm tra độ rộng khung nhìn của trình duyệt là cần thiết và sẽ khác nhau cho từng trang web.
edhedges

cảm ơn mã của bạn nhưng trong điện thoại di động mã của bạn có lỗi.
jian dan

42

Cho đến ngày hôm nay (9 tháng 1 năm 2014), Bootstrap 3 vẫn không hỗ trợ thả xuống menu phụ.

Tôi đã tìm kiếm trên Google về menu điều hướng đáp ứng và thấy đây là cái tốt nhất.

Đây là menu thông minh http://www.smartmenus.org/

Tôi hy vọng đây là lối thoát cho bất kỳ ai muốn menu điều hướng với menu phụ đa cấp.

cập nhật 2015/02/17 Các menu thông minh hiện hỗ trợ đầy đủ kiểu phần tử Bootstrap cho menu con. Để biết thêm thông tin xin vui lòng xem trang web Menu thông minh.


Tôi đã gặp sự cố khi cố gắng để bootstrap di chuột trên PC và nhấp vào máy tính bảng với nhiều cấp độ. Bạn đã làm ngày hôm nay của tôi trở nên thú vị! Hoạt động rất đẹp - Sử dụng khá nhiều đánh dấu giống như bootstrap. Cảm ơn bạn! :)
Hippie

2
Giải pháp này là miễn phí, mã nguồn mở và hoạt động rất tốt với BootStrap 3.
Patrick Desjardins

5
Kinh ngạc! Dễ dàng! Để biết chi tiết cụ thể về tích hợp Bootstrap 3, xem tại đây: vadikom.github.io/smartmenus/src/demo/bootstrap-navbar.html
manafire

1
Smartmenus là tốt, tuy nhiên nó chỉ hoạt động với navbars, không phải với các nút thả xuống đơn giản.
Nikolai Prokoschenko

1
u đã lưu dự án của tôi :-)
Sikander

5

Mã của Shprink đã giúp tôi nhiều nhất, nhưng để tránh việc thả xuống màn hình, tôi đã cập nhật nó thành:

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: TỪ màu nền: #eeeeee ĐẾN màu nền: # c5c5c5 - phông chữ màu trắng và nền sáng trông không đẹp.

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

Tôi hy vọng điều này sẽ giúp mọi người nhiều như nó đã làm cho tôi!

Nhưng tôi hy vọng Bootstrap thêm tính năng phụ trở lại càng sớm càng tốt.



2

Tôi đã gặp vấn đề này vài ngày trước. Tôi đã thử nhiều giải pháp và cuối cùng không có giải pháp nào hiệu quả cho tôi, cuối cùng tôi đã tạo ra một phần mở rộng / ghi đè mã thả xuống của bootstrap. Nó là một bản sao của mã gốc với các thay đổi đối với hàm closeMenus.

Tôi nghĩ rằng đó là một giải pháp tốt vì nó không ảnh hưởng đến các lớp cốt lõi của bootstrap js.

Bạn có thể kiểm tra trên gihub: https://github.com/djokodonev/bootstrap-multilevel-dropdown


Đây là một giải pháp rất tốt cho thả xuống đa cấp, tôi thích sử dụng nó.
huncyrus

Tôi rất vui vì bạn thích nó :-)
George Donev

-2

Tôi thực hiện một giải pháp khác cho thả xuống. Hy vọng đây là hữu ích Chỉ cần thêm tập lệnh js này

<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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.