CSS3 전환 이벤트
css3 전환이 시작 또는 종료되었는지 확인하기 위해 요소에 의해 발생 된 이벤트가 있습니까?
W3C CSS 전환 초안
CSS 전환이 완료되면 해당 DOM 이벤트가 생성됩니다. 전환이 진행되는 각 속성에 대해 이벤트가 시작됩니다. 이를 통해 컨텐츠 개발자는 전환 완료와 동기화되는 조치를 수행 할 수 있습니다.
웹킷
전환이 완료되는 시점을 확인하려면 전환이 끝날 때 전송되는 DOM 이벤트에 대한 JavaScript 이벤트 리스너 기능을 설정하십시오. 이벤트는 WebKitTransitionEvent의 인스턴스이며 유형은
webkitTransitionEnd
입니다.
box.addEventListener( 'webkitTransitionEnd',
function( event ) { alert( "Finished transition!" ); }, false );
모질라
전환이 완료되면 시작되는 단일 이벤트가 있습니다. Firefox에서 이벤트는
transitionend
Opera,oTransitionEnd
WebKit에서입니다webkitTransitionEnd
.
오페라
사용 가능한 전환 이벤트에는 한 가지 유형이 있습니다.
oTransitionEnd
이벤트는 전환이 완료 될 때 발생합니다.
인터넷 익스플로러
transitionend
이벤트는 전환이 완료 될 때 발생합니다. 완료 전에 전환이 제거되면 이벤트가 시작되지 않습니다.
스택 오버플로 : 브라우저에서 CSS3 전환 기능을 어떻게 정규화합니까?
Pete가 제공 한 접근 방식을 사용하고 있었지만 이제는 다음을 사용하기 시작했습니다.
$(".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 ( ._.)
}
$(function () {
$.support.transition = transitionEnd()
})
}(jQuery);
콜백이 항상 발생하도록하는 emulateTransitionEnd 함수도 포함되어 있습니다.
// 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
}
Be aware that sometimes this event doesn’t fire, usually in the case when properties don’t change or a paint isn’t triggered. To ensure we always get a callback, let’s set a timeout that’ll trigger the event manually.
http://blog.alexmaccaw.com/css-transitions
All modern browsers now support the unprefixed event:
element.addEventListener('transitionend', callback, false);
Works in the latest versions of Chrome, Firefox and Safari. Even IE10+.
In Opera 12 when you bind using the plain JavaScript, 'oTransitionEnd' will work:
document.addEventListener("oTransitionEnd", function(){
alert("Transition Ended");
});
however if you bind through jQuery, you need to use 'otransitionend'
$(document).bind("otransitionend", function(){
alert("Transition Ended");
});
In case you are using Modernizr or bootstrap-transition.js you can simply do a change:
var transEndEventNames = {
'WebkitTransition' : 'webkitTransitionEnd',
'MozTransition' : 'transitionend',
'OTransition' : 'oTransitionEnd otransitionend',
'msTransition' : 'MSTransitionEnd',
'transition' : 'transitionend'
},
transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ];
You can find some info here as well http://www.ianlunn.co.uk/blog/articles/opera-12-otransitionend-bugs-and-workarounds/
Just for fun, don't do this!
$.fn.transitiondone = function () {
return this.each(function () {
var $this = $(this);
setTimeout(function () {
$this.trigger('transitiondone');
}, (parseFloat($this.css('transitionDelay')) + parseFloat($this.css('transitionDuration'))) * 1000);
});
};
$('div').on('mousedown', function (e) {
$(this).addClass('bounce').transitiondone();
});
$('div').on('transitiondone', function () {
$(this).removeClass('bounce');
});
If you simply want to detect only a single transition end, without using any JS framework here's a little convenient utility function:
function once = function(object,event,callback){
var handle={};
var eventNames=event.split(" ");
var cbWrapper=function(){
eventNames.forEach(function(e){
object.removeEventListener(e,cbWrapper, false );
});
callback.apply(this,arguments);
};
eventNames.forEach(function(e){
object.addEventListener(e,cbWrapper,false);
});
handle.cancel=function(){
eventNames.forEach(function(e){
object.removeEventListener(e,cbWrapper, false );
});
};
return handle;
};
Usage:
var handler = once(document.querySelector('#myElement'), 'transitionend', function(){
//do something
});
then if you wish to cancel at some point you can still do it with
handler.cancel();
It's good for other event usages as well :)
참고URL : https://stackoverflow.com/questions/2794148/css3-transition-events
'IT story' 카테고리의 다른 글
node.js에 JS 대신 CoffeeScript를 사용할 수 있습니까? (0) | 2020.05.14 |
---|---|
XSLT에서 새로운 라인 생성 (0) | 2020.05.14 |
find_spec_for_exe ': gem bundler (> = 0.a)를 찾을 수 없습니다 (Gem :: GemNotFoundException) (0) | 2020.05.13 |
iOS를 사용하여 텍스트를 클립 보드에 복사 (0) | 2020.05.13 |
위도와 경도에서 완전한 주소를 얻는 방법? (0) | 2020.05.13 |