부트 스트랩 드롭 다운에 슬라이드 효과 추가


80

bootstrap을 사용 하고 있으며 드롭 다운에 애니메이션을 추가하고 싶습니다. 나는 그것에 애니메이션을 추가하고 그것을 떠날 때 아래로 슬라이드했다가 뒤로하고 싶습니다. 어떻게 할 수 있습니까?

내가 시도한 것 :

다음과 같이 Js 드롭 다운 파일을 변경합니다.

Bootstrap의 탐색 드롭 다운 슬라이드를 위아래로 부드럽게 만들려면 어떻게해야합니까?


1
어딘가에 bootstrap-dropdown.js를 포함 했습니까? 나는 헤더에서 그것을 볼 수 없다. 그리고 awwww이 케이크. 나 지금 너무 배고파!
ablm

흠이 내부 boostrap.js있어, 나는 그것을 포함 않았지만, 전혀 실 거예요 작업, 그것은 didnt 한 일 나는 그것을 제거 할 수 있도록하지만 난 미니를 제거하면 내가 그것을하고 예를 부가 재
벤 베리

편집 : 오 예, 포함되어 있습니다.
ablm

음. 기본 드롭 다운은 미끄러지지 않습니다. 수정 된 버전 (링크에서)에는 $ el.parent (). slideToggle (); JQuery 애니메이션을 호출합니다.
ablm

그리고 btw i dun 왜 u가 부트 스트랩을 2 번 포함하는지 확인하십시오. bootstrap.min.js는 축소 된 버전입니다.
ablm

답변:


150

부트 스트랩 3 (BS3)으로 업데이트하면 원하는 기능을 연결하는 데 유용한 많은 Javascript 이벤트가 노출되었습니다. BS3에서이 코드는 모든 드롭 다운 메뉴에 원하는 애니메이션 효과를 제공합니다.

  // Add slideDown animation to Bootstrap dropdown when expanding.
  $('.dropdown').on('show.bs.dropdown', function() {
    $(this).find('.dropdown-menu').first().stop(true, true).slideDown();
  });

  // Add slideUp animation to Bootstrap dropdown when collapsing.
  $('.dropdown').on('hide.bs.dropdown', function() {
    $(this).find('.dropdown-menu').first().stop(true, true).slideUp();
  });

당신은 BS3 이벤트에 대해 읽을 수 있습니다 여기에 드롭 다운 이벤트에 대한 특히 여기 .


4
이 슬라이드 업 부분에 문제가 있습니다. 축소 모드 (Chrome)에있는 동안 드롭 다운의 너비가 전체 화면으로 보이는 것처럼 너비로 돌아갑니다. FF를 사용하는 동안 아래로 미끄러지지 만 위로 미끄러지는 대신 숨겨집니다.
ScubaSteve 2014 년

3
나도이 문제를보고, 실제로 그것에 대해 구체적으로 묻는 또 다른 스레드를 만들었습니다 ... stackoverflow.com/questions/26267207/… 하지만 정확히 어떻게 고쳐야할지 모르겠습니다. Dropdown 클래스가 hidden.bs.dropdown이벤트 를 처리하기 전에 전환이 완료 될 때까지 기다리지 않는 것 같습니다 .
Kyle Johnson

3
이것은 작동하고 내가 원하는 것을 수행하지만 모바일 뷰포트에서 하위 메뉴의 드롭 다운 슬라이드 업이 빠르게 사라지고 고르지 않게 보입니다. 공유해 주셔서 감사합니다!
Uncle Iroh

이 작업을 수행 할 수 없습니다. 다음 오류가 계속 발생합니다. "Uncaught TypeError : $ (...). find (...). first (...). stop is not a function". 이벤트가 시작될 때 애니메이션이 아직 시작되지 않는 한 .stop ()이 함수가 아닌 방법을 이해하지 못합니까? 내가 무엇을 놓치고 있습니까?
John

모바일 수정에 대해서는 Slipoch의 답변을 참조하십시오.
Tashows

72

또한이 작은 코드를 스타일에 추가하여 드롭 다운 효과에 JavaScript를 사용하지 않고 CSS3 전환을 사용할 수도 있습니다.

.dropdown .dropdown-menu {
    -webkit-transition: all 0.3s;
    -moz-transition: all 0.3s;
    -ms-transition: all 0.3s;
    -o-transition: all 0.3s;
    transition: all 0.3s;

    max-height: 0;
    display: block;
    overflow: hidden;
    opacity: 0;
}

.dropdown.open .dropdown-menu { /* For Bootstrap 4, use .dropdown.show instead of .dropdown.open */
    max-height: 300px;
    opacity: 1;
}

이 방법의 유일한 문제는 max-height를 수동으로 지정해야한다는 것입니다. 매우 큰 값을 설정하면 애니메이션이 매우 빨라집니다.

드롭 다운의 대략적인 높이를 알고 있으면 매력처럼 작동합니다. 그렇지 않으면 자바 스크립트를 사용하여 정확한 최대 높이 값을 설정할 수 있습니다.

다음은 작은 예입니다. DEMO


! 이 솔루션에는 패딩에 작은 버그가 있습니다. Jacob Stamm의 주석을 솔루션으로 확인하십시오.


2
좋은 솔루션입니다. 감사합니다.
Lalit Narayan Mishra

나는 이것을 좋아하지만 안타깝게도 슬라이드 다운 애니메이션은 한 번만 작동합니다. 메뉴를 닫았다가 페이지를 새로 고치지 않고 다시 열면 바로 열립니다. 이 문제가있는 다른 사람이 있습니까?
Nathan R

8
훌륭한 솔루션. 불행히도 작은 버그가 있습니다. 드롭 다운의 첫 번째 항목은 접혀 있어도 클릭 할 수 있습니다. 접힌 드롭 다운 바로 아래에 마우스를 가져 가면 알 수 있습니다. 첫 번째 옵션은 일반 텍스트이기 때문에이 경우 큰 문제는 아닙니다. 그러나 링크 일 때는 문제입니다. 내 솔루션은 가시성을 "애니메이션화"하는 것입니다. 그러나 다른 항목이 애니메이션을 마친 후 지연이 발생합니다. 확인해보세요 : jsfiddle.net/stamminator/kjLe1tfs/1
Jacob Stamm

그 버그를 지적 해주셔서 감사합니다, Jacob. 이것이 목록의 패딩에 문제가있는 것 같습니다. 괜찮 으시면 답변을 드릴게요.
MadisonTrash

1
하나는 또한 추가 할 수 있습니다 pointer-events:none축소 된 버전으로, 다음 추가 point-events: all는이되면 메뉴.show
회색에 이어

23

나는 그런 일을하고 있지만 클릭 대신에 호버를했을 때 .. 이것은 내가 사용하고있는 코드입니다. 클릭시 작동하도록 약간 조정할 수 있습니다.

$('.navbar .dropdown').hover(function() {
  $(this).find('.dropdown-menu').first().stop(true, true).delay(250).slideDown();
}, function() {
  $(this).find('.dropdown-menu').first().stop(true, true).delay(100).slideUp()
});

이것은 훌륭하게 작동합니다! 그러나 클릭 대신 마우스를 가져갈 때 작업하는 방법이 있습니까?
arefin2k

위에 게시 한 코드는 클릭이 아닌 마우스 오버에 있습니다.
Yohn

잘 했어! 감사.
ilmk

나를 위해 일하지 않습니다. 나는 아래이 추가 <script>태그는데 아무런 동작도하지 않습니다
YaddyVirus

16

이 스레드를 범프 할 수 있는지 모르겠지만 열린 클래스가 너무 빨리 제거 될 때 발생하는 시각적 버그에 대한 빠른 수정을 알아 냈습니다. 기본적으로 슬라이드 업 이벤트 내부에 OnComplete 함수를 추가하고 모든 활성 클래스와 속성을 재설정하기 만하면됩니다. 다음과 같이 진행됩니다.

결과는 다음과 같습니다. Bootply 예제

자바 스크립트 / Jquery :

$(function(){
    // ADD SLIDEDOWN ANIMATION TO DROPDOWN //
    $('.dropdown').on('show.bs.dropdown', function(e){
        $(this).find('.dropdown-menu').first().stop(true, true).slideDown();
    });

    // ADD SLIDEUP ANIMATION TO DROPDOWN //
    $('.dropdown').on('hide.bs.dropdown', function(e){
        e.preventDefault();
        $(this).find('.dropdown-menu').first().stop(true, true).slideUp(400, function(){
            //On Complete, we reset all active dropdown classes and attributes
            //This fixes the visual bug associated with the open class being removed too fast
            $('.dropdown').removeClass('show');
            $('.dropdown-menu').removeClass('show');
            $('.dropdown').find('.dropdown-toggle').attr('aria-expanded','false');
        });
    });
});

데모에는 몇 개를 연속으로 클릭하면 하나의 메뉴가 열리지 않습니다.
SventoryMang

@DOTang 예, 완벽하지 않은 것 같으므로 빠른 수정이 약간의 리팩토링이 더 나아질 것이라고 생각합니다. 희망 Bootstrap4이 나오는 시간, 그들은 그것을 해결 한 것
IndieRok

11

슬라이드 및 페이드 효과에 대한 솔루션은 다음과 같습니다.

   // Add slideup & fadein animation to dropdown
   $('.dropdown').on('show.bs.dropdown', function(e){
      var $dropdown = $(this).find('.dropdown-menu');
      var orig_margin_top = parseInt($dropdown.css('margin-top'));
      $dropdown.css({'margin-top': (orig_margin_top + 10) + 'px', opacity: 0}).animate({'margin-top': orig_margin_top + 'px', opacity: 1}, 300, function(){
         $(this).css({'margin-top':''});
      });
   });
   // Add slidedown & fadeout animation to dropdown
   $('.dropdown').on('hide.bs.dropdown', function(e){
      var $dropdown = $(this).find('.dropdown-menu');
      var orig_margin_top = parseInt($dropdown.css('margin-top'));
      $dropdown.css({'margin-top': orig_margin_top + 'px', opacity: 1, display: 'block'}).animate({'margin-top': (orig_margin_top + 10) + 'px', opacity: 0}, 300, function(){
         $(this).css({'margin-top':'', display:''});
      });
   });

감사. 코드가 완벽하게 작동합니다. 하지만 $(this).css({'margin-top':''});@Vedmant
DucCuong

이것은 애니메이션이 완료된 후 margin-top 매개 변수를 제거하는 것입니다. 드롭 다운에 사용자 지정 스타일에 여백이 추가 된 경우 (예 : 내 테마) orig_margin_top 뒤로 애니메이션되므로이 매개 변수없이 작동해야하지만 추가로 남겨 두지 않는 것이 더 깨끗합니다. 애니메이션이 완료된 후 인라인 스타일.
Vedmant 2015 년

9

2018 부트 스트랩 4 업데이트

Boostrap 4에서는 .open클래스가 .show. 추가 JS 또는 jQuery없이 CSS 전환 만 사용하여이를 구현하고 싶었습니다.

.show > .dropdown-menu {
  max-height: 900px;
  visibility: visible;
}

.dropdown-menu {
  display: block;
  max-height: 0;
  visibility: hidden;
  transition: all 0.5s ease-in-out;
  overflow: hidden;
}

데모 : https://www.codeply.com/go/3i8LzYVfMF

노트 : max-height 드롭 다운 콘텐츠를 수용하기에 충분한 큰 값으로 설정할 수 있습니다.


이것은 완벽하게 작동합니다. 나를 위해,를 사용하여 다른 효과를 얻으려고했기 때문에 최대 높이를 지정할 필요조차 없었습니다 margin-top.
Supreme Dolphin

이런 내가, U는 ... JS 코드에 무리없이 CSS를 필요
aswzen

8

클릭하면 아래 코드를 사용하여 수행 할 수 있습니다.

$('.dropdown-toggle').click(function() {
  $(this).next('.dropdown-menu').slideToggle(500);
});

이것은 잘 작동하지만 초점을 잃으면 드롭 다운이 열린 상태로 유지되며 이는 정상적이지 않습니다.
Barry Michael Doyle

7

위의 코드를 사용하고 있지만 slideToggle로 지연 효과를 변경했습니다.

애니메이션과 함께 마우스 오버시 드롭 다운을 슬라이드합니다.

$('.navbar .dropdown').hover(function() {
    $(this).find('.dropdown-menu').first().stop(true, true).slideToggle(400);
    }, function() {
    $(this).find('.dropdown-menu').first().stop(true, true).slideToggle(400)
    });

1
두 번 정의 할 필요가 없습니다. 토글을 사용할 때 두 번째없이 작동합니다.
댈러스

3

확장 된 답변은 내 첫 번째 답변이므로 이전에 충분한 세부 정보가 없었 으면 변명합니다.

Bootstrap 3.x의 경우 개인적으로 CSS 애니메이션을 선호하며 Bootstrap Dropdown Javascript Hooks와 함께 animate.css를 사용하고 있습니다. 그것은 매우 유연한 접근 방식을 추구하는 정확한 효과를 갖지 못할 수도 있습니다.

1 단계 : head 태그를 사용하여 페이지에 animate.css를 추가합니다.

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.4.0/animate.min.css">

2 단계 : 트리거에서 표준 부트 스트랩 HTML을 사용합니다.

<div class="dropdown">
  <button type="button" data-toggle="dropdown">Dropdown trigger</button>

  <ul class="dropdown-menu">
    ...
  </ul>
</div>

3 단계 : 그런 다음 드롭 드롭 메뉴 요소에 2 개의 사용자 지정 데이터 속성을 추가합니다. in 애니메이션의 경우 data-dropdown-in, out 애니메이션의 경우 data-dropdown-out입니다. 이는 fadeIn 또는 fadeOut과 같은 animate.css 효과 일 수 있습니다.

<ul class="dropdown-menu" data-dropdown-in="fadeIn" data-dropdown-out="fadeOut">
......
</ul>

4 단계 : 다음 Javascript를 추가하여 data-dropdown-in / out 데이터 속성을 읽고 Bootstrap Javascript API hooks / events ( http://getbootstrap.com/javascript/#dropdowns-events )에 반응합니다 .

var dropdownSelectors = $('.dropdown, .dropup');

// Custom function to read dropdown data
// =========================
function dropdownEffectData(target) {
  // @todo - page level global?
  var effectInDefault = null,
      effectOutDefault = null;
  var dropdown = $(target),
      dropdownMenu = $('.dropdown-menu', target);
  var parentUl = dropdown.parents('ul.nav'); 

  // If parent is ul.nav allow global effect settings
  if (parentUl.size() > 0) {
    effectInDefault = parentUl.data('dropdown-in') || null;
    effectOutDefault = parentUl.data('dropdown-out') || null;
  }

  return {
    target:       target,
    dropdown:     dropdown,
    dropdownMenu: dropdownMenu,
    effectIn:     dropdownMenu.data('dropdown-in') || effectInDefault,
    effectOut:    dropdownMenu.data('dropdown-out') || effectOutDefault,  
  };
}

// Custom function to start effect (in or out)
// =========================
function dropdownEffectStart(data, effectToStart) {
  if (effectToStart) {
    data.dropdown.addClass('dropdown-animating');
    data.dropdownMenu.addClass('animated');
    data.dropdownMenu.addClass(effectToStart);    
  }
}

// Custom function to read when animation is over
// =========================
function dropdownEffectEnd(data, callbackFunc) {
  var animationEnd = 'webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend';
  data.dropdown.one(animationEnd, function() {
    data.dropdown.removeClass('dropdown-animating');
    data.dropdownMenu.removeClass('animated');
    data.dropdownMenu.removeClass(data.effectIn);
    data.dropdownMenu.removeClass(data.effectOut);

    // Custom callback option, used to remove open class in out effect
    if(typeof callbackFunc == 'function'){
      callbackFunc();
    }
  });
}

// Bootstrap API hooks
// =========================
dropdownSelectors.on({
  "show.bs.dropdown": function () {
    // On show, start in effect
    var dropdown = dropdownEffectData(this);
    dropdownEffectStart(dropdown, dropdown.effectIn);
  },
  "shown.bs.dropdown": function () {
    // On shown, remove in effect once complete
    var dropdown = dropdownEffectData(this);
    if (dropdown.effectIn && dropdown.effectOut) {
      dropdownEffectEnd(dropdown, function() {}); 
    }
  },  
  "hide.bs.dropdown":  function(e) {
    // On hide, start out effect
    var dropdown = dropdownEffectData(this);
    if (dropdown.effectOut) {
      e.preventDefault();   
      dropdownEffectStart(dropdown, dropdown.effectOut);   
      dropdownEffectEnd(dropdown, function() {
        dropdown.dropdown.removeClass('open');
      }); 
    }    
  }, 
});

5 단계 (선택 사항) : 애니메이션의 속도를 높이거나 변경하려면 다음과 같이 CSS를 사용하면됩니다.

.dropdown-menu.animated {
  /* Speed up animations */
  -webkit-animation-duration: 0.55s;
  animation-duration: 0.55s;
  -webkit-animation-timing-function: ease;
  animation-timing-function: ease;
}

관심있는 사람이 있다면 더 자세한 내용과 다운로드가 포함 된 기사를 작성했습니다. 기사 : http://bootbites.com/tutorials/bootstrap-dropdown-effects-animatecss

도움이 되었기를 바랍니다.이 두 번째 글에는 Tom에 필요한 세부 정보 수준이 있습니다.


3
답변에 최소한 몇 가지 세부 정보를 포함하는 것이 좋습니다. 사이트에 연결하는 것만으로는 좋은 답변이 아닙니다.
ajshort

@GeraldSchneider는 답변을 더 자세하게 업데이트했습니다. stackoverflow에 대한 첫 번째 답변 이니 피드백에 감사드립니다.
Tom James

2
$('.navbar .dropdown').hover(function() {
    $(this).find('.dropdown-menu').first().stop(true, true).slideDown();
}, function() {
    $(this).find('.dropdown-menu').first().stop(true, true).slideUp();
});

이 코드는 마우스 오버시 드롭 다운을 표시하려는 경우에 작동합니다.

난 그냥 변경 .slideToggle.slideDown& .slideUp, 및 제거 (400)타이밍을


1

다음은 jQuery멋지게 작동 하는 멋진 간단한 솔루션 입니다.

$('.dropdown-toggle').click(function () {
    $(this).next('.dropdown-menu').slideToggle(300);
});

$('.dropdown-toggle').focusout(function () {
    $(this).next('.dropdown-menu').slideUp(300);
})

슬라이드 애니메이션 토글은 클릭시 발생하며 초점을 잃으면 항상 뒤로 슬라이드됩니다.

300값을 원하는대로 변경하면 숫자가 낮을수록 애니메이션 속도가 빨라집니다.

편집하다:

이 솔루션은 데스크톱보기에서만 작동합니다. 모바일 용으로보기 좋게 표시하려면 추가 수정이 필요합니다.


이것은 나를 위해 작동하지만 마우스를 하위 메뉴로 이동하면 (즉,에서 dropdown-toggle) 다시 사라집니다. 즉 , 하위 메뉴 항목을 선택할 수 없음을 의미합니다
Bassie

1

BOOTSTRAP 3 참조

이 스레드의 솔루션에 계속 잡히고 매번 나를 채워주기 때문에 추가되었습니다.

기본적으로 BS 드롭 다운은 즉시 .open 부모 클래스를 하므로 위로 슬라이딩이 작동하지 않습니다.

slideDown ()에 대한 다른 솔루션과 동일한 비트를 사용하십시오.

// ADD SLIDEUP ANIMATION TO DROPDOWN //
$('.dropdown').on('hide.bs.dropdown', function(e){
  e.preventDefault();
  $(this).find('.dropdown-menu').first().stop(true, true).slideUp(300, function(){
    $(this).parent().removeClass('open');
  });
});

1

소개

글을 쓰는 시점에서 원래 답변은 이제 8 살입니다. 그래도 원래 질문에 대한 적절한 해결책이 아직 없다고 생각합니다.

부트 스트랩 은 그 이후로 먼 길을 갔으며 현재 4.5.2 입니다. 이 답변은 바로이 버전을 다룹니다.

지금까지 다른 모든 솔루션의 문제점

다른 모든 답변 문제는 그들이에 훅 중에 있다는 것입니다 show.bs.dropdown/ hide.bs.dropdown, 후속 이벤트 shown.bs.dropdown/ hidden.bs.dropdown중 (애니메이션이 여전히 진행) 너무 일찍 해고하거나 억제 되었기 때문에 그들은 모두에서 화재하지 않습니다 (e.preventDefault() ).

깨끗한 솔루션

의 구현 때문에 show()hide()부트 스트랩의에서 Dropdown일부 유사성 클래스 공유, 나는에 함께 그룹화 한 toggleDropdownWithAnimation()원래의 행동과 추가 작은 삶의 질 도우미 기능을 mimicing 때 showDropdownWithAnimation()hideDropdownWithAnimation(). Bootstrap과 동일한 방식으로 / 이벤트를
toggleDropdownWithAnimation()생성 합니다. 이 이벤트는 예상대로 애니메이션이 완료된 후에 시작 됩니다.shown.bs.dropdownhidden.bs.dropdown

/**
 * Toggle visibility of a dropdown with slideDown / slideUp animation.
 * @param {JQuery} $containerElement The outer dropdown container. This is the element with the .dropdown class.
 * @param {boolean} show Show (true) or hide (false) the dropdown menu.
 * @param {number} duration Duration of the animation in milliseconds
 */
function toggleDropdownWithAnimation($containerElement, show, duration = 300): void {
    // get the element that triggered the initial event
    const $toggleElement = $containerElement.find('.dropdown-toggle');
    // get the associated menu
    const $dropdownMenu = $containerElement.find('.dropdown-menu');
    // build jquery event for when the element has been completely shown
    const eventArgs = {relatedTarget: $toggleElement};
    const eventType = show ? 'shown' : 'hidden';
    const eventName = `${eventType}.bs.dropdown`;
    const jQueryEvent = $.Event(eventName, eventArgs);

    if (show) {
        // mimic bootstraps element manipulation
        $containerElement.addClass('show');
        $dropdownMenu.addClass('show');
        $toggleElement.attr('aria-expanded', 'true');
        // put focus on initial trigger element
        $toggleElement.trigger('focus');
        // start intended animation
        $dropdownMenu
            .stop() // stop any ongoing animation
            .hide() // hide element to fix initial state of element for slide down animation
            .slideDown(duration, () => {
            // fire 'shown' event
            $($toggleElement).trigger(jQueryEvent);
        });
    }
    else {
        // mimic bootstraps element manipulation
        $containerElement.removeClass('show');
        $dropdownMenu.removeClass('show');
        $toggleElement.attr('aria-expanded', 'false');
        // start intended animation
        $dropdownMenu
            .stop() // stop any ongoing animation
            .show() // show element to fix initial state of element for slide up animation
            .slideUp(duration, () => {

            // fire 'hidden' event
            $($toggleElement).trigger(jQueryEvent);
        });
    }
}

/**
 * Show a dropdown with slideDown animation.
 * @param {JQuery} $containerElement The outer dropdown container. This is the element with the .dropdown class.
 * @param {number} duration Duration of the animation in milliseconds
 */
function showDropdownWithAnimation($containerElement, duration = 300) {
    toggleDropdownWithAnimation($containerElement, true, duration);
}

/**
 * Hide a dropdown with a slideUp animation.
 * @param {JQuery} $containerElement The outer dropdown container. This is the element with the .dropdown class.
 * @param {number} duration Duration of the animation in milliseconds
 */
function hideDropdownWithAnimation($containerElement, duration = 300) {
    toggleDropdownWithAnimation($containerElement, false, duration);
}

이벤트 리스너 바인딩

이제 애니메이션으로 드롭 다운을 표시 / 숨기기위한 적절한 콜백을 작성 했으므로 실제로이를 올바른 이벤트에 바인딩 해 보겠습니다.

다른 답변에서 많이 본 일반적인 실수는 이벤트 리스너를 요소에 직접 바인딩하는 것입니다. 이것은 이벤트 리스너가 등록 될 때 존재하는 DOM 요소에 대해 잘 작동하지만 나중에 추가되는 요소에 바인딩되지 않습니다.

그렇기 때문에 일반적으로에 직접 바인딩하는 것이 좋습니다 document.

$(function () {

    /* Hook into the show event of a bootstrap dropdown */
    $(document).on('show.bs.dropdown', '.dropdown', function (e) {
        // prevent bootstrap from executing their event listener
        e.preventDefault();
        
        showDropdownWithAnimation($(this));
    });

    /* Hook into the hide event of a bootstrap dropdown */
    $(document).on('hide.bs.dropdown', '.dropdown', function (e) {
        // prevent bootstrap from executing their event listener
        e.preventDefault();
          
        hideDropdownWithAnimation($(this));
    });

});

0

Bootstrap 3의 경우 위 답변에 대한 이러한 변형은 모바일 slideUp()애니메이션을 더 부드럽게 만듭니다 . 위의 답변에는 Bootstrap .open이 즉시 토글의 부모에서 클래스를 제거하기 때문에 애니메이션이 고르지 않으므로이 코드는 slideUp()애니메이션이 완료 될 때까지 클래스를 복원합니다 .

// Add animations to topnav dropdowns
// based on https://stackoverflow.com/a/19339162
// and https://stackoverflow.com/a/52231970

$('.dropdown')
  .on('show.bs.dropdown', function() {
    $(this).find('.dropdown-menu').first().stop(true, true).slideDown(300);
  })
  .on('hide.bs.dropdown', function() {
    $(this).find('.dropdown-menu').first().stop(true, false).slideUp(300, function() {
      $(this).parent().removeClass('open');
    });
  })
  .on('hidden.bs.dropdown', function() {
    $(this).addClass('open');
  });

주요 차이점 :

  • 에서 hide.bs.dropdown이벤트 처리기 내가 사용하고 .stop()의 기본 값을 ( false(두 번째 인수에 대해) jumpToEnd)
  • hidden.bs.dropdown이벤트 핸들러는 복원 .open드롭 다운 전환의 부모 클래스를, 그리고 거의 즉시 클래스가 먼저 제거 한 후이 작업을 수행합니다. 한편 slideUp()애니메이션은 여전히 ​​실행 중이며 위의 답변과 마찬가지로 "the-animation-is-completed"콜백이 최종적으로 .open부모 에서 클래스를 제거합니다 .
  • 각 이벤트 핸들러의 선택기가 동일하기 때문에 메소드가 함께 연결됩니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.