Событие TransitionEnd не срабатывает?
у меня есть несколько элементов, которые анимируются на (несколько) продолжительности каждый. Я анимирую с помощью переходов CSS3, используя библиотеку jQuery и transitionend
вспомогательная функция из Дэвид Уолш.
моя проблема в том, что transitionEnd
событие не увольняется! (В Chrome И Firefox)
мой код:
var $children = $container.find('.slideblock').children();
if(Modernizr.csstransitions && Modernizr.csstransforms3d) {
if($.browser.webkit === true) {
$children.css('-webkit-transform-style','preserve-3d')
}
$children.each(function(i){
$(this).on(whichTransitionEvent,function () {
$(this).remove();
});
$(this).show().css('animation','slideOutToRight ' + ((Math.random() / 2) + .5) + 's');
});
}
обновление
на whichTransitionEvent
переменная указывает на самоисполняющуюся функцию, которая возвращает строку, содержащую название события:
var whichTransitionEvent = (function (){
var t;
var el = document.createElement('fakeelement');
var transitions = {
'transition' :'transitionEnd',
'OTransition' :'oTransitionEnd',
'MSTransition' :'msTransitionEnd',
'MozTransition' :'transitionend',
'WebkitTransition' :'webkitTransitionEnd'
}
for(t in transitions){
if( el.style[t] !== undefined ){
return transitions[t];
}
}
} ());
console.log(whichTransitionEvent); // returns "webkitTransitionEvent" in Chrome
console.log(typeof whichTransitionEvent); // returns "string"
3 ответов
попытка повторить это в Chrome 29 и Firefox 23, ваша исходная функция не удалась таким же образом, т. е. я вижу console.log(whichTransitionEvent)
возвращение 'transitionEnd'
для обоих.
переупорядочивание элементов в transitions
хэш устраняет проблему, предполагая, что оба имеют свойство unprefixed standards, а также их собственный префикс.
рефакторинг функции ниже, которое запускает правильные события для меня:
function whichTransitionEvent(){
var t;
var el = document.createElement('fakeelement');
var transitions = {
'WebkitTransition' :'webkitTransitionEnd',
'MozTransition' :'transitionend',
'MSTransition' :'msTransitionEnd',
'OTransition' :'oTransitionEnd',
'transition' :'transitionEnd'
}
for(t in transitions){
if( el.style[t] !== undefined ){
return transitions[t];
}
}
}
Дайте мне знать, если это помогает
Не путайте "переходы" с "анимацией".
CSS анимации имеют различные функции.
вот обратные вызовы для анимации:
$(document).one("animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd",
"#robot",
function (event)
{
// complete
});
вы передаете функцию вместо строки, поэтому вы делаете эквивалент...
$(this).on(function(){...}, function() {...})
чтобы исправить это, я бы рекомендовал установить строку в начале вашего скрипта, чтобы она не вызывалась несколько раз.
if(Modernizr.csstransitions && Modernizr.csstransforms3d) {
var transitionEnd = whichTransitionEvent();
if($.browser.webkit === true) {
$children.css('-webkit-transform-style','preserve-3d')
}
$children.each(function(i){
$(this).on(transitionEnd,function () {
$(this).remove();
});
$(this).show().css('animation','slideOutToRight ' + ((Math.random() / 2) + .5) + 's');
});
}