萌え萌えcss


http://rtilabs.net/files/2010_12_24/moemoe_css/

jquery 1.4.3 から搭載された cssHooks を利用して遊んでみました。
cssHooksを利用すると、新しい css のカスタムプロパティを作成できます。


いままで jquery で width 属性などのように、実在しない cssのプロパティを拡張したければ、動的に jqueryのメソッド書き換えるモンキーパッチを行うしかありませんでした。
クロスブラウザの回転は、 まさに jquery のメソッドを動的に置き換えで実装しています。

ところが、 jquery 1.4.3 から、 cssHooks という機能が実装され、 jqueryを経由して安全に css のカスタムプロパティを作成できるようになりました。
このことを教えてもらったので、 cssHooks を利用して まったく新しいカスタムプロパティを作成してみました。


プレゼンの中で利用した cssHooks 部分のソースコードは以下のとおりです。
短いソースで面白い効果を実装できます。

//萌えプロパティを実装する
$.cssHooks['萌え'] = {
	get: function( elem, computed, extra ) {
		var value = $(elem).data('萌え');
		return value ? value : 0
	},
	set: function( elem, value ) {
		elem = $(elem);
		var max_moe = 0;
		var filename = '';
		if      ( elem.hasClass('poirot') ){max_moe = 9;	filename = 'e'; }	//エリーさん
		else if ( elem.hasClass('homes') ){ max_moe = 1;	filename = 's'; }	//シャロ
		else if ( elem.hasClass('wolfe') ){ max_moe = 1;	filename = 'n'; }	//ネロ
		else if ( elem.hasClass('gray') ){  max_moe = 1;	filename = 'c'; }	//コーデリアさん
		else return ; //不明.

		value = parseInt(value);
		if (value > max_moe)
		{	//萌え限界突破
			if (value >= max_moe + 2)
			{	//限界+2
				elem.data('萌え',max_moe + 2);
				elem.attr('src' , 'imgs/agupsu_1.png');	//アグPス
			}
			else 
			{	//限界+1
				elem.data('萌え',max_moe + 1);
				elem.attr('src' , 'imgs/ishipra_2.jpg');	//いしPら
			}
		}
		else
		{
			elem.data('萌え',value);
			elem.attr('src' , 'imgs/' + filename + '_' + value + '.jpg');
		}
	}
};

//中の人プロパティを実装する
$.cssHooks['中の人'] = {
	get: function( elem, computed, extra ) {
		var value = $(elem).data('中の人');
		return value ? value : 0
	},
	set: function( elem, value ) {
		elem = $(elem);
		value = parseInt(value);

		if (value > 1)
		{
			value = 1;
		}
		elem.data('中の人',value);
		elem.attr('src' , 'imgs/all_' + value + '.jpg');	//決め打ち!!
	}
};

//回転プロパティを実装する
$.cssHooks['rotate'] = {
	get: function( elem, computed, extra ) {
		var value = $(elem).data('rotate');
		return value ? value : 0
	},
	set: function( elem, value ) {
		var style = elem.style;

		var transformMethod = typeof style.MozTransform != 'undefined' ? 'MozTransform' 
					: (typeof style.MsTransform != 'undefined' ? 'MsTransform' 
					: (typeof style.WebkitTransform != 'undefined' ? 'WebkitTransform' 
					: (typeof style.OTransform != 'undefined' ? 'OTransform' 
					: (typeof style.Transform != 'undefined' ? 'Transform' 
					: false ))));

		if (!transformMethod)
		{
			return ;	//未サポート.
						//IE はフィルターでやると回るけど、とりあえず未サポートで。
		}

		elem = $(elem);
		value = parseInt(value) % 360;

		elem.css(transformMethod, 
			(elem.css(transformMethod) || '').replace(/none|rotate\(.*?\)/, '') + 'rotate(' + value + 'deg)');
		elem.data('rotate' , value);	//めんどいので、、

		return this;
	}
};

//今だと、 csshooks の値を animate で読んでくれないみたいなので、
//特別に設定してあげるんだからね。
jQuery.fx.step.萌え  = function(fx) {	//UTF-8だと動くよ!!みなくる
	if ( fx.state == 0 ) {
		fx.start = $(fx.elem).css('萌え');
//		fx.end =   fx.end;
		fx.now = fx.start;
	}
	$(fx.elem).css('萌え',fx.now);
};

このように定義すると、jqueryを経由して、ふつーの css のプロパティのように、扱うことができます。

var moe = $('#object').css('萌え');
$('#object').css('萌え' , 1);


面白いですねー。
(何かの advent calendar で書けばよかったかなぁ。。。 )

ミルキーホームズも次回で最終回か、寂しくなるな。