您可以查看jQuery Transit的源代码。这是非常好的书面和不言自明的。
原理很简单:
- 获取过渡属性的名称,以嗅探浏览器的渲染引擎;
- 接下来,我们有一个包含不同浏览器的所有事件名称的列表,您可以从中获取该特定浏览器的事件名称
- 在任何其他情况下,如果不
transitionend
存在任何属性,您应该考虑实现一个setTimeout
计时器,以获得最佳的跨浏览器效率。
Javascript(直接来自:jQuery Transit Source Code)
// Helper function to get the proper vendor property name.
// (`transition` => `WebkitTransition`)
// (1)
function getVendorPropertyName(prop) {
// Handle unprefixed versions (FF16+, for example)
if (prop in div.style) return prop;
var prefixes = ['Moz', 'Webkit', 'O', 'ms'];
var prop_ = prop.charAt(0).toUpperCase() + prop.substr(1);
if (prop in div.style) { return prop; }
for (var i=0; i<prefixes.length; ++i) {
var vendorProp = prefixes[i] + prop_;
if (vendorProp in div.style) { return vendorProp; }
}
}
// (2)
var eventNames = {
'transition': 'transitionEnd',
'MozTransition': 'transitionend',
'OTransition': 'oTransitionEnd',
'WebkitTransition': 'webkitTransitionEnd',
'msTransition': 'MSTransitionEnd'
};
var eventName = eventNames[getVendorPropertyName('transition')] || null
// (3)
if ( eventName ) {
// Use the 'transitionend' event if it's available.
bound = true;
element.bind(eventName, cb);
} else {
// Fallback to timers if the 'transitionend' event isn't supported.
window.setTimeout(cb, delay);
}
这样做你将 100% 确定你的transitionEnd
事件会触发