호버로 부트 스트랩 드롭 다운


179

좋아, 그래서 내가 필요한 것은 매우 간단합니다.

몇 가지 드롭 다운 메뉴가있는 탐색 표시 줄을 설정하고 (사용 class="dropdown-toggle" data-toggle="dropdown") 잘 작동합니다.

문제는 " onClick" 작동하지만 " " 작동 하면 선호합니다 onHover.

이 작업을 수행하는 기본 제공 방법이 있습니까?


: CSS와 JS 솔루션 아래의 문제를 방지 내 새로 출판 적절한 플러그인을 참조하십시오 github.com/istvan-ujjmeszaros/bootstrap-dropdown-hover
이스트 반 Ujj - 메자 로스

답변:


338

가장 쉬운 해결책은 CSS입니다. 다음과 같은 것을 추가하십시오 ...

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

일 바이올린


3
긴 '완전히 구축 된'솔루션보다 훨씬 낫습니다. 이것을 추가하면 추가 변경없이 호버에서 기본 '클릭'드롭 다운이 작동합니다.
IamFace

47
내장 된 축소 가능한 모바일 메뉴와 충돌하므로 @media (최소 너비 : 480px)의 중단 점으로 감싸 야합니다
Billy Shih

7
주목할만한 점 : 예를 들어 워드 프레스 테마와 같이 부모-자식 관계가있는 드롭 다운 메뉴가있는 경우 data-toggle부모 항목을 클릭 할 수있게 하려면 속성을 제거해야합니다 ... 모바일 화면에서 부수적 인 손상을 조심하십시오.
Ken Prince

2
클릭시 표시를 비활성화하고 호버 동작 만 유지하는 쉬운 방법이 있습니까?
Micer

1
@Micer, 방금 click 이벤트를 비활성화 할 수있는 플러그인을 게시했습니다. : 그것은 모든 장치와 호환되도록 플러그인 만 부트 스트랩 자바 스크립트 API를 사용하여 임의의 CSS 해킹없이 작동 github.com/istvan-ujjmeszaros/bootstrap-dropdown-hover
이스트 반 Ujj - 메자 로스

66

가장 좋은 방법은 호버로 부트 스트랩 클릭 이벤트를 트리거하는 것입니다. 이런 식으로 여전히 터치 장치 친화적 인 상태를 유지해야합니다

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

1
드롭 다운 수준이 둘 이상인 경우 실패
Connie DeCinko

1
부모 링크로 작업하지 않음
pio

드롭 다운이 닫히면 Active 클래스를 제거하는 방법이 있습니까?
brainvision

드롭 다운 요소와 메뉴 사이에 픽셀 간격이있어 사용자가 빠르지 않으면 메뉴가 언젠가 교차하는 것을 숨길 수 있습니다.
Matt

1
여러 드롭 다운을 사용하려면 '가장 가까운'필터링이 필요합니다.
err

57

jQuery의 호버 기능을 사용할 수 있습니다.

open마우스가 들어갈 때 클래스를 추가하고 마우스가 드롭 다운을 떠날 때 클래스를 제거하면됩니다.

내 코드는 다음과 같습니다.

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

10
허용 된 답변보다 훨씬 좋습니다. 이렇게하면 모든 부트 스트랩 로직과 스타일이 그대로 유지됩니다. 두 번째 콜백을 사용하는 것이 좋지만 버튼을 클릭했을 때 이상한 행동을 방지하기 위해 removeClass 및 addClass를 명시 적으로 사용하십시오 (버튼을 떠날 때 열리고 입력 할 때 닫히는 위치).
Bastiaan Linders

3
또한 이것이 최선의 대답이라고 생각합니다. 부트 스트랩 4 메뉴 작업에 얻으려면, 내가 사용했다 show대신 open인클루드도, 그리고 dropdown-menu: $('.dropdown').hover(function() { $(this).addClass('show'); $(this).find('.dropdown-menu').addClass('show');}, function() {$(this).removeClass('show'); $(this).find('.dropdown-menu').removeClass('show');});(. 죄송는 형식에 대한)
로빈 짐머만

두 개의 드롭 다운 메뉴 항목이 있으면 작동하지 않습니다. 모든 드롭 다운 항목에 호버에 모두 하위 메뉴가 표시됩니다
후안 안토니오 Tubío

23

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

부드러운 전환을 좋아하지만 첫 번째 레벨 대신 모든 레벨의 메뉴가 확장됩니다. 부모님 위로 마우스를 가져갈 때까지 2 단계 메뉴가 표시되는 것을 원하지 않습니다.
코니 DeCinko

1
추가, 첫 번째 수준을 얻으려면 .first() - $(this).find('.dropdown-menu').first().stop(true, true).delay(200).fadeIn(200);...
JEdot

9

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

아름다움! Tx! CSS 대안은 Bootstrap 3 이상에서 작동하지 않습니다.
페드로 페레이라



5

그래서 당신은이 코드를 가지고 있습니다 :

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

일반적으로 클릭 이벤트에서 작동하며 호버 이벤트에서 작동하기를 원합니다. 이것은 매우 간단합니다.이 자바 스크립트 / 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 후에 메뉴가 숨겨집니다. 내가 왜 그것을 사용하는지 궁금하다면 메뉴 위의 버튼에서 커서를 드래그 할 시간이 필요하기 때문입니다. 메뉴에 있으면 시간이 재설정되고 원하는 시간만큼 머무를 수 있습니다. 메뉴를 종료하면 시간 초과없이 메뉴가 즉시 숨겨집니다.

많은 프로젝트에서이 코드를 사용했는데, 사용 중에 문제가 발생하면 언제든지 질문하십시오.


이 코드는 부트 스트랩 v3에 많은 문제가 있습니다. 1.) 하나 이상의 드롭 다운이 있으면 마우스를 올려 놓으면 모든 드롭 다운이 표시됩니다. 2.) 작은 화면에서 마우스를 올리면 드롭 다운이 이상한 방식으로 표시됩니다.
KayakinKoder

4

이것은 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');
    });
});

훌륭하지만 하위 메뉴를 지원하지 않습니다.
Connie DeCinko

3

fadein fadeout 애니메이션과 함께 호버 기능을 사용하여 이것을 시도하십시오

$('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 차 깊이에서는 작동하지 않지만 2 차 깊이에서는 작동합니다. 3 차 깊이에 대한 다른 솔루션이 있습니까?
Jilani A

참조를 위해 JSFiddle을 추가하십시오
Rakesh Vadnal

2

부트 스트랩을위한 자신의 호버 클래스를 만드는 데 도움이됩니다.

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 을 제거하려면 버튼 속성 data-toggle = "dropdown" 을 제거하는 것을 잊지 마십시오 . 입력에 드롭 다운이 추가 될 때도 작동합니다.


2

모바일 장치에 있지 않을 때 탐색 표시 줄을 가리키면 탐색으로 마우스를 가져 가면 모바일 장치에서 제대로 작동하지 않습니다.

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

});

github.com/CWSpear/bootstrap-hover-dropdown 에서 훨씬 더 나은 솔루션을 찾을 수 있습니다 .
solarbaypilot

2

다른 솔루션을 시도하고 있습니다. 부트 스트랩 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

적절한 플러그인으로 업데이트

드롭 다운 호버 기능에 적합한 플러그인을 게시했습니다. dropdown-toggle요소를 클릭 할 때 발생하는 일을 정의 할 수도 있습니다 .

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


이미 많은 솔루션이있을 때 내가 만든 이유는 무엇입니까?

기존의 모든 솔루션에 문제가있었습니다. 간단한 CSS는에서 .open클래스를 사용하지 않으므로 .dropdown드롭 다운이 표시되면 드롭 다운 토글 요소에 대한 피드백이 없습니다.

js는을 클릭하는 것을 방해 .dropdown-toggle하므로 드롭 다운이 호버에 표시되고 열린 드롭 다운을 클릭하면 숨겨지고 마우스를 움직이면 드롭 다운이 다시 표시됩니다. 일부 js 솔루션은 iOS 호환성을 제동하고 일부 플러그인은 터치 이벤트를 지원하는 최신 데스크탑 브라우저에서 작동하지 않습니다.

그렇기 때문에 표준 부트 스트랩 자바 스크립트 API 만 사용하여 해킹없이 이러한 모든 문제를 방지 하는 부트 스트랩 드롭 다운 호버 플러그인을 만들었습니다 .


1
    $('.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

click이벤트를 트리거하면 hover약간의 오류가 있습니다. 그렇다면 mouse-ina는 click그 반대의 효과를 만듭니다. 그것은 및 . 더 나은 해결책 :opensmouse-outclosemouse-in

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

1

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> 

jquery

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

        });

코드 펜


0

그 장치를 만지지하고 있다고하면 내가 검출을 제안하고이 솔루션 navbar-toggle(햄버거 메뉴)가 표시되지 않는 부모 메뉴 항목을 만드는 호버에 계시 하위 메뉴 및 및 클릭에 해당 링크를 따라 .

탐색 표시 줄과 일부 브라우저의 메뉴 사이의 간격으로 하위 항목으로 마우스를 가져갈 수 없으므로 tne 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

부트 스트랩 드롭 다운 호버 작업을 수행하고 속성 표시 를 추가하여 클릭시 가까이 유지하십시오 . CSS 에서 버튼 태그에서 data-toggle = "dropdown" role = "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>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.