web-dev-qa-db-ja.com

ホバー付きブートストラップドロップダウン

わかりました、それで私が必要とすることはかなり簡単です。

ドロップダウンメニューを含むナビゲーションバーを(class="dropdown-toggle" data-toggle="dropdown"を使用して)設定しましたが、問題なく動作します。

問題はそれが "onClick"で動作することですが、それが "onHover"で動作するなら私は好むでしょうが。

これを行うための組み込みの方法はありますか?

163
Dr.Kameleon

最も簡単な解決策はCSSです。のようなものを追加してください...

.dropdown:hover .dropdown-menu {
    display: block;
    margin-top: 0; // remove the gap so it doesn't close
 }

作業の手間

305
brbcoding

最適な方法は、ホバーでブートストラップクリックイベントをトリガーすることです。この方法では、タッチデバイスフレンドリーのままになります。

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

あなたはjQueryのホバー機能を使用することができます。

マウスが入ったときにクラスopenを追加し、マウスがドロップダウンを離れたときにクラスを削除するだけです。

これが私のコードです:

$(function(){
    $('.dropdown').hover(function() {
        $(this).addClass('open');
    },
    function() {
        $(this).removeClass('open');
    });
});
52
adhi

JQueryを使用した簡単な方法はこれです。

$(document).ready(function(){
    $('ul.nav li.dropdown').hover(function() {
      $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn(200);
    }, function() {
      $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut(200);
    });  
});
23
Biagio Chirico

CSSでは、クリックしてもおかしくなります。これは私が使っているコードです、それはまたモバイルビューのために何も変えません。

$('.dropdown').mouseenter(function(){
    if(!$('.navbar-toggle').is(':visible')) { // disable for mobile view
        if(!$(this).hasClass('open')) { // Keeps it open when hover it again
            $('.dropdown-toggle', this).trigger('click');
        }
    }
});
9
user1079877

Twitterではブートストラップ は実装されていません が、あなたは thisプラグイン を使うことができます。

更新1:

Sames question はこちら

6
Emad Mokhtar

ナビゲーションアイテムの上にマウスを移動すると、それらがホバー時にアクティブになることがわかります。 http://cameronspear.com/demos/Twitter-bootstrap-hover-dropdown/#

6
esm

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

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

これは非常にうまく機能し、ここに説明があります。ボタンとメニューがあります。ボタンをホバーするとメニューが表示され、ボタンをマウスアウトすると100ms後にメニューが非表示になります。あなたが私がそれを使う理由を疑問に思うなら、あなたはメニューの上のボタンからカーソルをドラッグする時間が必要だからです。あなたがメニューにいるとき、時間はリセットされ、あなたはあなたが望むだけ多くの時間そこにいることができます。メニューを終了すると、タイムアウトすることなく即座にメニューを非表示にします。

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

フェードインフェードアウトアニメーションでホバー機能を使用してこれを試してください

$('ul.nav li.dropdown').hover(function() {
  $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn(500);
}, function() {
  $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut(500);
});
3
Rakesh Vadnal

これは私がいくつかのjQueryでホバーにドロップダウンするために使用するものです

$(document).ready(function () {
    $('.navbar-default .navbar-nav > li.dropdown').hover(function () {
        $('ul.dropdown-menu', this).stop(true, true).slideDown('fast');
        $(this).addClass('open');
    }, function () {
        $('ul.dropdown-menu', this).stop(true, true).slideUp('fast');
        $(this).removeClass('open');
    });
});
3
Amir5000

適切なプラグインで更新

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

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


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

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

Jsのものは.dropdown-toggleのクリックを妨げているので、ドロップダウンはホバーに表示され、そして開かれたドロップダウンをクリックするとそれを隠し、そしてマウスを動かすとドロップダウンは再び表示されるようにトリガーします。いくつかのjsソリューションはiOSの互換性を妨げています、いくつかのプラグインはタッチイベントをサポートしている最新のデスクトップブラウザで動作していません。

だからこそ、私は Bootstrap Dropdown Hover プラグインを作成しました。これはハックなしで標準のBootstrap javascript APIのみを使用することによってこれらの問題をすべて防ぎます。

私は他の解決策を試してみて、私はブートストラップ3を使用しています

あなたがliにclass = "dropdown"を追加するとしたら、私はタイムアウトを追加しました

var hoverTimeout;
$('.dropdown').hover(function() {
    clearTimeout(hoverTimeout);
    $(this).addClass('open');
}, function() {
    var $self = $(this);
    hoverTimeout = setTimeout(function() {
        $self.removeClass('open');
    }, 150);
});
2
al404IT

これはあなたがブートストラップのためのあなた自身のホバークラスを作るのを助けるでしょう:

CSS:

/* Hover dropdown */
.hover_drop_down.input-group-btn ul.dropdown-menu{margin-top: 0px;}/*To avoid unwanted close*/
.hover_drop_down.btn-group ul.dropdown-menu{margin-top:2px;}/*To avoid unwanted close*/
.hover_drop_down:hover ul.dropdown-menu{
   display: block;
}

マージンは不要なクローズを回避するように設定されており、オプションです。

HTML:

<div class="btn-group hover_drop_down">
  <button type="button" class="btn btn-default" data-toggle="dropdown"></button>
  <ul class="dropdown-menu" role="menu">
    ...
  </ul>
</div>

Onclick openを削除したい場合はbutton属性data-toggle = "dropdown"を削除するのを忘れないでください。ドロップダウンを追加します。

2
Sabri Aziri

あなたがモバイルデバイス上にいないとき、これはナビゲーションバーをホバーするだけです、なぜなら私はナビゲーションをホバーすることがモバイル部門でうまく働かないことを見つけるから:

    $( document ).ready(function() {

    $( 'ul.nav li.dropdown' ).hover(function() {
        // you could also use this condition: $( window ).width() >= 768
        if ($('.navbar-toggle').css('display') === 'none' 
            && false === ('ontouchstart' in document)) {

            $( '.dropdown-toggle', this ).trigger( 'click' );
        }
    }, function() {
        if ($('.navbar-toggle').css('display') === 'none'
            && false === ('ontouchstart' in document)) {

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

});
2
solarbaypilot
    $('.navbar .dropdown').hover(function() {
      $(this).find('.dropdown-menu').first().stop(true, true).slideDown(150);
    }, function() {
      $(this).find('.dropdown-menu').first().stop(true, true).slideUp(105)
    });
1
Waqar Ahmed

clickを使用してhoverイベントをトリガすると、小さなエラーが発生します。もしmouse-inそしてclickがその逆の効果を生み出すならば。 mouse-outの場合はopensmouse-inの場合はcloseです。より良い解決策:

$('.dropdown').hover(function() {
    if (!($(this).hasClass('open'))) {
        $('.dropdown-toggle', this).trigger('click');
    }
}, function() {
    if ($(this).hasClass('open')) {
        $('.dropdown-toggle', this).trigger('click');
    }
});
1
umesh kadam

html

        <div class="dropdown">

            <button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown">
                Dropdown Example <span class="caret"></span>
            </button>

            <ul class="dropdown-menu">
                <li><a href="#">HTML</a></li>
                <li><a href="#">CSS</a></li>
                <li><a href="#">JavaScript</a></li>
            </ul>

        </div> 

お酒

        $(document).ready( function() {                

            /* $(selector).hover( inFunction, outFunction ) */
            $('.dropdown').hover( 
                function() {                        
                    $(this).find('ul').css({
                        "display": "block",
                        "margin-top": 0
                    });                        
                }, 
                function() {                        
                    $(this).find('ul').css({
                        "display": "none",
                        "margin-top": 0
                    });                        
                } 
            );

        });

codepen

0
antelove

私が提案している解決策は、そのデバイスに触れていないかどうか、そしてnavbar-toggle(ハンバーガーメニュー)が表示されず、親メニュー項目にサブメニューを表示させるそしてandが続くことを検出するクリックでリンク

また、ブラウザのナビゲーションバーとメニューの間のギャップによってサブ項目に移動できないため、margin-topを0にすることもできます。

$(function(){
    function is_touch_device() {
        return 'ontouchstart' in window        // works on most browsers 
        || navigator.maxTouchPoints;       // works on IE10/11 and Surface
    };

    if(!is_touch_device() && $('.navbar-toggle:hidden')){
      $('.dropdown-menu', this).css('margin-top',0);
      $('.dropdown').hover(function(){ 
          $('.dropdown-toggle', this).trigger('click').toggleClass("disabled"); 
      });                       
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>

<ul id="nav" class="nav nav-pills clearfix right" role="tablist">
    <li><a href="#">menuA</a></li>
    <li><a href="#">menuB</a></li>
    <li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">menuC</a>
        <ul id="products-menu" class="dropdown-menu clearfix" role="menu">
            <li><a href="">A</a></li>
            <li><a href="">B</a></li>
            <li><a href="">C</a></li>
            <li><a href="">D</a></li>
        </ul>
    </li>
    <li><a href="#">menuD</a></li>
    <li><a href="#">menuE</a></li>
</ul>
$(function(){
  $("#nav .dropdown").hover(
    function() {
      $('#products-menu.dropdown-menu', this).stop( true, true ).fadeIn("fast");
      $(this).toggleClass('open');
    },
    function() {
      $('#products-menu.dropdown-menu', this).stop( true, true ).fadeOut("fast");
      $(this).toggleClass('open');
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>

<ul id="nav" class="nav nav-pills clearfix right" role="tablist">
    <li><a href="#">menuA</a></li>
    <li><a href="#">menuB</a></li>
    <li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">menuC</a>
        <ul id="products-menu" class="dropdown-menu clearfix" role="menu">
            <li><a href="">A</a></li>
            <li><a href="">B</a></li>
            <li><a href="">C</a></li>
            <li><a href="">D</a></li>
        </ul>
    </li>
    <li><a href="#">menuD</a></li>
    <li><a href="#">menuE</a></li>
</ul>
0
GiorgosK

ブートストラップドロップダウンホバーで作業し、cssでプロパティdisplay:block;を追加し、これらの属性を削除することでクリックして閉じるdata-toggle = "ドロップダウン"role = "button"buttonタグから

.dropdown:hover .dropdown-menu {
  display: block;
}
<!DOCTYPE html>
<html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"></script>
</head>
<body>

<div class="container">                                     
  <div class="dropdown">
    <button class="btn btn-primary dropdown-toggle">Dropdown Example
    <span class="caret"></span></button>
    <ul class="dropdown-menu">
      <li><a href="#">HTML</a></li>
      <li><a href="#">CSS</a></li>
      <li><a href="#">JavaScript</a></li>
    </ul>
  </div>
</div>

</body>
</html>
0
Super Model