最初は便利かなーと思ったのですが、使い勝手はイマイチでした・・。
まあ一応書いたので、メモっとこうと。
コード
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function(global, $, undefined) { | |
'use strict'; | |
var doc = global.document; | |
// まずイベント名を確定させる | |
var TRANSITION_END = (function() { | |
var events = { | |
'transition': 'transitionend', | |
'WebkitTransition': 'webkitTransitionEnd' | |
}; | |
var evName, prop; | |
for (prop in events) { | |
if (typeof(doc.body.style[prop]) !== undefined) { | |
evName = events[prop]; | |
break; | |
} | |
} | |
return evName; | |
}()); | |
// そして拡張 | |
$.extend($.fn, { | |
/** | |
* addClassして、そのtransitionEndでコールバック | |
* | |
* @param {String} className | |
* addClassするクラス名 | |
* @param {Function} callback | |
* transitionEndで発火したいコールバック | |
*/ | |
addClassWithTransitionCallback: function(className, callback) { | |
if (!className) { return this; } | |
if (!callback || !$.isFunction(callback)) { | |
return this.addClass(className); | |
} | |
return this | |
.one(TRANSITION_END, function(ev) { | |
callback.call(this, ev); | |
}) | |
.addClass(className); | |
}, | |
/** | |
* removeClassして、そのtransitionEndでコールバック | |
* | |
* @param {String} className | |
* removeClassするクラス名 | |
* @param {Function} callback | |
* transitionEndで発火したいコールバック | |
*/ | |
removeClassWithTransitionCallback: function(className, callback) { | |
if (!className) { return this; } | |
if (!callback || !$.isFunction(callback)) { | |
return this.removeClass(className); | |
} | |
return this | |
.one(TRANSITION_END, function(ev) { | |
callback.call(this, ev); | |
}) | |
.removeClass(className); | |
} | |
}); | |
}(window, jQuery)); |
jQuery add/removeClass with transition and callbac ...
これを使うと
$('.elm').fadeIn(function() { // do something... });
ってのが、
.elm { opacity: 0; transition: opacity 1s ease; } .elm.is-animated { opacity: 1; }
ってのを用意すれば、
$('.elm').addClassWithTransitionCallback('is-animated', function() { // do something... });
ってできます。
いちおう嬉しいところ
やっぱりfor文でがんばるアニメーションは、Androidとか低スペック端末で若干辛いです。
それをまあ出来る限り救おうというのが趣旨です。
とはいえ、transitionEndのイベントの挙動がそもそも怪しかったり、コードが冗長になったりするので、一概に良いとも言えず。
結論
いや、jQueryで良いです・・。