クリックするのではなく、マウスオーバーでTwitterブートストラップメニューのドロップダウンを作成する方法


1181

ブートストラップメニューをメニュータイトルをクリックするのではなく、カーソルを合わせると自動的にドロップダウンしたいのですが。メニュータイトルの横にある小さな矢印も失いたいと思います。


9
それに対する解決策があるので、ミッコの答えは正しいですが、今は具体的にその状況のた​​めのプラグインで覆われています。bootstrap-
hover

2
以下のCSSおよびjsソリューションの問題を防ぎ、iOSおよびタッチイベントを備えた最新のデスクトップブラウザーで正常に動作する、新しく公開された適切なプラグインを参照してください。:でも、ARIAの属性はそれで正常に動作しているgithub.com/istvan-ujjmeszaros/bootstrap-dropdown-hover
イシュトUjj-Mészáros

ブートストラップナビゲーションバーで純粋なCSS3ドロップダウンを作成しました。CodePenで確認してください。純粋なCSS3ドロップダウン
Gothburz

18
あなたが本当にそれを必要とするなら、二度考えますか?ブートストラップはアダプティブサイトに使用しています。つまり、タッチコントロールを備えたデバイスでも使用されます。それがこのように設計されている理由です。タッチスクリーンに「ホバー」はありません。
Serj。、2016

回答:


590

複数のサブメニューをサポートする最新の(v2.0.2)Bootstrapフレームワークに基づいて、純粋なホバードロップダウンメニューを作成し、将来のユーザーのために投稿すると思いました。

body {
  padding-top: 60px;
  padding-bottom: 40px;
}

.sidebar-nav {
  padding: 9px 0;
}

.dropdown-menu .sub-menu {
  left: 100%;
  position: absolute;
  top: 0;
  visibility: hidden;
  margin-top: -1px;
}

.dropdown-menu li:hover .sub-menu {
  visibility: visible;
}

.dropdown:hover .dropdown-menu {
  display: block;
}

.nav-tabs .dropdown-menu,
.nav-pills .dropdown-menu,
.navbar .dropdown-menu {
  margin-top: 0;
}

.navbar .sub-menu:before {
  border-bottom: 7px solid transparent;
  border-left: none;
  border-right: 7px solid rgba(0, 0, 0, 0.2);
  border-top: 7px solid transparent;
  left: -7px;
  top: 10px;
}

.navbar .sub-menu:after {
  border-top: 6px solid transparent;
  border-left: none;
  border-right: 6px solid #fff;
  border-bottom: 6px solid transparent;
  left: 10px;
  top: 11px;
  left: -6px;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.2/css/bootstrap.min.css" rel="stylesheet" />

<div class="navbar navbar-fixed-top">
  <div class="navbar-inner">
    <div class="container-fluid">
      <a data-target=".nav-collapse" data-toggle="collapse" class="btn btn-navbar">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </a>
      <a href="#" class="brand">Project name</a>
      <div class="nav-collapse">
        <ul class="nav">
          <li class="active"><a href="#">Home</a></li>
          <li><a href="#">Link</a></li>
          <li><a href="#">Link</a></li>
          <li><a href="#">Link</a></li>
          <li class="dropdown">
            <a data-toggle="dropdown" class="dropdown-toggle" href="#">Dropdown <b class="caret"></b></a>
            <ul class="dropdown-menu">
              <li>
                <a href="#">2-level Dropdown <i class="icon-arrow-right"></i></a>
                <ul class="dropdown-menu sub-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>
              <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>
        <form action="" class="navbar-search pull-left">
          <input type="text" placeholder="Search" class="search-query span2">
        </form>
        <ul class="nav pull-right">
          <li><a href="#">Link</a></li>
          <li class="divider-vertical"></li>
          <li class="dropdown">
            <a class="#" href="#">Menu</a>
          </li>
        </ul>
      </div>
      <!-- /.nav-collapse -->
    </div>
  </div>
</div>

<hr>

<ul class="nav nav-pills">
  <li class="active"><a href="#">Regular link</a></li>
  <li class="dropdown">
    <a href="#" data-toggle="dropdown" class="dropdown-toggle">Dropdown <b class="caret"></b></a>
    <ul class="dropdown-menu" id="menu1">
      <li>
        <a href="#">2-level Menu <i class="icon-arrow-right"></i></a>
        <ul class="dropdown-menu sub-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>
      <li><a href="#">Another action</a></li>
      <li><a href="#">Something else here</a></li>
      <li class="divider"></li>
      <li><a href="#">Separated link</a></li>
    </ul>
  </li>
  <li class="dropdown">
    <a href="#">Menu</a>
  </li>
  <li class="dropdown">
    <a href="#">Menu</a>
  </li>
</ul>

デモ


54
ホバーイベントでドロップダウンを開かないようにするのは、ブートストラップの設計上の決定です...
caarlos0

18
とても良い!またclass="dropdown-toggle" data-toggle="dropdown"、クリックではなくホバーのみがメニューをトリガーするように削除しました。レスポンシブスタイルを使用している場合でも、メニューは右上にある小さなボタンにスイープされ、クリックによってトリガーされます。本当にありがとう!
ptim 2013年

11
(例えば携帯電話のような)より小さなデバイス上のドロップダウン自動車を避け、aonly例えば768pxの最小幅のとしてそれを許す行うには、@media (min-width: 768px) {.dropdown-menu li:hover .sub-menu {visibility: visible;}}@media (min-width: 768px) {.dropdown:hover .dropdown-menu {display: block;}}
クリスAelbrecht

1
また、子とのリンクをクリック可能にするには、<a>タグの "data-toggle = 'dropdown'"を削除する必要があります。
joan16v 2014年

2
最新のBootstrap 3バージョンで動作するコードを次に示し
Stefan Gruenwald

910

メニューをホバーに自動的にドロップするには、基本的なCSSを使用してこれを実現できます。セレクターを非表示のメニューオプションに設定し、適切なliタグがホバーされたときにブロックとして表示するように設定する必要があります。twitterのブートストラップページから例をとると、セレクターは次のようになります。

ul.nav li.dropdown:hover > ul.dropdown-menu {
    display: block;    
}

ただし、Bootstrapのレスポンシブ機能を使用している場合、折りたたまれたナビゲーションバー(小さい画面)ではこの機能は必要ありません。これを回避するには、上記のコードをメディアクエリでラップします。

@media (min-width: 979px) {
  ul.nav li.dropdown:hover > ul.dropdown-menu {
    display: block;
  }
}

矢印(キャレット)を非表示にするには、Twitter Bootstrapバージョン2以下を使用しているか、バージョン3を使用しているかに応じて、さまざまな方法でこれを行います。

ブートストラップ3

バージョン3でキャレットを削除するには<b class="caret"></b>.dropdown-toggleアンカー要素からHTMLを削除するだけです。

<a class="dropdown-toggle" data-toggle="dropdown" href="#">
    Dropdown
    <b class="caret"></b>    <-- remove this line
</a>

ブートストラップ2以下

バージョン2でキャレットを削除するには、CSSについてもう少し洞察が必要:afterです。疑似要素がどのように機能するかをさらに詳しく調べることをお勧めします。twitterブートストラップの例で矢印をターゲットにして削除するための理解を深めるには、次のCSSセレクターとコードを使用します。

a.menu:after, .dropdown-toggle:after {
    content: none;
}

これらがどのように機能するかをさらに詳しく調べて、私があなたに与えた答えだけを使用するのではない場合、それはあなたに有利に働きます。

サブメニューが親ホバーに表示されないようにするための ">"子コンビネーターが欠落していたことを指摘してくれた@CocaAkatに感謝


79
またmargin: 0;、を追加する必要がありました。追加しない場合、上記の1ピクセルのマージン.dropdown-menuによりバグが発生します。
Salman von Abbas

12
簡単な解決策ですが、親リンクはまだクリックできません。私はルーツをテーマにした最新のブートストラップを使用しています。
Krunal 2012

5
注:はい、あります。これは、Twitterブートストラップがサポートするすべてのブラウザーで機能します。@GeorgeEdisonこれは基本的なCSSです-IE8でサポートされない部分は何ですか?問題がある場合は、誤解を招くようなコメントではなく、質問を投稿してください。
頭が痛い2012

3
@MyHeadHurts:さらなる調査の結果、これは確かにブートストラップのバグであり、5日前にしか修正されなかったことが判明しました
Nathan Osman 2012

5
@Krunalがリンクをクリックできるようにするには、data-toggle="dropdown"属性を削除する必要があります。
Pherrymason 2013

230

「私の頭が痛い」からの答えに加えて(それは素晴らしかった):

ul.nav li.dropdown:hover ul.dropdown-menu{
    display: block;    
}

次の2つの問題があります。

  1. ドロップダウンリンクをクリックすると、ドロップダウンメニューが開きます。また、ユーザーが他の場所をクリックするか、マウスを上に移動しない限り、開いたままになり、扱いにくいUIが作成されます。
  2. ドロップダウンリンクとドロップダウンメニューの間に1pxのマージンがあります。これにより、ドロップダウンメニューとドロップダウンメニューの間をゆっくり移動すると、ドロップダウンメニューが非表示になります。

(1)の解決策は、navリンクから「class」および「data-toggle」要素を削除することです

<a href="#">
     Dropdown
     <b class="caret"></b>
</a>

これにより、親ページへのリンクを作成することもできます。これは、デフォルトの実装では不可能でした。「#」は、ユーザーに送信するページに置き換えることができます。

(2)の解決策は、.dropdown-menuセレクターのmargin-topを削除することです

.navbar .dropdown-menu {
    margin-top: 0px;
}

15
意図的なクリックを修正するために、data-toggle="dropdown"属性を削除しましたが、機能しているようです。
Anthony Briggs

5
ナビピルボタンの解決策(2):.nav-pills .dropdown-menu { margin-top: 0px; }
Loren

1
上記で指摘した問題を解決するには、li.dropdown:hover> ul.dropdown-menu
Archimedes Trajano

12
navリンクから「class」および「data-toggle」属性を削除すると、モバイルおよびタブレットで正常に機能しなくなります:(
Mosijava

1
data-toggle = "dropdown"属性を削除すると、キーボードを使用してドロップダウンメニューを展開できなくなります。したがって、508準拠ではありません。クリックを無効にしてキーボードの機能を維持するにはどうすればよいですか?
duyn9uyen 2015

130

私はjQueryを少し使用しました:

// Add hover effect to menus
jQuery('ul.nav li.dropdown').hover(function() {
  jQuery(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn();
}, function() {
  jQuery(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut();
});

13
このような。とにかくBootstrapのものでJQueryを使用していますが、タッチスクリーンデバイスでデフォルトの「クリック」機能を使用できます。
カスタードのカモ2013年

これを使用しました。私はそれがモバイルでもクリック機能も同様に可能にするのが好きですが、デスクトップではホバーが完璧です。
Stuart

1
これを使用しましたが、ナビゲーションにないドロップダウンにも使用できるように拡張しました。私はbtn-group divにクラスdropdown-hoverを追加し、このjQueryファインダー$( 'ul.nav li.dropdown、.dropdown-hover')。hover(function(){。Thanks!
Brandon

この1つを使用しました。cssバージョンではサブメニューを表示したままにすることができず、200msが速すぎたため、次のように変更しました$('ul.nav li.dropdown').hover(function() { $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn(); }, function() { $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut().hover(function() { $(this).stop(true, true); }); });:サブメニューがホバーストップの場合、フェードアウト
Damien

これは、anguraljsに含まれているjqLit​​eでは機能しないようです
nuander

70

ここには本当に良い解決策がたくさんあります。しかし、私は先に進んで、別の選択肢としてここに私のものを置くと思いました。クリックするだけでなく、ドロップダウンのホバーをサポートする場合にブートストラップが行う方法と同じように、これは単純なjQueryスニペットです。これはバージョン3でのみテストしたので、バージョン2で動作するかどうかはわかりません。エディターでスニペットとして保存し、キーを押すだけで使用できます。

<script>
    $(function() {
        $(".dropdown").hover(
            function(){ $(this).addClass('open') },
            function(){ $(this).removeClass('open') }
        );
    });
</script>

基本的には、ドロップダウンクラスにカーソルを合わせると、オープンクラスが追加されます。その後、それはうまくいきます。ドロップダウンクラスの親liまたは子ul / liのホバーを停止すると、開いているクラスが削除されます。明らかに、これは多くのソリューションの1つにすぎず、.dropdownの特定のインスタンスでのみ機能するように追加できます。または、親または子に遷移を追加します。


2
素晴らしい解決策!また、リンクからdata-toggle = "dropdown"属性を削除して、トップリンクをクリックできるようにしました。
セルゲイ

これは良いヒントです。トップリンクがどこにも表示されないようにして、タブレットや携帯電話でも機能するようにしています。
ステレオ

1
@Sergey私はそれをお勧めしません。あなたはモバイルユーザーのための機能を壊すでしょう。ホバー機能を使用してメニューを開くことはできないため、メニューをクリックできる必要があります。
Paul

2
これは驚くほど短くて簡単ですが、タッチスクリーンとの下位互換性があります。はるかに賛成する必要があります。
最大

これは本当によさそうだ。CSSトランジションを使用してアニメーションを少し追加する方法はありますか?
Fred Rocha 2017

69

3行のコードでCSSスタイルをカスタマイズするだけです

.dropdown:hover .dropdown-menu {
   display: block;
}

22

次のdropdownようなクラスの要素がある場合(例):

<ul class="list-unstyled list-inline">
    <li class="dropdown">
        <a data-toggle="dropdown" href="#"><i class="fa fa-bars"></i> Dropdown 1</a>
        <ul class="dropdown-menu">
            <li><a href="">Item 1</a></li>
            <li><a href="">Item 2</a></li>
            <li><a href="">Item 3</a></li>
            <li><a href="">Item 4</a></li>
            <li><a href="">Item 5</a></li>
        </ul>
    </li>
    <li class="dropdown">
        <a data-toggle="dropdown" href="#"><i class="fa fa-user"></i> Dropdown 2</a>
        <ul class="dropdown-menu">
            <li><a href="">Item A</a></li>
            <li><a href="">Item B</a></li>
            <li><a href="">Item C</a></li>
            <li><a href="">Item D</a></li>
            <li><a href="">Item E</a></li>
        </ul>
    </li>
</ul>

次に、jQueryコードの次のスニペットを使用することにより、タイトルをクリックする必要がなく、ホバーオーバー時にドロップダウンメニューを自動的にドロップダウンさせることができます。

<script>
    $('.dropdown').hover(
        function() {
            $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn();
        },
        function() {
            $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut();
        }
    );

    $('.dropdown-menu').hover(
        function() {
            $(this).stop(true, true);
        },
        function() {
            $(this).stop(true, true).delay(200).fadeOut();
        }
    );
</script>

ここにデモがあります

この回答は@Michaelの回答に依存していました。ドロップダウンメニューが適切に機能するように、いくつかの変更と追加を行いました。


完璧です。どうもありがとう。
antikbd 2018

20

[更新]プラグインはGitHubにありますあり、いくつかの改善に取り組んでいます(データ属性でのみ使用する(JSは不要)など)。コードは以下に残しておきますが、GitHubにあるものとは異なります。

私は純粋にCSSバージョンが好きでしたが、閉じる前に遅延があるといいです。通常、それはユーザーエクスペリエンスが優れている(つまり、ドロップダウンから1ピクセル外に出るマウススリップなどに罰せられない)と、コメントで述べたとおりです。 、対処する必要のある1pxのマージンがあるか、元のボタンからドロップダウンに移動しているときにナビゲーションが予期せず閉じる場合があります。

いくつかのサイトで使用した小さな小さなプラグインを作成しましたが、うまく機能しました。各ナビゲーション項目は個別に処理されるため、独自の遅延タイマーなどがあります。

JS

// outside the scope of the jQuery plugin to
// keep track of all dropdowns
var $allDropdowns = $();

// if instantlyCloseOthers is true, then it will instantly
// shut other nav items when a new one is hovered over
$.fn.dropdownHover = function(options) {

    // the element we really care about
    // is the dropdown-toggle's parent
    $allDropdowns = $allDropdowns.add(this.parent());

    return this.each(function() {
        var $this = $(this).parent(),
            defaults = {
                delay: 500,
                instantlyCloseOthers: true
            },
            data = {
                delay: $(this).data('delay'),
                instantlyCloseOthers: $(this).data('close-others')
            },
            options = $.extend(true, {}, defaults, options, data),
            timeout;

        $this.hover(function() {
            if(options.instantlyCloseOthers === true)
                $allDropdowns.removeClass('open');

            window.clearTimeout(timeout);
            $(this).addClass('open');
        }, function() {
            timeout = window.setTimeout(function() {
                $this.removeClass('open');
            }, options.delay);
        });
    });
};  

delayパラメータはかなり自明です、とinstantlyCloseOthersときにホバー新しい1以上開いています瞬時に近い他のすべてのドロップダウン。

純粋なCSSではありませんが、うまくいけば、この遅い時間に他の人を助けてくれるでしょう(つまり、これは古いスレッドです)。

必要に応じて、#concrete5この要点のさまざまな手順で動作するように(IRCのディスカッションで)実行したさまざまなプロセスを確認できます:https : //gist.github.com/3876924

プラグインパターンアプローチは、個々のタイマーなどをサポートするのにはるかにクリーンです。

詳細については、ブログ投稿を参照してください。


17

これは私のために働きました:

.dropdown:hover .dropdown-menu {
    display: block;
}

1
しかし、モバイルでは-それは奇妙です。
2016年

メニューとドロップダウンメニューの間のマージンにより、これは役に立たなくなります。
antikbd 2018

15

これはBootstrap 3に組み込まれています。これをCSSに追加するだけです。

.dropdown:hover .dropdown-menu {
    display: block;
}

10

jQueryでさらに良く:

jQuery('ul.nav li.dropdown').hover(function() {
  jQuery(this).find('.dropdown-menu').stop(true, true).show();
  jQuery(this).addClass('open');
}, function() {
  jQuery(this).find('.dropdown-menu').stop(true, true).hide();
  jQuery(this).removeClass('open');
});

3
jQuery('ul.nav li.dropdown').hover(function() { jQuery(this).closest('.dropdown-menu').stop(true, true).show(); jQuery(this).addClass('open'); }, function() { jQuery(this).closest('.dropdown-menu').stop(true, true).hide(); jQuery(this).removeClass('open'); });サブメニューがホバーに表示されないようにコードを変更しました。
farjam 2012

このコードは、最新のリリースでは機能しなくなります。
Paul

9

デフォルトの$().dropdown('toggle')方法を使用して、ホバーのドロップダウンメニューを切り替えることができます。

$(".nav .dropdown").hover(function() {
  $(this).find(".dropdown-toggle").dropdown("toggle");
});

9

追加したいのは、(私がするように)複数のドロップダウンがある場合は、次のように記述することです。

ul.nav li.dropdown:hover > ul.dropdown-menu {
    display: block;    
}

そして、それは適切に動作します。


私の.dropdown-menuはmargin: 2px 0 0;、上からの遅いmouseEnterがメニューを時期尚早に隠してしまうことを意味していました。 ul.dropdown-menu{ margin-top: 0; }
Alastair 2013

8

私の意見では、最良の方法は次のとおりです:

;(function($, window, undefined) {
    // Outside the scope of the jQuery plugin to
    // keep track of all dropdowns
    var $allDropdowns = $();

    // If instantlyCloseOthers is true, then it will instantly
    // shut other nav items when a new one is hovered over
    $.fn.dropdownHover = function(options) {

        // The element we really care about
        // is the dropdown-toggle's parent
        $allDropdowns = $allDropdowns.add(this.parent());

        return this.each(function() {
            var $this = $(this),
                $parent = $this.parent(),
                defaults = {
                    delay: 500,
                    instantlyCloseOthers: true
                },
                data = {
                    delay: $(this).data('delay'),
                    instantlyCloseOthers: $(this).data('close-others')
                },
                settings = $.extend(true, {}, defaults, options, data),
                timeout;

            $parent.hover(function(event) {

                // So a neighbor can't open the dropdown
                if(!$parent.hasClass('open') && !$this.is(event.target)) {
                    return true;
                }

                if(settings.instantlyCloseOthers === true)
                    $allDropdowns.removeClass('open');

                window.clearTimeout(timeout);
                $parent.addClass('open');
            }, function() {
                timeout = window.setTimeout(function() {
                    $parent.removeClass('open');
                }, settings.delay);
            });

            // This helps with button groups!
            $this.hover(function() {
                if(settings.instantlyCloseOthers === true)
                    $allDropdowns.removeClass('open');

                window.clearTimeout(timeout);
                $parent.addClass('open');
            });

            // Handle submenus
            $parent.find('.dropdown-submenu').each(function(){
                var $this = $(this);
                var subTimeout;
                $this.hover(function() {
                    window.clearTimeout(subTimeout);
                    $this.children('.dropdown-menu').show();

                    // Always close submenu siblings instantly
                    $this.siblings().children('.dropdown-menu').hide();
                }, function() {
                    var $submenu = $this.children('.dropdown-menu');
                    subTimeout = window.setTimeout(function() {
                        $submenu.hide();
                    }, settings.delay);
                });
            });
        });
    };

    $(document).ready(function() {
        // apply dropdownHover to all elements with the data-hover="dropdown" attribute
        $('[data-hover="dropdown"]').dropdownHover();
    });
})(jQuery, this);

マークアップの例:

<li class="dropdown">
    <a href="#" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" data-delay="1000" data-close-others="false">
        Account <b class="caret"></b>
    </a>
    <ul class="dropdown-menu">
        <li><a tabindex="-1" href="#">My Account</a></li>
        <li class="divider"></li>
        <li><a tabindex="-1" href="#">Change Email</a></li>
        <li><a tabindex="-1" href="#">Change Password</a></li>
        <li class="divider"></li>
        <li><a tabindex="-1" href="#">Logout</a></li>
    </ul>
</li>

5
これはキャメロンスピアの仕事で、私は彼にshoutoutを与えるだろうと思った:cameronspear.com/blog/bootstrap-dropdown-on-hover-plugin
ケルピー

8

これを行う最良の方法は、ホバーでBootstrapのクリックイベントをトリガーすることです。このようにして、それはまだタッチデバイスフレンドリーのままである必要があります。

$('.dropdown').hover(function(){ 
  $('.dropdown-toggle', this).trigger('click'); 
});

望ましくない結果:mousein、click、mouseoutはメニューを開いたままにします。これは私が望んでいることではありません...
Wietse

これを使用して、ブートストラップ関数を実行してドロップダウンを開きます。その関数は、aria-expanded = "true"などのその他の多くのことを実行します
Farhad Sakhaei

7

私はそれを次のように管理しました:

$('ul.nav li.dropdown').hover(function(){
       $(this).children('ul.dropdown-menu').slideDown(); 
    }, function(){
       $(this).children('ul.dropdown-menu').slideUp(); 
});

これが誰かに役立つことを願っています...


5

また、margin-top:0を追加して、.dropdown-menuのブートストラップcssマージンをリセットし、ユーザーがドロップダウンメニューからメニューリストにゆっくり移動したときにメニューリストが消えないようにしました。

ul.nav li.dropdown:hover > ul.dropdown-menu {
    display: block;    
}

.nav .dropdown-menu {
    margin-top: 0;
}

2
これは正解です。マウスがドロップダウンメニューの外に出なければ、ブートストラップはドロップダウンにホバーする準備ができています。margin-topを削除すると、リンクが切れずにメニューに移動できるため、メニューを自動的に閉じる必要がなくなります。このソリューションにより、タッチデバイスの正しい動作を維持できます
Nicolas Janel '

5

これはおそらく愚かな考えですが、下向きの矢印を削除するには、

<b class="caret"></b>

しかし、これは上向きのものには何もしません...


5

Bootstrap 3ドロップダウンホバー機能用の適切なプラグインを公開しました。このプラグインでは、dropdown-toggle要素をクリックしたときの動作を定義することもできます(クリックを無効にすることができます)。

https://github.com/istvan-ujjmeszaros/bootstrap-dropdown-hover


すでに多くの解決策があるのになぜそれを作ったのですか?

以前に存在していたすべてのソリューションに問題がありました。シンプルなCSSはの.openクラスを使用していない.dropdownため、ドロップダウンが表示されている場合、ドロップダウントグル要素に対するフィードバックはありません。

jsのものはをクリックすることを妨げている.dropdown-toggleので、ドロップダウンはホバーに表示され、開いているドロップダウンをクリックすると非表示になり、マウスを移動するとドロップダウンがトリガーされて再び表示されます。一部のjsソリューションはiOSの互換性を壊し、一部のプラグインはタッチイベントをサポートしている最新のデスクトップブラウザーで動作しません。

そのため、私は標準のBootstrap JavaScript APIのみを使用して、ハックなしでこれらの問題をすべて防止するBootstrap Dropdown Hover プラグインを作成しました。Aria属性でさえ、このプラグインで正常に機能しています。


github.com/vadikom/smartmenusについてどう思いますか?私には決められません、どちらのライブラリも本当に良いようです。
Csaba Toth 2016年

2
Smartmenusは本当に見栄えが良いですが、メニューにはもっと良いかもしれません。私のプラグインは、ブートストラップドロップダウンへのほんの小さな追加です。ホバー時にドロップダウンを開くだけですが、smartmenuはサブメニューもサポートし、他のいくつかの素晴らしいことをします。
–IstvánUjj-Mészáros2016

1
ありがとう。smartmenuのコードは非常に広範囲で、CSSもたくさんあるようです。これまでのところbootstrap-dropdown-hover、でうまくいきました。左側のナビゲーションバーで着陸地点を構築しています。
Csaba Toth 2016年

4

このコードを使用して、マウスホバーでサブメニューを開きます(デスクトップのみ)。

$('ul.nav li.dropdown').hover(function () {
    if ($(window).width() > 767) {
        $(this).find('.dropdown-menu').show();
    }
}, function () {
    if ($(window).width() > 767) {
        $(this).find('.dropdown-menu').hide().css('display','');
    }
});

また、ファーストレベルメニューをクリック可能にしたい場合は、モバイル上でもこれを追加します。

    $('.dropdown-toggle').click(function() {
    if ($(this).next('.dropdown-menu').is(':visible')) {
        window.location = $(this).attr('href');
    }
});

サブメニュー(ドロップダウンメニュー)は、デスクトップではマウスホバーで、モバイルとタブレットではクリック/タッチで開きます。サブメニューが開いたら、2回目のクリックでリンクを開くことができます。のおかげif ($(window).width() > 767)で、サブメニューはモバイルで全画面幅になります。


コードを使用したいのですが、コードが正しく機能しません。最初に、モバイルでhover()を削除してデスクトップでのみ使用する方法は?コードを使用して、ウィンドウのサイズをモバイルに変更すると、hover()とclick()の両方の機能が得られます。しかし、さらに奇妙なのは、この動作が停止することです。ブラウザーを更新すると、ha!これを修正する方法を教えてもらえますか?ウィンドウを適切にサイズ変更する場合でもブラウザーを更新しなくても、モバイルでサブメニューを表示するためにhover()およびclick()で表示するデスクトップサブメニューが必要です。これが明確であることを願っています
Chris22

それは理にかなっているので、私はあなたが推奨する方法でソリューションを実行してみます。ありがとう!
Chris22、2017年

この最良の方法を使用してください。@ falter
Farhad Sakhaei


3

これはアップのものを隠します

.navbar .dropdown-menu:before {
   display:none;
}
.navbar .dropdown-menu:after {
   display:none;
}

3

タブレットよりも小さい場合、これによりドロップダウンとそのキャレットが非表示になります。

@media (max-width: 768px) {
    .navbar ul.dropdown-menu, .navbar li.dropdown b.caret {
        display: none;
    }
}

なぜあなたはそれを隠したいのですか?これで、モバイルユーザーはサブメニューにあるリンクにアクセスできなくなります。モバイルデバイスでホバー効果をオフにし、ドロップダウンメニューをそのままにしておくことをお勧めします。そのように彼らはそれをクリックすることによってそれを開くことができます。
Paul

3

jQueryソリューションは優れていますが、ホバーが適切に機能しないため、クリックイベント(モバイルまたはタブレットの場合)に対処する必要があります...ウィンドウのサイズ変更の検出を行うことができますか?

Andres Ilichの回答はうまく機能しているようですが、メディアクエリでラップする必要があります。

@media (min-width: 980px) {

    .dropdown-menu .sub-menu {
        left: 100%;
        position: absolute;
        top: 0;
        visibility: hidden;
        margin-top: -1px;
    }

    .dropdown-menu li:hover .sub-menu {
        visibility: visible;
    }

    .dropdown:hover .dropdown-menu {
        display: block;
    }

    .nav-tabs .dropdown-menu, .nav-pills .dropdown-menu, .navbar .dropdown-menu {
        margin-top: 0;
    }

    .navbar .sub-menu:before {
        border-bottom: 7px solid transparent;
        border-left: none;
        border-right: 7px solid rgba(0, 0, 0, 0.2);
        border-top: 7px solid transparent;
        left: -7px;
        top: 10px;
    }
    .navbar .sub-menu:after {
        border-top: 6px solid transparent;
        border-left: none;
        border-right: 6px solid #fff;
        border-bottom: 6px solid transparent;
        left: 10px;
        top: 11px;
        left: -6px;
    }
}

3

バージョン2の非常にシンプルなソリューションで、CSSのみです。モバイルとタブレットで同じフレンドリーな機能を維持します。

@media (min-width: 980px) {
    .dropdown:hover .dropdown-menu {
       display: block;
    }
}

これは、メニュー項目とドロップダウンの間にギャップがある一部のテーマではうまく機能しません。マウスがこのギャップに移動すると、メニューが消えます。
ndbroadbent

2

このスクリプトでbootstrap.jsを上書きします。

jQuery(document).ready(function ($) {
$('.navbar .dropdown').hover(function() {
    $(this).addClass('extra-nav-class').find('.dropdown-menu').first().stop(true, true).delay(250).slideDown();
}, function() {
    var na = $(this)
    na.find('.dropdown-menu').first().stop(true, true).delay(100).slideUp('fast', function(){ na.removeClass('extra-nav-class') })
});

$('.dropdown-submenu').hover(function() {
    $(this).addClass('extra-nav-class').find('.dropdown-menu').first().stop(true, true).delay(250).slideDown();
}, function() {
    var na = $(this)
    na.find('.dropdown-menu').first().stop(true, true).delay(100).slideUp('fast', function(){ na.removeClass('extra-nav-class') })
});

}); 

2

メニューまたはトグルボタン上でのホバリングを停止した後、メニューが閉じる前にわずかな遅延を追加する私のテクニックは次のとおりです。<button>あなたは、通常のナビゲーションメニューが表示しますということ#nav_dropdown

$(function() {
  var delay_close_it, nav_menu_timeout, open_it;
  nav_menu_timeout = void 0;
  open_it = function() {
    if (nav_menu_timeout) {
      clearTimeout(nav_menu_timeout);
      nav_menu_timeout = null;
    }
    return $('.navbar .dropdown').addClass('open');
  };
  delay_close_it = function() {
    var close_it;
    close_it = function() {
      return $('.navbar .dropdown').removeClass('open');
    };
    return nav_menu_timeout = setTimeout(close_it, 500);
  };
  $('body').on('mouseover', '#nav_dropdown, #nav_dropdown *', open_it).on('mouseout', '#nav_dropdown', delay_close_it);
  return $('body').on('mouseover', '.navbar .dropdown .dropdown-menu', open_it).on('mouseout', '.navbar .dropdown .dropdown-menu', delay_close_it);
});

2

Sudharshanの回答を拡張するために、これをメディアクエリにラップして、XS表示幅でのホバーを防止します...

@media (min-width:768px)
{
    ul.nav li.dropdown:hover > ul.dropdown-menu {
        display: block;    
    }

    .nav .dropdown-menu {
        margin-top: 0;
    }
}

また、マークアップでキャレットはただ、必要とされていないドロップダウンのためのクラス


2

これはWordPressブートストラップで機能します。

.navbar .nav > li > .dropdown-menu:after,
.navbar .nav > li > .dropdown-menu:before {
    content: none;
}

2

だからあなたはこのコードを持っています:

<a class="dropdown-toggle" data-toggle="dropdown">Show menu</a>

<ul class="dropdown-menu" role="menu">
    <li>Link 1</li>
    <li>Link 2</li> 
    <li>Link 3</li>                                             
</ul>

通常はクリックイベントで動作し、ホバーイベントで動作するようにします。これは非常に簡単です。次のJavaScript / jQueryコードを使用してください。

$(document).ready(function () {
    $('.dropdown-toggle').mouseover(function() {
        $('.dropdown-menu').show();
    })

    $('.dropdown-toggle').mouseout(function() {
        t = setTimeout(function() {
            $('.dropdown-menu').hide();
        }, 100);

        $('.dropdown-menu').on('mouseenter', function() {
            $('.dropdown-menu').show();
            clearTimeout(t);
        }).on('mouseleave', function() {
            $('.dropdown-menu').hide();
        })
    })
})

これは非常にうまく機能します。ここに説明があります。ボタンとメニューがあります。ボタンにカーソルを合わせるとメニューが表示され、ボタンからマウスアウトすると100ミリ秒後にメニューが非表示になります。なぜ私がそれを使用するのか疑問に思うのは、メニューの上にあるボタンからカーソルをドラッグする時間が必要だからです。メニューを表示すると、時間がリセットされ、好きなだけそこにとどまることができます。メニューを終了すると、タイムアウトなしでメニューが即座に非表示になります。

私は多くのプロジェクトでこのコードを使用していますが、このコードの使用で問題が発生した場合は、遠慮なく質問してください。

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