2017-05-12 11 views
0

BootstrapとjQueryでMacOSのドロップダウンの動作を再現しようとしています。目的の動作は、クリック時に表示/非表示になりますが、再度クリックするまで、ドロップダウンの間を移動しながらホバーに表示されます。MacOSのドロップダウン動作をエミュレートしようとしています

私はすでにいくつか急いで書かれたjQueryを使って希望の動作のほとんどを達成した:

$(document).ready(function() { 
    $(".dropdown").on("click", function(event){ 
     $('.dropdown').addClass('show-on-hover'); 
    }); 

    $('.nav').on('mouseenter', 'li.show-on-hover', function() { 
     $('.dropdown.open').removeClass('open'); 
     $(this).addClass('open'); 
    }); 

    $('.nav').on('click', 'li.show-on-hover.open', function() { 
     $('.dropdown').removeClass('show-on-hover'); 
    }); 
}); 

が、私は、私はドロップダウンリストの外側をクリックすると、他の人はまだホバー上でアクティブ1つの問題(shouldnを持っていますその時点でクリックするだけで再開する必要があります)。どのようにこの問題を解決するか、そして/またはこのタイプのドロップダウン動作に対するより良い解決策の提案は、非常に高く評価されます。

たとえば、この動作をCSSで行うことができれば、これはすばらしいことです。

https://codepen.io/jakatz/pen/NjMgRg

答えて

1

ロジックは、実際には非常に簡単です:あなたは、単にあなたの希望の行動のための二重クリック結合パターンを使用する必要があります。

  1. .dropdown上のイベントをクリックして、ショー・オン有効に聞きます#2を妨害しないように、DOMツリーをバブリング/プロパゲーションするのを止めてください。これは、単にevent.stopPropagation()
  2. は基本的に、我々は上記のロジックでやっているショー・オン・ホバー効果

を無効にするために使用される、文書上のイベントをクリックして聞いて呼び出すことによって行われていることは、次のとおりです。

  1. クリックイベントは、どこか他のドロップダウン
からより放出されたときにクリックイベントがドロップダウン
  • 無効にショーオンホバーから放出されるたびショーオンホバーを有効にします

    ロジックを変更し、ロジックを追加しました。下のコードで概念実証を参照してください(コードスニペットにはモバイル/ナロービューポートビューが表示されるため、フルスクリーンで表示することをお勧めします)。このようにうまく書かれた説明のための

    $(function() { 
     
        // Allow show on hover when dropdowns are clicked on 
     
        $('.dropdown').on('click', function(event) { 
     
        
     
        // Allow all dropdowns to show on hover 
     
        $('.dropdown').addClass('show-on-hover'); 
     
        
     
        // Open menu 
     
        $(this).toggleClass('open'); 
     
        
     
        // Prevent click event from bubbling up to document 
     
        event.stopPropagation(); 
     
        }); 
     
    
     
        // Disable show on hover when click event is emitted from anywhere else 
     
        $(document).on('click', function(event) { 
     
        $('.dropdown').removeClass('show-on-hover'); 
     
        }); 
     
    
     
        // Show on hover behavior 
     
        $('.nav').on('mouseenter', 'li.show-on-hover', function() { 
     
        $('.dropdown.open').removeClass('open'); 
     
        $(this).addClass('open'); 
     
        }); 
     
    });
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> 
     
    <script src="https://maxcdn.bootstrapcdn.com/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" /> 
     
    
     
    <nav class="navbar navbar-default"> 
     
        <div class="container-fluid"> 
     
        <!-- Brand and toggle get grouped for better mobile display --> 
     
        <div class="navbar-header"> 
     
         <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> 
     
         <span class="sr-only">Toggle navigation</span> 
     
         <span class="icon-bar"></span> 
     
         <span class="icon-bar"></span> 
     
         <span class="icon-bar"></span> 
     
         </button> 
     
         <a class="navbar-brand" href="#">Brand</a> 
     
        </div> 
     
    
     
        <!-- Collect the nav links, forms, and other content for toggling --> 
     
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> 
     
         <ul class="nav navbar-nav"> 
     
         <li class="dropdown"> 
     
          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></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 role="separator" class="divider"></li> 
     
          <li><a href="#">Separated link</a></li> 
     
          <li role="separator" class="divider"></li> 
     
          <li><a href="#">One more separated link</a></li> 
     
          </ul> 
     
         </li> 
     
         <li class="dropdown"> 
     
          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></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 role="separator" class="divider"></li> 
     
          <li><a href="#">Separated link</a></li> 
     
          <li role="separator" class="divider"></li> 
     
          <li><a href="#">One more separated link</a></li> 
     
          </ul> 
     
         </li> 
     
         <li class="dropdown"> 
     
          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></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 role="separator" class="divider"></li> 
     
          <li><a href="#">Separated link</a></li> 
     
          <li role="separator" class="divider"></li> 
     
          <li><a href="#">One more separated link</a></li> 
     
          </ul> 
     
         </li> 
     
         </ul> 
     
         <ul class="nav navbar-nav navbar-right"> 
     
         <li class="dropdown"> 
     
          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></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 role="separator" class="divider"></li> 
     
          <li><a href="#">Separated link</a></li> 
     
          </ul> 
     
         </li> 
     
         </ul> 
     
        </div> 
     
        <!-- /.navbar-collapse --> 
     
        </div> 
     
        <!-- /.container-fluid --> 
     
    </nav>

  • +0

    ありがとう!とても有難い。 –

    関連する問題