Twitterのブートストラップサブメニューを左側に開く方法は?


93

ドロップダウンメニューでTwitterブートストラップサブメニューを作成しようとしましたが、問題があります。ページの右上隅にドロップダウンメニューがあり、そのメニューにはもう1つのサブメニューがあります。ただし、サブメニューが開いたとき-ウィンドウに収まらず、右に移動しすぎるため、ユーザーは最初の文字しか表示できません。そのサブメニューを右ではなく左に開く方法は?


6
スニペットコードを投稿します。
Shankar Cabus 2012

2
Bootstrap 4で.pull-right.dropdownコンテナーを追加します。
jbyrd

回答:


109

最も簡単な方法は、pull-leftクラスをあなたに追加することですdropdown-submenu

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

jsfiddle:デモ


この回答とマットによるULレベルの回答は、ブートストラップを使用するときにこれを実装する正しい方法です。
KeyOfJ 2014

1
OPの質問と私の答えは2012年8月からです。その間、Bootstrapが変更されたため、.pull-leftクラスがあります。当時、私の答えは正しかった。これでcssを手動で設定する必要がなくなり、.pull-leftクラスができました。
ミルジャンプゾビッチ14年

1
これは場合によってはうまく機能しますが、次のフィドルのように、メインメニューの項目が長すぎると機能しなくなります。jsfiddle.net / szx4Y / 446 誰もが修正のための迅速なアイデアを持っていますか?
アーロンリフシン2015年

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

私がこの権利を理解していれば、ブートストラップはまさにこのケースのためのCSSクラスを提供します。メニュー「ul」に「pull-right」を追加します。

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

..最終的には、メニューオプションは、ドロップダウンしたボタンに合わせて右揃えで表示されます。


2
ULレベルでマットを追加。
KeyOfJ 2014

2
絶対に、サブメニューではなくメインメニューが必要でした。したがって、<ul>要素をターゲットにする必要がありました。左に移動したいので混乱しますが、pull-rightこれを実現するにはクラスを使用します。
FireDragon 2014

1
この回答はBootstrap 3.xに有効であるため、現時点ではこれが最も正しい回答のようです。
アルクス2015年

1
受け入れられた回答は私とBootstrap 3では機能しませんが、これは機能します!
Josh Bilderback、2016

1
これは正しいです。.pull-rightを追加すると、ドロップダウンが画面の右側から外れなくなります。
slindsey3000 2016

26

現在のクラス.dropdown-submenu > .dropdown-menuは持っていleft: 100%;ます。そのため、左側のサブメニューを開きたい場合は、これらの設定を左側の負の位置に上書きします。例えばleft: -95%;。左側にサブメニューが表示されるので、他の設定を調整して完璧なプレビューを取得できます。

こちらがデモです

編集:OPの質問と私の答えは2012年8月からです。一方、Bootstrapが変更されたため、.pull-leftクラスがあります。当時、私の答えは正しかった。これでcssを手動で設定する必要がなくなり、.pull-leftクラスができました。

編集2:BootstrapがURLを変更したため、デモは機能していません。jsfiddleで外部リソースを変更して、新しいリソースに置き換えるだけです。


ありがとう。ただし、ほぼ正確に必要なものが存在するはずですleft: -90%;(そうでなければ、マウスをそのサブメニューに移動できないため、表示されなくなります)。
kovpack 2012

私が言ったように、それはあなたが何をする必要があるかという単なる考えです。助けられてうれしい:)
MiljanPuzović

あなたの例は特定の場合にのみ機能します。ここを見てください:jsfiddle.net/mQnv2/305
Alexandru R

SchmalzyとMattの投稿で述べられているように、ブートストラップクラスを使用する必要があるため、これは正しい答えではありません。
KeyOfJ 2014

1
この投稿は1年前のものです。一方、ブートストラップは変更されているため、シュマルジの答えはよりエレガントです。当時、Bootstrapにはpull-leftクラスがありませんでした。
ミルジャンプゾビッチ14年

20

ブートストラップ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


これはまた、ブートストラップのバージョン> = 3.1のために働く...このチェックstackoverflow.com/a/19253730/3354228を
The.Bear


バージョン4のための構文はに変更されましたこれはやや正確であるdropleftdroprightが、答えのコンテキストが正しいです。ありがとう!
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 2016年

4

彼が右側に十分なスペースがあるかどうかを確認するJavaScript関数を作成しました。持っている場合は右側に表示され、それ以外の場合は左側に表示されます

テスト済み:

  • Firefox(Mac)
  • Chorme(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 2013年

素晴らしいソリューション!
arefin2k 2017年

4

レベルが1つだけで、ブートストラップ3を使用する場合はpull-rightul要素に追加します

<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-menuidでaを移動するには、次の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

最新バージョンのブートストラップを使用していますか?以下に示すように、Fluid Layoutの例の 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>

これは私が必要とするものではありません。これは単なるドロップダウンです(私はまた、右または左を使用しています)。しかし、サブメニューでサブメニューを開き、左に開くようにする必要があります(ドロップダウンには、標準メニューのように、右ではなく左に開くサブメニューの存在を示す矢印が表示されます)。
kovpack 2012

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.