【发布时间】:2015-12-04 20:00:51
【问题描述】:
我需要一个类似于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 本身,我想我可以帮助您想出一种更简洁的方法。告诉我
-
根据您的问题,我想知道 css 转换是否最适合您的想法。相反,您将拥有更好的控制和可能更好的性能 JavaScript 转换。看看 greensock.js。
-
@niceass,你能编辑过渡的子元素的 CSS 吗?
标签: javascript jquery css-transitions jquery-events