bootstrap을 사용 하고 있으며 드롭 다운에 애니메이션을 추가하고 싶습니다. 나는 그것에 애니메이션을 추가하고 그것을 떠날 때 아래로 슬라이드했다가 뒤로하고 싶습니다. 어떻게 할 수 있습니까?
내가 시도한 것 :
다음과 같이 Js 드롭 다운 파일을 변경합니다.
bootstrap을 사용 하고 있으며 드롭 다운에 애니메이션을 추가하고 싶습니다. 나는 그것에 애니메이션을 추가하고 그것을 떠날 때 아래로 슬라이드했다가 뒤로하고 싶습니다. 어떻게 할 수 있습니까?
내가 시도한 것 :
다음과 같이 Js 드롭 다운 파일을 변경합니다.
답변:
부트 스트랩 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();
});
hidden.bs.dropdown
이벤트 를 처리하기 전에 전환이 완료 될 때까지 기다리지 않는 것 같습니다 .
또한이 작은 코드를 스타일에 추가하여 드롭 다운 효과에 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의 주석을 솔루션으로 확인하십시오.
pointer-events:none
축소 된 버전으로, 다음 추가 point-events: all
는이되면 메뉴.show
나는 그런 일을하고 있지만 클릭 대신에 호버를했을 때 .. 이것은 내가 사용하고있는 코드입니다. 클릭시 작동하도록 약간 조정할 수 있습니다.
$('.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()
});
<script>
태그는데 아무런 동작도하지 않습니다
이 스레드를 범프 할 수 있는지 모르겠지만 열린 클래스가 너무 빨리 제거 될 때 발생하는 시각적 버그에 대한 빠른 수정을 알아 냈습니다. 기본적으로 슬라이드 업 이벤트 내부에 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');
});
});
});
슬라이드 및 페이드 효과에 대한 솔루션은 다음과 같습니다.
// 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
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
.
클릭하면 아래 코드를 사용하여 수행 할 수 있습니다.
$('.dropdown-toggle').click(function() {
$(this).next('.dropdown-menu').slideToggle(500);
});
위의 코드를 사용하고 있지만 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)
});
확장 된 답변은 내 첫 번째 답변이므로 이전에 충분한 세부 정보가 없었 으면 변명합니다.
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에 필요한 세부 정보 수준이 있습니다.
$('.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)
타이밍을
다음은 jQuery
멋지게 작동 하는 멋진 간단한 솔루션 입니다.
$('.dropdown-toggle').click(function () {
$(this).next('.dropdown-menu').slideToggle(300);
});
$('.dropdown-toggle').focusout(function () {
$(this).next('.dropdown-menu').slideUp(300);
})
슬라이드 애니메이션 토글은 클릭시 발생하며 초점을 잃으면 항상 뒤로 슬라이드됩니다.
300
값을 원하는대로 변경하면 숫자가 낮을수록 애니메이션 속도가 빨라집니다.
편집하다:
이 솔루션은 데스크톱보기에서만 작동합니다. 모바일 용으로보기 좋게 표시하려면 추가 수정이 필요합니다.
dropdown-toggle
) 다시 사라집니다. 즉 , 하위 메뉴 항목을 선택할 수 없음을 의미합니다
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');
});
});
글을 쓰는 시점에서 원래 답변은 이제 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.dropdown
hidden.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));
});
});
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
부모 에서 클래스를 제거합니다 .