🧊

$.fn.fadeIn(fn)をCSSアニメでやる

最初は便利かなーと思ったのですが、使い勝手はイマイチでした・・。
まあ一応書いたので、メモっとこうと。

コード

(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で良いです・・。