Мне нужно специальное событие transitionend
, которое срабатывает один раз после завершения всех переходов или запускается немедленно, если в CSS нет переходов.Событие «переход», которое всегда срабатывает, и только один раз
Это то, что я придумал до сих пор:
(function($){
$.event.special.transitionsComplete = {
setup: function(data, namespaces, eventHandle){
var queue = [],
style = window.getComputedStyle(this, null),
computedProps = style.getPropertyValue('transition-property').split(', '),
computedDurations = style.getPropertyValue('transition-duration').split(', '),
$node = $(this);
// only count properties with duration higher than 0s
for(var i = 0; i < computedDurations.length; i++)
if(computedDurations[i] !== '0s')
queue.push(computedProps[i]);
// there are transitions
if(queue.length > 0){
$node.on('webkitTransitionEnd.x transitionend.x', function(e){
queue.splice(queue.indexOf(e.originalEvent.propertyName));
if(queue.length < 1)
$node.trigger('transitionsComplete');
});
// no transitions, fire (almost) immediately
}else{
setTimeout(function(){
$node.trigger('transitionsComplete');
}, 5);
}
},
teardown: function(namespaces){
$(this).off('.x');
}
};
})(jQuery);
Я сделал живой пример here.
Единственная проблема заключается в том, что он работает только в том случае, если сам элемент имеет свойства перехода, игнорируя переходы из дочерних элементов. Если я переключаю transitionsComplete
на transitionend
, как родительский, так и дочерний обработчики событий запускаются после завершения дочернего перехода. Есть ли какой-то способ или, возможно, лучший подход для определения того, происходит ли переход с ним или его детьми? Я бы хотел, чтобы я не проходил через детей вручную и, если возможно, проверял их свойства переходов. (Это не было бы надежным в любом случае, потому что даже если некоторые дети имеют переходы, это не значит, что они будут активны в этой точке)
Можете ли вы отредактировать CSS для дочерних элементов, которые переходят? –
Но переход уже на ребенка в примере –
Если вы можете редактировать сам CSS, я думаю, что могу помочь вам придумать более чистый способ. Дайте мне знать –