CSS 전환에 대한 콜백


답변:


82

Safari 가 전환을 통해 요소에 직접 연결할 수 있는 webkitTransitionEnd 콜백을 구현한다는 것을 알고 있습니다.

그들의 예 (여러 줄로 재 형식화 됨) :

box.addEventListener( 
     'webkitTransitionEnd', 
     function( event ) { 
         alert( "Finished transition!" ); 
     }, false );

다른 브라우저와 웹킷에도 동일한 것이 있습니까?
meo

6
예, Mozilla의 경우 'transitionend'및 Opera의 'oTransitionEnd'입니다.
qqryq

2
결국 거짓은 무엇을합니까?
meo

@meo this콜백 내부의 요소 와 관련이 있습니다. 그러나 필수 매개 변수이므로이 경우 요구 사항을 충족합니다.
Doug Neiner 2011 년

8
@DougNeiner 끝에있는 거짓은 useCaptureMode. 이벤트가 발생하면 두 단계가 있습니다. 첫 번째 단계는 캡처 모드이고 두 번째 단계는 버블 모드입니다. 캡처 모드에서 이벤트는 body 요소에서 지정된 요소로 내려갑니다. 그런 다음 거품 모드로 들어가서 반대로 수행합니다. 마지막 거짓 매개 변수는 이벤트 리스너가 버블 모드에서 발생하도록 지정합니다. 이것의 한 가지 용도는 버블 모드에서 필요하기 직전에 이벤트 핸들러를 연결하는 것입니다. =) 37signals.com/svn/posts/...
rybosome

103

예, 브라우저에서 이러한 기능을 지원하는 경우 전환이 완료 될 때 이벤트가 트리거됩니다. 그러나 실제 이벤트는 브라우저마다 다릅니다.

  • Webkit 브라우저 (Chrome, Safari) 사용 webkitTransitionEnd
  • Firefox 사용 transitionend
  • IE9 + 사용 msTransitionEnd
  • 오페라 사용 oTransitionEnd

그러나 webkitTransitionEnd항상 발사 되는 것은 아닙니다! 이것은 나를 여러 번 붙잡 았으며 애니메이션이 요소에 영향을 미치지 않으면 발생하는 것 같습니다. 이 문제를 해결하려면 예상대로 트리거되지 않은 경우 타임 아웃을 사용하여 이벤트 핸들러를 실행하는 것이 좋습니다. 이 문제에 대한 블로그 게시물은 http://www.cuppadev.co.uk/the-trouble-with-css-transitions/ <-500 내부 서버 오류입니다.

이를 염두에두고 저는이 이벤트를 다음과 같은 코드 덩어리에서 사용하는 경향이 있습니다.

var transitionEndEventName = "XXX"; //figure out, e.g. "webkitTransitionEnd".. 
var elemToAnimate = ... //the thing you want to animate..
var done = false;
var transitionEnded = function(){
     done = true;
     //do your transition finished stuff..
     elemToAnimate.removeEventListener(transitionEndEventName,
                                        transitionEnded, false);
};
elemToAnimate.addEventListener(transitionEndEventName,
                                transitionEnded, false);

//animation triggering code here..

//ensure tidy up if event doesn't fire..
setTimeout(function(){
    if(!done){
        console.log("timeout needed to call transition ended..");
        transitionEnded();
    }
}, XXX); //note: XXX should be the time required for the
        //animation to complete plus a grace period (e.g. 10ms) 

참고 : 전환 이벤트 종료 이름을 얻으려면 다음의 답변으로 게시 된 방법을 사용할 수 있습니다. 브라우저에서 CSS3 전환 기능을 정규화하는 방법은 무엇입니까? .

참고 :이 질문은 다음과도 관련이 있습니다.- CSS3 전환 이벤트


2
이것은 받아 들여진 것보다 훨씬 더 완전한 대답입니다. 왜 이것이 더 찬성되지 않습니까?
Wes

전화 기억 transitionEndedHandlertransitionEnded(또는 변경 transitionEnded에 의해 transitionEndedHandler에서 addEventListenerremoveEventListener와 전화 transitionEnded에서 transitionEndedHandler)
미켈

감사합니다 @Miquel; transitionEnded내가 의미했을 때 방금 사용했다고 생각합니다 transitionEndedHandler.
Mark Rhodes

이에 대한 Chromium 문제는 여기에서 찾을 수 있다고 생각합니다. code.google.com/p/chromium/issues/detail?id=388082 마지막 댓글은 (내 생각에는 잘못) 버그로 간주하므로 현재 "수정되지 않음"으로 표시되어 있습니다.
Willster

요즘 다른 이름이 필요하지 않습니다 caniuse.com/#feat=css-transitions
Juan Mendes

43

다음 코드를 사용하고 있으며 브라우저가 사용하는 특정 종료 이벤트를 감지하는 것보다 훨씬 간단합니다.

$(".myClass").one('transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd', 
function() {
 //do something
});

또는 부트 스트랩을 사용하는 경우 다음을 수행 할 수 있습니다.

$(".myClass").one($.support.transition.end,
function() {
 //do something
});

이것은 bootstrap.js에 다음을 포함하기 때문입니다.

+function ($) {
  'use strict';

  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
  // ============================================================

  function transitionEnd() {
    var el = document.createElement('bootstrap')

    var transEndEventNames = {
      'WebkitTransition' : 'webkitTransitionEnd',
      'MozTransition'    : 'transitionend',
      'OTransition'      : 'oTransitionEnd otransitionend',
      'transition'       : 'transitionend'
    }

    for (var name in transEndEventNames) {
      if (el.style[name] !== undefined) {
        return { end: transEndEventNames[name] }
      }
    }

    return false // explicit for ie8 (  ._.)
  }

  // http://blog.alexmaccaw.com/css-transitions
  $.fn.emulateTransitionEnd = function (duration) {
    var called = false, $el = this
    $(this).one($.support.transition.end, function () { called = true })
    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
    setTimeout(callback, duration)
    return this
  }

  $(function () {
    $.support.transition = transitionEnd()
  })

}(jQuery);

2
이벤트가 올바른지 확인하기 위해 이벤트가 발생할 때마다 전체 목록을 검색해야하기 때문에 속도가 느립니다.
phreakhead

3
@phreakhead 이러한 접근 방식의 성능은 매우 유사합니다
Tom


5

이것은 transitionend이벤트를 통해 쉽게 달성 할 수 있습니다. 여기 문서를 참조 하십시오 . 간단한 예 :

document.getElementById("button").addEventListener("transitionend", myEndFunction);

function myEndFunction() {
	this.innerHTML = "Transition event ended";
}
#button {transition: top 2s; position: relative; top: 0;}
<button id="button" onclick="this.style.top = '55px';">Click me to start animation</button>


1
이것은 오늘날 정답이며 더 이상 접두사를 가질 필요가 없습니다. caniuse.com/#feat=css-transitions
Juan Mendes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.