як змусити відкрити підменю twitter bootstrap з лівого боку?


93

Я намагався створити підменю twitter bootstrap у спадному меню, але у мене проблема: у мене є спадне меню у верхньому правому куті сторінки, і в цьому меню є ще одне підменю. Однак, коли підменю відкривається - воно не поміщається у вікні і надто сильно рухається вправо, так що користувач може бачити лише перші літери. Як зробити так, щоб підменю відкривалося не праворуч, а ліворуч?


6
Опублікуйте код фрагмента.
Шанкар Кабус

2
У Bootstrap 4, додайте .pull-rightв .dropdownконтейнер.
jbyrd

Відповіді:


109

Найпростішим способом було б додати pull-leftклас до вашогоdropdown-submenu

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

jsfiddle: DEMO


Ця відповідь, а також відповідь Метта на рівні UL - правильний спосіб реалізувати це при використанні bootstrap.
KeyOfJ

1
Питання OP та моя відповідь з серпня 2012 р. Тим часом Bootstrap змінено, тож ти маєш клас .pull-left. Тоді моя відповідь була правильною. Тепер вам не потрібно вручну встановлювати css, у вас є .pull-left клас.
Miljan Puzović 02.03.14

1
Це добре працює в деяких випадках, але переривається, якщо елементи в головному меню занадто довгі, як у цій скрипті : jsfiddle.net/szx4Y/446 Хто-небудь має швидку ідею щодо виправлення?
Аарон Ліфшин

2
@AaronLifshin .dropdown-submenu.pull-left>.dropdown-menu { width: 100%; } Не елегантне рішення, але, схоже, працює jsfiddle.net/r1v90tas
Schmalzy

1
@Schmalzy, дивлячись далі, width: 100% викликає іншу проблему з довгими елементами у підменю jsfiddle.net/r1v90tas/1, і це виправляється за допомогою використання min-width: 100% замість цього, як тут: jsfiddle.net/ r1v90tas / 2
Аарон Ліфшин

118

Якщо я правильно зрозумів, bootstrap надає клас CSS саме для цього випадку. Додайте слово "тягнути вправо" до меню "ul":

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

..і кінцевим результатом є те, що параметри меню відображаються по правому краю, відповідно до кнопки, з якої вони випадають.


2
Чудове доповнення Метта на рівні UL.
KeyOfJ

3
абсолютно, мені потрібно було головне меню, а не підменю для переходу. тому мені потрібно було націлити елемент <ul>. це бентежить, тому що ви хочете перемістити його вліво, однак pull-rightдля досягнення цього ви використовуєте клас.
FireDragon

1
Ця відповідь справедлива для Bootstrap 3.x, отже, на даний момент вона є найбільш правильною.
alx

1
Прийнята відповідь не працює для мене та Bootstrap 3, але ця працює!
Джош Більдербек

1
Це вірно. додайте .pull-right, і ваш випадаючий список не зникне з правого боку екрана!
slindsey3000

26

Клас струму .dropdown-submenu > .dropdown-menuє left: 100%;. Отже, якщо ви хочете відкрити підменю з лівого боку, перевизначте ці налаштування в негативне ліве положення. Наприклад left: -95%;. Тепер ви отримаєте підменю зліва, і ви можете налаштувати інші налаштування, щоб отримати ідеальний попередній перегляд.

Ось DEMO

EDIT: Питання OP та моя відповідь від серпня 2012 р. Тим часом Bootstrap змінився, тож ти маєш клас .pull-left. Тоді моя відповідь була правильною. Тепер вам не потрібно вручну встановлювати css, у вас є клас .pull-left.

EDIT 2: Демонстраційні програми не працюють, оскільки Bootstrap змінив їх URL-адреси. Просто змініть зовнішні ресурси в jsfiddle і замініть їх новими.


Дякую. Однак мало б бути майже те, що мені потрібно left: -90%;(за іншим розміром я не можу перемістити мишу до цього підменю, бо воно зникає).
kovpack

Як я вже сказав, це просто ідея, що вам потрібно зробити. Радий, що мені допомогли :)
Miljan Puzović

Ваш приклад працює лише для певних випадків. Подивіться тут: jsfiddle.net/mQnv2/305
Alexandru R

Це не правильна відповідь, оскільки слід використовувати класи початкової завантаження, як згадано у публікаціях Шмальци та Метта.
KeyOfJ

1
Цей пост на цілий рік старший. Тим часом завантажувальний ремінь змінено, тому відповідь Шмальці є більш елегантною. Тоді у Bootstrap ще не було класу з витягуванням вліво.
Miljan Puzović

20

Якщо ви використовуєте bootstrap v4, є новий спосіб це зробити.

Ви повинні використовувати .dropdown-menu-rightна .dropdown-menuелементі.

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

Посилання на код: https://getbootstrap.com/docs/4.0/components/dropdowns/#menu-items


Це також працює для версій boostrap> = 3,1 ... перевірити цей stackoverflow.com/a/19253730/3354228
The.Bear

1
безумовно найпростіша відповідь
crodev

Це кілька для версії 4. Синтаксис змінився до dropleftі droprightале контекст відповіді правильно. Дякую!
cfnerd

12

Правильний спосіб виконання завдання:

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

Більше переваг .dropdown-submenu { position: relative; text-align:right; }Розмістити текст праворуч, коли стрілка вліво.
Арвінд

4

Я створив функцію javascript, яка виглядає, чи достатньо йому місця з правого боку. Якщо він є, він покаже його з правого боку, інакше він покаже його з лівого боку

Випробувано в:

  • Firefox (mac)
  • Чорме (mac)
  • Сафарі (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 });
        }
    });
});

тому що я не хочу додавати це виправлення в усі пункти меню, я створив у ньому новий клас. розмістіть фіксоване меню на ul:

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

Сподіваюся, це у вас вийде.

ps. маленька помилка в сафарі та хромі, спочатку наведіть курсор, щоб розмістити його зліва, оновить цю публікацію, якщо я це виправлю.


+1: Я зробив кілька змін, але це призвело мене до діючого рішення.
zimdanen

Чудове рішення!
arefin2k

4

Якщо у вас є тільки один рівень , і ви використовуєте завантажувальний 3 доповнення pull-rightдо ulелементу

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

2

Насправді - якщо у вас все добре з плаваючою dropdownобгорткою - я виявив, що це так само просто, як додати navbar-rightдо dropdown.

Це схоже на обман, оскільки він не знаходиться на панелі навігації, але для мене це чудово працює.

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

Потім ви можете додатково налаштувати плаваючу за допомогою pull-leftбезпосередньо в dropdown...

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

... або як обгортка навколо нього ...

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

1

Якщо ви використовуєте МЕНШЕ CSS, я написав невелику комбінацію, щоб перемістити випадаючий список зі стрілкою, що з'єднує:

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

Потім, щоб перемістити a .dropdown-menuз ідентифікатором, dropdown-menu-xнаприклад, ви можете зробити:

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

1

Я створив функцію javascript, яка виглядає, чи достатньо йому місця з правого боку. Якщо він є, він покаже його з правого боку, інакше він покаже його з лівого боку. Знову ж таки, якщо у нього достатньо місця з правого боку, він покаже правий бік. це петля ...

$(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 });
        }
    });

}

});


це працює! Але давайте обмежимо: var newPosition = Math.max (10, ...);
djdance

0

Чи використовуєте ви останню версію bootstrap? Я адаптував html із прикладу Fluid Layout, як показано нижче. Я додав розкривне меню і поставив його найдалі праворуч, додавши pull-rightклас. При наведенні курсору на спадне меню воно автоматично витягується вліво і нічого не приховується - весь текст меню видно. Я не використовував будь-який власний css.

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

Це не зовсім те, що мені потрібно. Це просто випадаюче меню (я також використовую витягування вправо чи вліво). Але мені потрібно відкрити підменю В ПІДМІНІ та зробити його відкритим ліворуч (у випадаючому списку має бути стрілка, що вказує на існування підменю, яке має відкриватися ліворуч, але не праворуч, як це робить стандартне).
kovpack

0

Єдине, що вам потрібно зробити, це

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

меню, яке потрібно відобразити праворуч.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.