Menu thả xuống đa cấp của Twitter Bootstrap


89

Có thể có menu thả xuống nhiều cấp bằng cách sử dụng các phần tử của twitter bootstrap 2 không? Phiên bản gốc không có tính năng này.


thực sự đã tìm kiếm một triển khai nhưng tôi không may mắn với nó.
Hellnar

Có lẽ bạn cần một thực đơn cá mút đá? htmldog.com/articles/suckerfish/dropdowns
Elaine Marley

1
hãy xem cái này cũng được: github.com/twitter/bootstrap/issues/424
Paolo

Câu trả lời:


113

Cập nhật câu trả lời

* Cập nhật câu trả lời hỗ trợ biểu định kiểu phiên bản v2.1.1 ** bootstrap.

** Nhưng hãy cẩn thận vì giải pháp này đã bị xóa khỏi v3

Chỉ muốn chỉ ra rằng giải pháp này không cần thiết nữa vì bootstrap mới nhất hiện hỗ trợ trình đơn thả xuống nhiều cấp theo mặc định. Bạn vẫn có thể sử dụng nó nếu bạn đang sử dụng các phiên bản cũ hơn nhưng đối với những người đã cập nhật lên phiên bản mới nhất (v2.1.1 tại thời điểm viết bài) thì không cần nữa. Dưới đây là một mẹo với trình đơn thả xuống đa cấp mặc định được cập nhật ngay từ tài liệu:

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


Câu trả lời gốc

Đã có một số vấn đề được nêu ra về hỗ trợ menu con trên github và chúng thường bị đóng bởi các nhà phát triển bootstrap, chẳng hạn như vấn đề này , vì vậy tôi nghĩ rằng việc này sẽ để các nhà phát triển sử dụng bootstrap giải quyết. Đây là một bản demo mà tôi tổng hợp cho bạn thấy cách bạn có thể hack cùng một menu phụ đang hoạt động.

Mã liên quan

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

Đã tạo .sub-menulớp của riêng tôi để áp dụng cho menu thả xuống 2 cấp, bằng cách này, chúng ta có thể đặt chúng bên cạnh các mục menu của mình. Đồng thời sửa đổi mũi tên để hiển thị nó ở bên trái của nhóm menu con.

Bản giới thiệu


2
Đối với Bootstrap 2.0.4, bạn cũng phải có khai báo "display: block;" trong bộ chọn ".dropdown-menu li: hover .sub-menu".
Omar

Tôi đã cố gắng triển khai nó, menu con đầu tiên hoạt động tốt. Nhưng nếu tôi sẽ thêm một menu con khác trong cùng một menu, thì mọi thứ sẽ không thành công. Vì lý do nào đó, nó sẽ mở menu con đầu tiên thay vì menu thứ hai. Mọi ý tưởng hoặc manh mối sẽ được hoan nghênh. Đã cảm ơn rồi :)
Arjan

Hermes - Xem câu trả lời của tôi để biết cách sửa lỗi dính menu con.
Sean Lynch

1
@Kannika huy động bản sửa lỗi này sẽ yêu cầu thêm một số đánh dấu và có thể là một số javascript. Tôi đề nghị chỉ hiển thị nội dung thả xuống cấp hai thay vì ẩn nó trên thiết bị di động để giữ mọi thứ sạch sẽ. Tôi sẽ cố gắng tìm ra giải pháp sau trong ngày. Mặc dù vậy, tôi vẫn chưa thử nghiệm giải pháp bootstrap mặc định, vì vậy nếu có bất cứ điều gì bạn luôn có thể sử dụng nó.
Andres Ilich

5
Phiên bản cập nhật chỉ hoạt động với Bootstrap 2.3.2, nó đã bị xóa trong Bootstrap 3.0
seantomburke

34

[Twitter Bootstrap v3]

Để tạo menu thả xuống cấp n (thân thiện với thiết bị cảm ứng) trong Twitter Bootstrap v3,

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>

Rất tiếc, điều này không hiển thị menu khi nút 'thu gọn' của menu đang hiển thị. Trong Chrome và trong FF.
Ben Power

@BenPower Bạn có thể vui lòng cung cấp bản demo jsfiddle của nó để tôi có thể xem xét vì bản demo jsfiddle mà tôi đã cung cấp đang hoạt động tốt. Ngoài ra bạn đang sử dụng phiên bản Bootstrap, JQuery và trình duyệt Web nào?
Chirayu Chiripal

Nó hoạt động cho Bootstrap v3.0. Bạn ơi ... Bạn có thể vui lòng làm cho nó hỗ trợ cho Bootstrap v2.3.2 không?
Niks Jain

1
Tôi đã thêm trigger.off('click');trước khi thiết lập trình lắng nghe để ngăn sự kiện "nghe hai lần" trong trường hợp khởi tạo javascript được kích hoạt nhiều lần.
FranBran

1
Việc đảo ngược dấu mũ đã thêm một số dòng mã và không cần thiết.
Ruben

23

Ví dụ này là từ http://bootsnipp.com/snippets/featured/multi-level-dropdown-menu-bs3

Hoạt động cho tôi trong 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;
}

Cảm ơn bạn ! phiên bản 3.0 không hỗ trợ nữa câu trả lời đã được xác thực
Asenar

13

Tôi đã có thể sửa lỗi menu phụ luôn ghim vào đầu menu mẹ từ câu trả lời của Andres bằng cách bổ sung sau:

.dropdown-menu li {
    position: relative;
}

Tôi cũng thêm biểu tượng "icon-chevron-right" trên các mục chứa menu phụ của menu và thay đổi biểu tượng từ đen sang trắng khi di chuột (để khen văn bản chuyển sang màu trắng và trông đẹp hơn với nền màu xanh lam đã chọn).

Đây là thay đổi less / css đầy đủ (thay thế ở trên bằng điều này):

.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");
        }
    }
}

4

Tôi chỉ cần thêm class="span2"vào <li>cho các mục thả xuống và làm việc.


3

Vì Bootstrap 3 đã loại bỏ phần menu con và chúng ta cần tự điều chỉnh phong cách, tôi nghĩ tốt hơn nên sử dụng SmartMenu Bootstrap: https://vadikom.github.io/smartmenus/src/demo/bootstrap-navbar.html#

Điều đó sẽ giúp chúng tôi tiết kiệm thời gian trên thiết bị di động và kiểu dáng.

Plugin này cũng rất hứa hẹn.


Ý kiến ​​của bạn về github.com/istvan-ujjmeszaros/bootstrap-dropdown-hover ? Tôi không thể quyết định.
Csaba Toth

1
@CsabaToth, cái này tôi cũng đang cân nhắc, nếu bạn muốn chỉ có API bootstrap javascript, bạn có thể sử dụng cái này, đủ nhẹ để thêm và có thể quen thuộc với kỹ năng bootstrap chung nếu bạn cần bất kỳ tùy chỉnh nào.
Thẩm định

Cuối cùng tôi sẽ sử dụng một trong số chúng trong một dự án và một trong một trang web đồng hành. Mỗi giải pháp phù hợp với một trong số họ tốt hơn
Csaba Toth
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.