Làm thế nào để mở menu con twitter bootstrap ở bên trái?


93

Tôi đang cố gắng tạo menu con twitter bootstrap trong menu thả xuống, nhưng gặp sự cố: Tôi có menu thả xuống ở góc trên cùng bên phải của trang và menu đó có thêm một menu con. Tuy nhiên, khi menu con mở ra - nó không vừa với cửa sổ và đi quá nhiều sang bên phải, do đó người dùng chỉ có thể nhìn thấy các chữ cái đầu tiên. Làm thế nào để làm cho menu con đó không mở ở bên phải mà ở bên trái?


6
Đăng đoạn mã.
Shankar Cabus,

2
Trong Bootstrap 4, thêm .pull-rightvào vùng .dropdownchứa.
jbyrd

Câu trả lời:


109

Cách đơn giản nhất là thêm pull-leftlớp vàodropdown-submenu

<li class="dropdown-submenu pull-left">

jsfiddle: DEMO


Câu trả lời này cùng với câu trả lời của Matt ở cấp độ UL là cách chính xác để thực hiện điều này khi sử dụng bootstrap.
KeyOfJ

1
Câu hỏi của OP và câu trả lời của tôi là từ tháng 8 năm 2012. Trong khi đó, Bootstrap đã được thay đổi, vì vậy bây giờ bạn có lớp .pull-left. Hồi đó, câu trả lời của tôi là đúng. Bây giờ bạn không phải đặt css theo cách thủ công, bạn có lớp .pull-left đó.
Miljan Puzović

1
Điều này hoạt động tốt đối với một số trường hợp, nhưng sẽ bị hỏng nếu các mục trong menu chính quá dài, như trong fiddle này: jsfiddle.net/szx4Y/446 Có ai có ý tưởng nhanh về cách khắc phục không?
Aaron Lifshin

2
@AaronLifshin .dropdown-submenu.pull-left>.dropdown-menu { width: 100%; } Không phải là giải pháp tao nhã, nhưng dường như việc jsfiddle.net/r1v90tas
Schmalzy

1
@Schmalzy xem xét kỹ hơn, chiều rộng: 100% gây ra sự cố khác với các mục dài trong menu con jsfiddle.net/r1v90tas/1 và điều đó được khắc phục bằng cách sử dụng chiều rộng tối thiểu: 100% thay thế, theo đây: jsfiddle.net/ r1v90tas / 2
Aaron Lifshin

118

Nếu tôi hiểu điều này đúng, bootstrap cung cấp một lớp CSS chỉ cho trường hợp này. Thêm 'pull-right' vào menu 'ul':

<ul class="dropdown-menu pull-right">

..và kết quả cuối cùng là các tùy chọn menu xuất hiện căn phải, phù hợp với nút mà chúng thả xuống.


2
Bổ sung tuyệt vời Matt ở cấp độ UL.
KeyOfJ

2
hoàn toàn, tôi cần menu chính, không phải menu phụ để di chuyển. vì vậy tôi cần nhắm mục tiêu phần tử <ul>. nó khó hiểu vì bạn muốn di chuyển nó sang trái, tuy nhiên bạn sử dụng pull-rightclass để đạt được điều này.
FireDragon

1
Câu trả lời này hợp lệ cho Bootstrap 3.x, vì vậy, có vẻ như nó là câu trả lời đúng nhất tại thời điểm này.
alx

1
Câu trả lời được chấp nhận không hoạt động với tôi và Bootstrap 3, nhưng câu trả lời này thì có!
Josh Bilderback

1
Chính xác. thêm .pull-right và menu thả xuống của bạn sẽ không đi ra khỏi phía bên tay phải của màn hình!
slindsey3000

26

Lớp Curent .dropdown-submenu > .dropdown-menuleft: 100%;. Vì vậy, nếu bạn muốn mở menu con ở bên trái, hãy ghi đè các cài đặt đó sang vị trí phủ định bên trái. Ví dụ left: -95%;. Bây giờ bạn sẽ nhận được menu con ở phía bên trái và bạn có thể điều chỉnh các cài đặt khác để có được bản xem trước hoàn hảo.

Đây là DEMO

CHỈNH SỬA: Câu hỏi của OP và câu trả lời của tôi là từ tháng 8 năm 2012. Trong khi đó, Bootstrap đã thay đổi, vì vậy bây giờ bạn có lớp .pull-left. Hồi đó, câu trả lời của tôi là đúng. Bây giờ bạn không phải đặt css theo cách thủ công, bạn có lớp .pull-left đó.

CHỈNH SỬA 2: Các bản trình diễn không hoạt động vì Bootstrap đã thay đổi URL của họ. Chỉ cần thay đổi tài nguyên bên ngoài trong jsfiddle và thay thế chúng bằng tài nguyên mới.


Cảm ơn. Tuy nhiên, gần như chính xác những gì tôi cần left: -90%;(thay đổi khác, tôi không thể di chuyển chuột đến menu con đó, vì nó biến mất).
kovpack

Như tôi đã nói, đó chỉ là ý tưởng những gì bạn cần làm. Vui mừng tôi đã giúp :)
Miljan Puzović

Ví dụ của bạn chỉ hoạt động cho một số trường hợp nhất định. Hãy xem tại đây: jsfiddle.net/mQnv2/305
Alexandru R

Đây không phải là câu trả lời chính xác vì các lớp bootstrap nên được sử dụng như đã đề cập trong các bài đăng của Schmalzy và Matt.
KeyOfJ

1
Bài đăng này là một năm cũ hơn. Trong khi đó, bootstrap được thay đổi nên câu trả lời của Schmalzy thanh thoát hơn. Hồi đó, Bootstrap không có lớp pull-left.
Miljan Puzović

20

Nếu bạn đang sử dụng bootstrap v4, có một cách mới để làm điều đó.

Bạn nên sử dụng .dropdown-menu-righttrên .dropdown-menuphần tử.

<div class="btn-group">
  <button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
    Right-aligned menu
  </button>
  <div class="dropdown-menu dropdown-menu-right">
    <button class="dropdown-item" type="button">Action</button>
    <button class="dropdown-item" type="button">Another action</button>
    <button class="dropdown-item" type="button">Something else here</button>
  </div>
</div>

Liên kết tới mã: https://getbootstrap.com/docs/4.0/components/dropdowns/#menu-items


Điều này cũng hoạt động đối với các phiên bản boostrap> = 3.1 ... hãy kiểm tra stackoverflow.com/a/19253730/3354228
The.Bear

1
chắc chắn là câu trả lời đơn giản nhất
crodev

Điều này hơi đúng đối với phiên bản 4. Cú pháp đã thay đổi thành dropleftdroprightnhưng ngữ cảnh của câu trả lời là đúng. Cảm ơn!
cfnerd

12

Cách chính xác để thực hiện nhiệm vụ là:

/* Submenu placement itself */
.dropdown-submenu > .dropdown-menu { left: auto; right: 100%; }
/* Arrow position */
.dropdown-submenu { position: relative; }
.dropdown-submenu > a:after { position: absolute; left: 7px; top: 3px; float: none; border-right-color: #cccccc; border-width: 5px 5px 5px 0; }
.dropdown-submenu:hover > a:after { border-right-color: #ffffff; }

Tùy chọn khác .dropdown-submenu { position: relative; text-align:right; }Để định vị văn bản ở bên phải khi mũi tên ở bên trái.
Arvind

4

Tôi đã tạo một hàm javascript để xem liệu anh ta có đủ không gian ở phía bên phải không. Nếu nó có, anh ấy sẽ hiển thị nó ở bên phải, nếu không anh ấy sẽ hiển thị nó ở bên trái

Đã thử nghiệm trong:

  • Firefox (mac)
  • Chorme (mac)
  • Safari (mac)

Javascript:

$(document).ready(function(){
    //little fix for the poisition.
    var newPos     = $(".fixed-menuprofile .dropdown-submenu").offset().left - $(this).width();
    $(".fixed-menuprofile .dropdown-submenu").find('ul').offset({ "left": newPos });

    $(".fixed-menu .dropdown-submenu").mouseover(function() {
        var submenuPos = $(this).offset().left + 325;
        var windowPos  = $(window).width();
        var oldPos     = $(this).offset().left + $(this).width();
        var newPos     = $(this).offset().left - $(this).width();

        if( submenuPos > windowPos ){
            $(this).find('ul').offset({ "left": newPos });
        } else {
            $(this).find('ul').offset({ "left": oldPos });
        }
    });
});

bởi vì tôi không muốn thêm bản sửa lỗi này trên mọi mục menu mà tôi đã tạo một lớp mới trên đó. đặt menu cố định trên ul:

<ul class="dropdown-menu fixed-menu">

Tôi hy vọng công trình này ra cho bạn.

ps. lỗi nhỏ trong safari và chrome, lần đầu tiên di chuột sẽ đặt nó sang bên trái sẽ cập nhật bài đăng này nếu tôi đã sửa nó.


+1: Tôi đã thực hiện một vài thay đổi, nhưng điều này dẫn tôi đến một giải pháp hiệu quả.
zimdanen

Giải pháp tuyệt vời!
arefin2k

4

Nếu bạn chỉ có một cấp độ và bạn sử dụng bootstrap 3, hãy thêm pull-rightvào ulphần tử

<ul class="dropdown-menu pull-right" role="menu">

2

Trên thực tế - nếu bạn đồng ý với việc làm nổi dropdowntrình bao bọc - tôi thấy nó dễ dàng như thêm navbar-rightvào dropdown.

Điều này có vẻ giống như gian lận, vì nó không nằm trong thanh điều hướng, nhưng nó hoạt động tốt đối với tôi.

<div class="dropdown navbar-right">
...
</div>

Sau đó, bạn có thể tùy chỉnh thêm tính năng nổi với pull-lefttrực tiếp trong dropdown...

<div class="dropdown pull-left navbar-right">
...
</div>

... hoặc như một lớp bao bọc xung quanh nó ...

<div class="pull-left">
  <div class="dropdown navbar-right">
  ...
  </div>
</div>

1

Nếu bạn đang sử dụng LESS CSS, tôi đã viết một chút mixin để di chuyển menu thả xuống bằng mũi tên kết nối:

.dropdown-menu-shift( @num-pixels, @arrow-position: 10px ) {  // mixin to shift the dropdown menu
    left: @num-pixels;
    &:before { left: -@num-pixels + @arrow-position; }        // triangle outline
    &:after  { left: -@num-pixels + @arrow-position + 1px; }  // triangle internal
}

Sau đó, để di chuyển một .dropdown-menuvới một id là dropdown-menu-xví dụ, bạn có thể làm:

#dropdown-menu-x {
    .dropdown-menu-shift( -100px );
}

1

Tôi đã tạo một hàm javascript để xem liệu anh ta có đủ không gian ở phía bên phải không. Nếu nó có, anh ta sẽ hiển thị nó ở bên phải, nếu không anh ta sẽ hiển thị nó ở bên trái. Một lần nữa nếu nó có đủ không gian ở bên phải, nó sẽ hiển thị bên phải. nó là một vòng lặp ...

$(document).ready(function () {

$('body, html').css('overflow', 'hidden');
var screenWidth = $(window).width();
$('body, html').css('overflow', 'visible');

if (screenWidth > 767) {

    $(".dropdown-submenu").hover(function () {

        var dropdownPosition = $(this).offset().left + $(this).width() + $(this).find('ul').width();
        var newPosition = $(this).offset().left - $(this).find('ul').width();
        var windowPosition = $(window).width();

        var oldPosition = $(this).offset().left + $(this).width();
        //document.title = dropdownPosition;
        if (dropdownPosition > windowPosition) {
            $(this).find('ul').offset({ "left": newPosition });
        } else {
            $(this).find('ul').offset({ "left": oldPosition });
        }
    });

}

});


nó hoạt động! Nhưng hãy giới hạn nó: var newPosition = Math.max (10, ...);
djdance

0

Bạn có đang sử dụng phiên bản bootstrap mới nhất không? Tôi đã điều chỉnh html từ ví dụ Bố cục linh hoạt như được hiển thị bên dưới. Tôi đã thêm một danh sách thả xuống và đặt nó xa nhất về phía bên tay phải bằng cách thêm pull-rightlớp. Khi di chuột qua menu thả xuống, nó sẽ tự động được kéo sang trái và không có gì bị ẩn - tất cả văn bản menu đều hiển thị. Tôi chưa sử dụng bất kỳ css tùy chỉnh nào.

<div class="navbar navbar-inverse navbar-fixed-top">
  <div class="navbar-inner">
    <div class="container-fluid">
      <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </a>
      <a class="brand" href="#">Project name</a>
      <div class="nav-collapse collapse">
        <ul class="nav pull-right">
          <li class="active"><a href="#">Home</a></li>
          <li><a href="#about">About</a></li>
          <li><a href="#contact">Contact</a></li>
          <li class="dropdown open">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown <b class="caret"></b></a>
            <ul class="dropdown-menu">
              <li><a href="#">Action</a></li>
              <li><a href="#">Another action</a></li>
              <li><a href="#">Something else here</a></li>
              <li class="divider"></li>
              <li class="nav-header">Nav header</li>
              <li><a href="#">Separated link</a></li>
              <li><a href="#">One more separated link</a></li>
            </ul>
          </li>
        </ul>
        <p class="navbar-text pull-right">
          Logged in as <a href="#" class="navbar-link">Username</a>
        </p>
      </div><!--/.nav-collapse -->
    </div>
  </div>
</div>

Đây không phải là chính xác những gì tôi cần. Đây chỉ là trình đơn thả xuống (tôi cũng sử dụng kéo sang phải hoặc kéo sang trái). Nhưng tôi cần mở menu con TRONG SUBMENU và mở sang trái (trong menu thả xuống phải có mũi tên chỉ ra sự tồn tại của menu con sẽ mở sang trái, nhưng không phải, như menu tiêu chuẩn).
kovpack

0

Điều duy nhất bạn phải làm là

 <ul style='left:-100%'> 

của menu mà bạn muốn hiển thị ở bên RIGHT.

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.