CSS3 전환이 완료되면 콜백


202

요소를 희미하게하고 (불투명도를 0으로 전환) 완료되면 요소를 DOM에서 제거하십시오.

jQuery에서는 애니메이션이 완료된 후 발생하는 "제거"를 지정할 수 있으므로 간단합니다. 그러나 CSS3 전환을 사용하여 애니메이션을 적용하려면 전환 / 애니메이션이 언제 완료되었는지 알 수 있습니까?



답변:


334

전환의 경우 다음을 사용하여 jQuery를 통한 전환의 끝을 감지 할 수 있습니다.

$("#someSelector").bind("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd", function(){ ... });

모질라는 훌륭한 참고 자료를 가지고 있습니다 :

https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Transitions/Using_CSS_transitions#Detecting_the_start_and_completion_of_a_transition

애니메이션의 경우 매우 비슷합니다.

$("#someSelector").bind("animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd", function(){ ... });

지원되는 모든 브라우저에서 이벤트 발생을 지원하기 위해 모든 브라우저 접두사 이벤트 문자열을 bind () 메소드에 동시에 전달할 수 있습니다.

최신 정보:

Duck이 남긴 주석에 따르면 jQuery의 .one()메소드를 사용하여 핸들러가 한 번만 실행되도록하십시오. 예를 들면 다음과 같습니다.

$("#someSelector").one("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd", function(){ ... });

$("#someSelector").one("animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd", function(){ ... });

업데이트 2 :

jQuery bind()메소드는 더 이상 사용되지 않으며 현재로서는 on()method가 선호됩니다 jQuery 1.7.bind()

off()콜백 함수에서 메소드를 사용 하여 한 번만 실행되도록 할 수도 있습니다. 다음은 one()method 사용과 동등한 예입니다 .

$("#someSelector")
.on("animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd",
 function(e){
    // do something here
    $(this).off(e);
 });

참고 문헌 :


13
콜백은 전달되는 모든 자식 요소에 대해 발생한다는 점에 주목할 가치가 있습니다. 콜백이 예상보다 많은 시간 동안 발생하는 이유가 궁금한 경우이 점을 명심해야합니다. 현재로서는 해결 방법을 알지 못합니다.
— Lev

22
@Lev 이벤트의 currentTarget을 대상과 비교하여 쉽게 완화 할 수 있습니다. function (event) {if (event.target === event.currentTarget) {/ * 할 일 * /}}
— Jim Jeffers

5
예, 의견을 쓴 직후에 알아 냈습니다. > _ <게시 해 주셔서 감사합니다. 나는 그것이 다른 사람들을 도울 것이라고 확신합니다! :)
— Lev

9
우리는 jQuery v1.7 + .on()대신에 사용한다 api.jquery.com/bind.bind()
— olo

4
모든 최신 브라우저는 이제 접두사가없는 이벤트를 지원합니다. caniuse.com/#feat=css-transitions 또한 "transitionend webkitTransitionEnd"가있는 경우 Chrome에서 두 번 트리거됩니다.
— Michael S.

17

또 다른 옵션은 jQuery Transit Framework 를 사용하여 CSS3 전환을 처리하는 것입니다. 전환 / 효과는 모바일 장치에서 잘 작동하며 애니메이션 효과를 수행하기 위해 CSS 파일에 한 줄의 지저분한 CSS3 전환을 추가하지 않아도됩니다.

다음은 요소를 클릭 할 때 요소의 불투명도를 0으로 전환하고 전환이 완료되면 제거되는 예입니다.

$("#element").click( function () {
    $('#element').transition({ opacity: 0 }, function () { $(this).remove(); });
});

JS 피들 데모


콜백이 작동하지 않습니다. 아마도 모르는 대중 교통 API의 변경 때문일 수 있지만 바이올린 예제는 작동하지 않습니다. 그것은 (크롬에서 재판) 애니메이션이 실행되기 전에 숨기기 방법 트리거
— 조나단 Liuti

@JonathanLiuti는 FireFox 25, IE11, Chrome 31을 사용하여 테스트했습니다.
— ROFLwTIME

예, @ROFLwTIME 당신은 완전히 옳습니다-내 크롬이 막 미친 것 같습니다. 크롬을 새로 시작한 후 오늘 바이올린을 다시 테스트했으며 예상대로 작동합니다. 내 잘못이야 ! 죄송합니다.
— Jonathan Liuti

14

animationend관찰 할 수 있는 이벤트가 있습니다. 문서를 참조 하십시오 . 또한 CSS transition애니메이션의 transitionend경우 이벤트를 사용할 수 있습니다

추가 라이브러리가 필요하지 않으며 이들은 모두 바닐라 JS와 함께 작동합니다

document.getElementById("myDIV").addEventListener("transitionend", myEndFunction);
function myEndFunction() {
	this.innerHTML = "transition event ended";
}
#myDIV {transition: top 2s; position: relative; top: 0;}
div {background: #ede;cursor: pointer;padding: 20px;}
<div id="myDIV" onclick="this.style.top = '55px';">Click me to start animation.</div>


2
이것은 경계선 링크 전용 답변 입니다. 여기에 많은 정보를 포함하도록 답변을 확장하고 참조 용으로 만 링크를 사용해야합니다.
— Goodbye StackExchange

4
jQuery에 의존하지 않는 첫 번째이기 때문에 이것을 투표하십시오. 나뭇 가지에 대한 전체 나무를 자르는 것은 의미가 없습니다.
— Aaron Mason

7

이 기능이 유용한 사람이라면 CSS 클래스를 통해 CSS 애니메이션을 적용한 후 콜백을 얻는 데 성공한 jQuery 종속 함수가 있습니다. Backbone.js 앱에서 사용 되었기 때문에 완벽하게 작동하지는 않지만 유용 할 수 있습니다.

var cssAnimate = function(cssClass, callback) {
    var self = this;

    // Checks if correct animation has ended
    var setAnimationListener = function() {
        self.one(
            "webkitAnimationEnd oanimationend msAnimationEnd animationend",
            function(e) {
                if(
                    e.originalEvent.animationName == cssClass &&
                    e.target === e.currentTarget
                ) {
                    callback();
                } else {
                    setAnimationListener();
                }
            }
        );
    }

    self.addClass(cssClass);
    setAnimationListener();
}

나는 이것을 이렇게 사용했습니다

cssAnimate.call($("#something"), "fadeIn", function() {
    console.log("Animation is complete");
    // Remove animation class name?
});

http://mikefowler.me/2013/11/18/page-transitions-in-backbone/의 독창적 인 아이디어

그리고 이것은 편리해 보입니다 : http://api.jqueryui.com/addClass/


최신 정보

위의 코드와 다른 옵션으로 어려움을 겪은 후 CSS 애니메이션 끝을 듣는 데 매우주의를 기울일 것을 제안합니다. 여러 애니메이션이 진행되면 이벤트 수신에 매우 지저분해질 수 있습니다. 모든 애니메이션, 심지어 작은 애니메이션에 대해 GSAP 와 같은 애니메이션 라이브러리를 강력히 제안 합니다.


공유 주셔서 감사합니다, 나는 그것을 사용하고 추가 편집 e.stopImmediatePropagation(); self.trigger(this.whichAnimationEvent()); //for purge existing event callback.apply(self);
— BomAle

5

허용 된 답변은 현재 Chrome에서 애니메이션에 대해 두 번 발생합니다. 아마도 이것은 webkitAnimationEnd뿐만 아니라 인식하기 때문 animationEnd입니다. 다음은 한 번만 발생합니다.

/* From Modernizr */
function whichTransitionEvent(){

    var el = document.createElement('fakeelement');
    var transitions = {
        'animation':'animationend',
        'OAnimation':'oAnimationEnd',
        'MSAnimation':'MSAnimationEnd',
        'WebkitAnimation':'webkitAnimationEnd'
    };

    for(var t in transitions){
        if( transitions.hasOwnProperty(t) && el.style[t] !== undefined ){
            return transitions[t];
        }
    }
}

$("#elementToListenTo")
    .on(whichTransitionEvent(),
        function(e){
            console.log('Transition complete!  This is the callback!');
            $(this).off(e);
        });

3
애니메이션 이벤트를 처리하기 때문에 whichAnimationEvent () 함수를 대신 호출하는 것이 좋습니다.
— Jakob Løkke Madsen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.