как сделать так, чтобы твиттер загрузил подменю с левой стороны?

75

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

  • 6
    Разместите код фрагмента.
  • 2
    В Bootstrap 4 добавьте .pull-right в контейнер .dropdown .

10 ответов

106
Лучший ответ

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

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

jsfiddle: DEMO

  • 0
    Этот ответ вместе с ответом Мэтта для уровня UL являются правильным способом реализовать это при использовании начальной загрузки.
  • 1
    Вопрос ОП и мой ответ с августа 2012 года. Между тем, Bootstrap изменился, так что теперь у вас есть класс .pull-left. Тогда мой ответ был верным. Теперь вам не нужно вручную устанавливать css, у вас есть этот класс .pull-left.
Показать ещё 5 комментариев
107

Если я понял это правильно, bootstrap предоставляет класс CSS только для этого случая. Добавьте "pull-right" в меню "ul":

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

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

  • 2
    Отличное дополнение Мэтт на уровне UL.
  • 2
    абсолютно, мне нужно главное меню, а не подменю, чтобы переместиться. поэтому мне нужно было нацелиться на элемент <ul>. это сбивает с толку, потому что вы хотите переместить его влево, однако для этого вы используете класс pull-right .
Показать ещё 6 комментариев
24

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

Вот DEMO

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

EDIT 2: демонстрации не работают, потому что Bootstrap изменил свой URL. Просто измените внешние ресурсы в jsfiddle и замените их новыми.

  • 0
    Благодарю. Почти точно то, что мне нужно, однако, должно быть left: -90%; (в противном случае я не могу переместить свою мышь в это подменю, потому что оно исчезает).
  • 0
    Как я уже сказал, это просто идея, что вам нужно сделать. Рад, что мне помогли :)
Показать ещё 7 комментариев
11

Правильный способ выполнения задачи:

/* 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; }
  • 0
    Больше предпочтений .dropdown-submenu { position: relative; text-align:right; } Чтобы расположить текст вправо, когда стрелка находится слева.
9

Если вы используете bootstrap v4, есть новый способ сделать это.

Вы должны использовать .dropdown-menu-right в элементе .dropdown-menu.

Ссылка на код: http://v4-alpha.getbootstrap.com/components/dropdowns/#menu-alignment

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

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

пс. небольшая ошибка в сафари и хром, сначала наведите курсор налево, обновите этот пост, если я его исправил.

  • 0
    +1: я сделал несколько изменений, но это привело меня к рабочему решению.
  • 0
    Отличное решение!
2

Если у вас есть только один уровень, и вы используете bootstrap 3, добавьте pull-right в элемент ul

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

На самом деле - если вы в порядке с плавающей оболочкой 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>
0

Если вы используете LESS CSS, я написал немного mixin для перемещения выпадающего списка со стрелкой:

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню