как сделать так, чтобы подменю twitter bootstrap открывалось с левой стороны?

93

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

ковпак
источник
6
Опубликуйте фрагмент кода.
Шанкар Кабус,
2
В Bootstrap 4, добавьте .pull-rightв .dropdownконтейнер.
jbyrd

Ответы:

109

Самый простой способ - добавить pull-leftкласс к вашемуdropdown-submenu

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

jsfiddle: ДЕМО

Шмальзи
источник
Этот ответ вместе с ответом Мэтта для уровня UL - правильный способ реализовать это при использовании начальной загрузки.
KeyOfJ
1
Вопрос OP и мой ответ относятся к августу 2012 года. Тем временем Bootstrap изменен, поэтому теперь у вас есть класс .pull-left. Тогда мой ответ был правильным. Теперь вам не нужно вручную устанавливать css, у вас есть класс .pull-left.
Мильян Пузович
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

Curent класс .dropdown-submenu > .dropdown-menuесть left: 100%;. Итак, если вы хотите открыть подменю с левой стороны, переопределите эти настройки на отрицательное левое положение. Например left: -95%;. Теперь у вас появится подменю с левой стороны, и вы можете настроить другие параметры, чтобы получить идеальный предварительный просмотр.

Вот ДЕМО

РЕДАКТИРОВАТЬ: вопрос OP и мой ответ относятся к августу 2012 года. Между тем, Bootstrap изменился, поэтому теперь у вас есть класс .pull-left. Тогда мой ответ был правильным. Теперь вам не нужно вручную устанавливать css, у вас есть класс .pull-left.

РЕДАКТИРОВАТЬ 2: демонстрации не работают, потому что Bootstrap изменил свои URL-адреса. Просто измените внешние ресурсы в jsfiddle и замените их новыми.

Милян Пузович
источник
Спасибо. Однако почти то, что мне нужно, должно быть left: -90%;(иначе я не могу переместить курсор в это подменю, потому что оно исчезнет).
kovpack
Как я уже сказал, это всего лишь идея, что вам нужно делать. Рад, что мне помогли :)
Мильян Пузович
Ваш пример работает только для определенных случаев. Смотрите здесь: jsfiddle.net/mQnv2/305
Alexandru R
Это неправильный ответ, поскольку следует использовать классы начальной загрузки, как указано в сообщениях Шмальзи и Мэтта.
KeyOfJ
1
Этот пост на год старше. Между тем, бутстрап изменен, поэтому ответ Шмальзи более элегантен. Тогда в Bootstrap не было класса pull-left.
Мильян Пузович
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
TheBear
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; }Для размещения текста справа, когда стрелка находится влево.
Arvind
4

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

Проверено в:

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

потому что я не хочу добавлять это исправление в каждый пункт меню, я создал для него новый класс. поместите фиксированное меню на ul:

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

Я надеюсь, что это сработает для вас.

пс. небольшая ошибка в Safari и Chrome, при первом наведении указатель мыши переместит его в положение «mutch влево», обновит этот пост, если я исправлю его.

Митчел Верчоф
источник
+1: Я внес несколько изменений, но это привело меня к рабочему решению.
zimdanen
Отличное решение!
arefin2k
4

Если у вас только один уровень и вы используете bootstrap 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

Если вы используете LESS 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
}

Затем, чтобы переместить, например, .dropdown-menuидентификатор dropdown-menu-x, вы можете:

#dropdown-menu-x {
    .dropdown-menu-shift( -100px );
}
Isapir
источник
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

Вы используете последнюю версию бутстрапа? Я адаптировал 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>
Ник
источник
Это не совсем то, что мне нужно. Это просто раскрывающийся список (я также использую pull-right или pull-left). Но мне нужно открыть подменю IN SUBMENU и сделать его открытым слева (в раскрывающемся списке должна быть стрелка, указывающая на существование подменю, которое должно открываться слева, а не справа, как это делает стандартное).
kovpack
0

Единственное, что тебе нужно сделать, это

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

меню, которое вы хотите отобразить на ПРАВОЙ стороне.

Манодж Джайн
источник