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.