<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CSS &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/css/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Thu, 27 Apr 2017 03:17:57 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>LESSTESTERのアップデートと最近得た知見の話</title>
		<link>https://blog.mach3.jp/2017/04/27/lesstester-update.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Thu, 27 Apr 2017 03:17:57 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[LESS]]></category>
		<category><![CDATA[LESSTESTER]]></category>
		<category><![CDATA[Vue.js]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=4366</guid>

					<description><![CDATA[数年ぶりに LESSTESTER をアップデートしました。 何故数年放置しておきながら今になってアップデートをしたかというと、 案件等で得た経験を試す実験場としてとてもお手頃だったからです。 アップデートのきっかけ LE [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>数年ぶりに <a href="https://lesstester.com">LESSTESTER</a> をアップデートしました。 何故数年放置しておきながら今になってアップデートをしたかというと、 案件等で得た経験を試す実験場としてとてもお手頃だったからです。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-mC6ks_arBVTn88Y_pTh1StyTAXmDirNJbIZ21uxbj6k79vVxbwx3-oYrD1A4w41964fa9Ue1yo1_XHRgxfB8cc-1d9VLTRC23J2JNScPRsYB6F4uKYFsL0v_J_4srdvAXN7McTfHSme1cobaz4Li87CMrZXlSPt1P5pLh0tUpOpLNgeMbigdZGbrDHz5fq2K64CK5PWQ3FeyKBhJadLgX2youus6Vdjm6RqgXZUq6dSUJcrbBk5QFxM-No6zHW3p_8S4g8ftm80edb_yfh_Vad5Fq3e1qExDlqOkAJJ5_QzwHWFFAdGYrqZIWCgDetRf9pPVNjjaALC5xn3GR9UNyJfIByCeDA0Imtke_Lvcsur-qfraRuhs-CrJr1wDDA4cK3HcDZylqfQFblMbnFOOtArqo25e8aHoMvhVdJv9nPem5oEA3pVqOpxb0rA4DAjggbNHBUgVOPOlK44jLzd13p5Xjsz-ysdHB30oU3DBILK0LszFW_KKRG10ona3lIWtUxptsgEpLX9aQs4dQ9HLtzTb42Fi0gYphXgtPKBF4TWiX-X8PQhvfe1qVtJaCDTmbG4zo7bQlamKouwz35BuRjdHikkBmAMJQtZAe0y6p0hk7HkCR4L_c5n0Zeb-bediCQt55qffKgQFXSfbA_8gBqH65OJaJiil9f8e4tisA=w600-h315-no" alt="LESSTESTERのアップデートと最近得た知見の話"/></figure>



<p></p>



<span id="more-4366"></span>



<h2 class="wp-block-heading">アップデートのきっかけ</h2>



<p>LESSTESTERを見直すきっかけになったのは、StackOverflowで<strong>「バージョンが古い。5年前のバージョン。（意訳）」</strong>と言及されていたのを見かけた事。 実際は、Less v1.7.0が出たのが2014年2月でLESSTESTERアップデートが翌3月なので3年しか経ってない事をここに釈明しておきます。 しかし、Lessのバージョンがv2.7.2まで上がっている間ずっと放置してしまったのは反省しないといけませんね。</p>



<p>cf) <a href="https://github.com/less/less.js">https://github.com/less/less.js</a></p>



<p>本当はLessユーザーも希少な様子なので閉めようかとも考えましたが、 せっかく公式にも取り上げてもらっていた事ですし、 案件で得られた経験値を試すついでにまるっと作り直してみようと思いました。</p>



<h2 class="wp-block-heading">そして出来たもの</h2>



<figure class="wp-block-image"><a href="https://lesstester.com"><img decoding="async" src="https://lh3.googleusercontent.com/KyESuArSXskHgoeL1ZheCP7miAXafDRhBgFgroddU41q8YUGRLbwebg7febLoEB60rDpttzHSJNGkXDOfMBlWqn97eA1ulmNDMFdt0bkKMJM-l8grIdVXOXlAARz39dHetqWYxiZTXGeKZCIXF1ppd-63L5L6Ds4A89HuRCtbyg_RpGYyQ6JLbEjCIOLr_12t0N1JCpITHwW-lGD5k_5USoA7ydFsG90JdODQNwqBlMw6m4_3GPZZA9MZYKPtUelDh7549bIMfzEQuMZOgdC9BMjdZdsYaPOYd7UoeTVLGxn46_ZxmlTnTwK3HRpJKvv8RWV_kTX2-gAACvbREV-eJuj2ULjhqrSjVIgKwZZpiGjkNTHLJdiuZQfiRAFmtW4NRFwho_jizrKpGDPfyFzMXnptipXgFIEwH8ajBRqAnsGoEQAte18G_Yep5y27hRie8aNax3AlH6xgrHu73d3q8i--UJ3mIrly_fxPn7mQeBl7aVToHeANKTCZtYh6wJxc8UmyaEjP8OfS7fSiKCQ4VkC_3O8KclubKOWJ9gxZoDcAtzhFIzYKWHleMIV7g3VUFEGi13qt7ZkF5rFO4ocDt-ucglKKxQOq6g2bcb9T9U07POhEfGozWfUk9w5h8-5NrXopyeSzrtxBBfhpjMpZgx2yCejBV4rf3gwH22Cdg=w600-h450-no" alt="LESSTESTER"/></a></figure>



<p></p>



<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://lesstester.com
</div></figure>



<p>新しくついた機能 :</p>



<ul class="wp-block-list">
<li>ドラフトが端末に保存できるようになりました</li>



<li>Lessのバージョンを選択できるようになりました</li>



<li>キーマップに sublime が追加されました</li>



<li>リアルタイムコンパイル</li>
</ul>



<p>新しくつけようと思ったけどやめた機能 :</p>



<ul class="wp-block-list">
<li>URLでシェアする機能（理由 : コストのわりに使われ無さそう）</li>
</ul>



<p>活用した技術など :</p>



<ul class="wp-block-list">
<li>Vue.js &#8211; <a href="https://jp.vuejs.org/">https://jp.vuejs.org/</a></li>



<li>AWS S3の静的サイトホスティング</li>



<li>AWS Route53 + CloudFront でSSLに対応</li>



<li>（おまけ） さくらのメールボックス</li>
</ul>



<h2 class="wp-block-heading">感想</h2>



<p>ゼロから組み直したにしては、AWSとVue.jsが大変便利だったおかげで短時間で完成しました。</p>



<h3 class="wp-block-heading">Vue.js</h3>



<p>現在進行系で進んでいるプロジェクトで使っているのですが、 低い学習コストのわりに高機能かつ使い勝手が良く、規模問わず動的なWebアプリケーションを作るのに大変便利です。</p>



<h3 class="wp-block-heading">AWS S3</h3>



<p>言わずと知れたS3さんは便利すぎる。 もう全部これでいいんじゃないでしょうか。</p>



<h3 class="wp-block-heading">AWS Route53 + CloudFront</h3>



<p>SSL対応がこんなに簡単で安価になるとは、時代を感じます。 CloudFrontは高機能である反面、デプロイと変更の適用で結構待たされるので、いろいろな設定を試す段階ではちょっと辛い部分はありました。</p>



<p>また、今回は使っていませんが API Gateway / Lambda / RDS あたりは触る機会がどんどん増えていくのではないかなと思っています。</p>



<h3 class="wp-block-heading">さくらのメールボックス</h3>



<p>SSL対応の際にドメイン所有者の確認のためメールが送られるので、それを受け取る為に使いました。 年額1000円程度で複数ドメインを使用できるのでかなりリーズナブルです。 メールサーバの構築はなにかと面倒なので、ぜひ利用していきたい選択肢ですね。</p>



<p><a href="http://www.sakura.ne.jp/mail/">セキュリティ対策を強化したメールサーバー専用プラン【メールボックス】</a></p>



<h2 class="wp-block-heading">まとめ</h2>



<p>お買い物もホビーも開発もAmazonに依存する時代の到来です。 それぞれのリソースについては時間があれば追って使い方などを記事にまとめておきたいところです。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>最近のトグルボタン実装を少し考えてみる</title>
		<link>https://blog.mach3.jp/2014/11/04/toggle-button.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 04 Nov 2014 01:06:54 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[ToggleButton]]></category>
		<category><![CDATA[UI]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3885</guid>

					<description><![CDATA[最近ではIE6/7対応がほとんど無くなり、泥臭い手法を取る必要が少し減ってきました。 様々な場面で頻出するトグルボタンUIもまた、以前に比べて少しモダンな形での実装が可能になってきています。 隣接セレクタを使用したトグル [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>最近ではIE6/7対応がほとんど無くなり、泥臭い手法を取る必要が少し減ってきました。 様々な場面で頻出するトグルボタンUIもまた、以前に比べて少しモダンな形での実装が可能になってきています。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/-KAXV6MWKTPY/VFdvQDJppQI/AAAAAAAAClw/d7JI5o9Pa4M/s400/2014-1103-00.png" alt="最近のトグルボタン実装を少し考えてみる"/></figure>



<p></p>



<span id="more-3885"></span>



<h2 class="wp-block-heading">隣接セレクタを使用したトグルボタン</h2>



<p>IEはバージョン8から<strong>隣接セレクタ</strong>が使えるようになります。 ここでは、その隣接セレクタとラジオボタンを使ってトグルボタンを作ってみます。 ラジオボタンをチェックボックスに変更すれば複数選択可能なボタンが表現できます。</p>



<p><a class="jsbin-embed" href="http://jsbin.com/jucaha/1/embed?output">Toggle Button Demo</a><script src="http://static.jsbin.com/js/embed.js"></script></p>



<p>要点は、下記の通りです。</p>



<ul class="wp-block-list">
<li><strong>:checked</strong> 擬似クラスと隣接セレクタ（+）を使用</li>



<li>input要素は非表示にして、隣接する <strong>span.label</strong> 要素をボタンのように見せる</li>



<li><strong>label</strong> 要素でラップして選択出来るようにする</li>
</ul>



<p>ところが、このコードは次に挙げる問題によりIE8では正常に動作しません。</p>



<h3 class="wp-block-heading">非表示のラジオボタン/チェックボックスの選択が出来ない</h3>



<p>IE8以下では、<strong>display:none</strong> や <strong>visibility:hidden</strong> で非表示にしたinput要素を選択する事ができません。 これは関連付けられた label 要素をクリックしても同様です。 選択出来ないというのはつまり、checked 属性もつかなければ、changeイベントも発火しないという事です。</p>



<p>そこで、display/visibility を使わずに <strong>opacity</strong> を使用して非表示にします。</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-class">.toggle-button</span> <span class="hljs-selector-tag">input</span><span class="hljs-selector-attr">&#91;type=radio]</span> {
    <span class="hljs-attribute">position</span>: absolute;
    <span class="hljs-attribute">opacity</span>: <span class="hljs-number">0</span>;
    <span class="hljs-attribute">filter</span>: <span class="hljs-built_in">alpha</span>(opacity=<span class="hljs-number">0</span>);
    <span class="hljs-attribute">outline</span>: none;
}
</code></span></pre>


<h3 class="wp-block-heading">:checked の使用</h3>



<p>IE8は隣接セレクタは使えますが、<strong>:checked</strong> 擬似クラスには対応していません。 その為、代替として選択状態の物に checked クラスを付与して使用します。</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-class">.toggle-button</span> <span class="hljs-selector-class">.checked</span> + <span class="hljs-selector-class">.label</span> {
    <span class="hljs-attribute">background-color</span>: magenta;
    <span class="hljs-attribute">color</span>: <span class="hljs-number">#fff</span>;
}
</code></span></pre>


<p>そして、input要素の選択状態と checked クラスを同期する為に次のような処理を追加してやります。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-built_in">document</span>).on(<span class="hljs-string">"change"</span>, <span class="hljs-string">"input&#91;type=radio], input&#91;type=checkbox]"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    $(<span class="hljs-built_in">document</span>.getElementsByName(<span class="hljs-keyword">this</span>.name)).each(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        $(<span class="hljs-keyword">this</span>).toggleClass(<span class="hljs-string">"checked"</span>, <span class="hljs-keyword">this</span>.checked);
    });
});
</code></span></pre>


<p>このコードは、input要素の選択状態が更新されるたびに、 同じnameを持ったinput要素の checked クラスの有無を、その選択状態によって更新します。</p>



<p>さらに注意が必要なのは、次のような書き方が出来ない点です。</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-class">.toggle-button</span> <span class="hljs-selector-pseudo">:checked</span> + <span class="hljs-selector-class">.label</span>,
<span class="hljs-selector-class">.toggle-button</span> <span class="hljs-selector-class">.checked</span> + <span class="hljs-selector-class">.label</span> {
    <span class="hljs-comment">/* ここの指定はIE8で無視される */</span>
}
</code></span></pre>


<p>一見問題なさそうですが、:checked 非対応のIE8ではこのセレクタ内のスタイル指定は無視されてしまいます。</p>



<p>.checked と :checked はJavaScriptで同期されているので .checked の指定だけで良しとするか、 どうしても :checked の指定も記述したい場合は分離して指定する必要があります。</p>


<pre class="wp-block-code"><span><code class="hljs">.toggle-button :checked + .label { ... }
.toggle-button .checked + .label { ... }
</code></span></pre>


<h2 class="wp-block-heading">最終的なコード</h2>



<p><a class="jsbin-embed" href="http://jsbin.com/dowopo/1/embed?output">Toggle Button Demo</a><script src="http://static.jsbin.com/js/embed.js"></script></p>



<h2 class="wp-block-heading">（おまけ）IE11のエミュレーションでの表示不具合</h2>



<p>IE11の開発ツールのエミュレーション機能でIE8を選択して上のコードを確認すると、 隣接セレクタまわりの表示更新が上手くされずに、少しおかしな挙動を見せます。</p>



<ul class="wp-block-list">
<li>ボタンをクリックしてもボタンのスタイルが更新されない</li>



<li>前に選択されていたボタンがきちんとトグルされない</li>
</ul>



<p>ちなみにマウスオーバーするとようやくボタンのスタイルが更新されたりします。</p>



<p>ネイティブのIE8はもちろん、IE10迄のブラウザモード切替でも正常に動作するのでさしたる問題ではないですが、 動作確認がちょっと捗らなくなるので、そういう事があるのだと知っておくと良いと思います。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>&#034;Minify&#034; &#8211; Alphabetical Advent Calendar 2013</title>
		<link>https://blog.mach3.jp/2013/12/12/jaac2013-m-minify.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Thu, 12 Dec 2013 01:31:01 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Advent Calendar 2013]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Minify]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3718</guid>

					<description><![CDATA[&#8220;M&#8221; は minify の &#8220;M&#8221;。 Minify minify は、リソースを圧縮してサイズを小さくするプロセスの事です。 JavaScript のファイルで偶に jq [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>&#8220;M&#8221; は minify の &#8220;M&#8221;。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-3TSd7CVVOtA/UqR4jRvcVYI/AAAAAAAACYg/pEPEoSrgTZM/s400/ac2013-m.png" alt="M"/></figure>



<p></p>



<span id="more-3718"></span>



<h2 class="wp-block-heading">Minify</h2>



<p><strong>minify</strong> は、リソースを圧縮してサイズを小さくするプロセスの事です。 JavaScript のファイルで偶に <strong>jquery.min.js</strong> のように接尾辞 <strong>min</strong> をつけている事があると思いますが、 これはおそらく <strong>minified</strong> という事でしょう。</p>



<p>Webコンテンツはネットワークからリソースをダウンロードして動くので、それらの軽量化は重要な課題の一つです。 特に JavaScript と CSS のミニファイツールは広く出回っていて導入も簡単です。</p>



<h2 class="wp-block-heading">uglify + mincss</h2>



<p>まずは Grunt から公式にプラグインが提供されている UglifyJS と Cssmin を使ってみましょう。</p>



<h3 class="wp-block-heading"><a href="https://github.com/gruntjs/grunt-contrib-uglify">UglifyJS</a></h3>



<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://github.com/gruntjs/grunt-contrib-uglify
</div></figure>



<p><a href="http://lisperator.net/uglifyjs">UglifyJS</a> は JavaScript で実装された JavaScript の圧縮ツールです。 コマンドラインで圧縮する場合は npm で <strong>uglify-js</strong> をインストールし、<strong>uglifyjs</strong> コマンドを使用します。 Grunt で使用する場合は、 <strong>grunt-contrib-uglify</strong> をインストールします。</p>



<p>ここでは、Grunt でのシンプルな例を挙げてみます。（Grunt の基本的な部分はここでは省きます）</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">uglify: {
    <span class="hljs-attr">dist</span>: {
        <span class="hljs-attr">options</span>: { ... },
        <span class="hljs-attr">files</span>: {
            <span class="hljs-string">"js/hoge.min.js"</span>: <span class="hljs-string">"js/hoge.js"</span>,
            <span class="hljs-string">"js/foo.min.js"</span>: &#91;<span class="hljs-string">"js/foo.js"</span>, <span class="hljs-string">"js/bar.js"</span>, <span class="hljs-string">"js/baz.js"</span>]
        }
    }
}
</code></span></pre>


<p><strong>options</strong> では圧縮のレベルなど、<a href="https://github.com/gruntjs/grunt-contrib-uglify/blob/master/README.md">非常に多くの項目の設定が可能です</a>。 <strong>files</strong> オブジェクトの キー に出力先のファイル名を指定し、値にソースとなるファイル（群）を指定します。 複数ファイルをまとめて圧縮したい場合は、配列で指定する事ができます。</p>



<p>上の例では、 &#8220;js/hoge.js&#8221; の圧縮結果が &#8220;js/hoge.min.js&#8221; に保存され、 &#8220;js/foo.js&#8221; + &#8220;js/bar.js&#8221; + &#8220;js/baz.js&#8221; を圧縮した結果が &#8220;js/foo.min.js&#8221; として保存されます。</p>



<h3 class="wp-block-heading"><a href="https://github.com/gruntjs/grunt-contrib-cssmin">Cssmin</a></h3>



<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://github.com/gruntjs/grunt-contrib-cssmin
</div></figure>



<p>Cssmin は CSSファイルを圧縮する為の Grunt タスクです。 Grunt タスクの多くがそうであるように、基本的な使い方はあまりかわりません。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">cssmin: {
    <span class="hljs-attr">dist</span>: {
        <span class="hljs-attr">options</span>: { ... },
        <span class="hljs-attr">files</span>: {
            <span class="hljs-string">"css/hoge.min.css"</span>: <span class="hljs-string">"css/hoge.css"</span>,
            <span class="hljs-string">"css/foo.min.css"</span>: &#91;<span class="hljs-string">"css/foo.css"</span>, <span class="hljs-string">"css/bar.css"</span>, <span class="hljs-string">"css/baz.css"</span>]
        }
    }
}
</code></span></pre>


<p>単純にファイルを指定する方法の他に、<strong>「指定したディレクトリ内のCSSファイルを全て圧縮して &#8220;*.min.css&#8221; として保存する」</strong> なんていうことも設定次第では<a href="https://github.com/gruntjs/grunt-contrib-cssmin#minify-all-contents-of-a-release-directory-and-add-a-mincss-extension">出来ます。</a> Grunt は素晴らしいですね。</p>



<h2 class="wp-block-heading">その他のミニファイツール</h2>



<h3 class="wp-block-heading"><a href="http://yui.github.io/yuicompressor/">YUI Compressor</a></h3>



<p><a href="http://yui.github.io/yuicompressor">http://yui.github.io/yuicompressor</a></p>



<p>Yahooが提供する、非常に古くからある Java で書かれた JavaScript / CSS 共に圧縮可能なミニファイツールです。 ダウンロードした jar ファイルを java コマンドで実行して使います。設定できるオプション項目は、あまり多くはありません。</p>


<pre class="wp-block-code"><span><code class="hljs">$ java -jar /the/path/to/yuicompressor.x.x.x.jar foo.js -o foo.min.js
</code></span></pre>


<p>基本的な使い方は上の通りで、&#8221;foo.js&#8221; を圧縮した結果を &#8220;foo.min.js&#8221; に保存します。 毎回 jar ファイルを指定するのは面倒なので、Linux / Mac 環境ならば alias を設定したり、 Wndows 環境なら bat ファイルを作成するなどしましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$ alias yuicompressor=<span class="hljs-string">'java -jar /the/path/to/yuicompressor.x.x.x.jar'</span>
</code></span></pre>


<h3 class="wp-block-heading"><a href="https://developers.google.com/closure/">Google Closure Compiler</a></h3>



<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://developers.google.com/closure/
</div></figure>



<p>Google Closure Compiler は Google が提供する JavaScript 用のミニファイツールです。 コマンドラインで使用できる他、<a href="https://developers.google.com/closure/compiler/docs/gettingstarted_api?hl=ja">サービスAPI</a>や<a href="http://closure-compiler.appspot.com/home">オンラインでのテストツール</a>も用意しています。</p>



<p>コマンドラインでは YUI Compressor 同様に Java コマンドで実行します。</p>


<pre class="wp-block-code"><span><code class="hljs">$ java -jar /the/path/to/compiler.jar --js foo.js --js_output_file foo.min.js
</code></span></pre>


<p>Google Closure Compiler には多くのオプションが用意されていますが、 中でも重要なのが圧縮のレベルを3つのモードから選択する <strong>&#8211;compilation_level</strong> です。</p>



<ul class="wp-block-list">
<li><strong>WHITESPACE_ONLY</strong><br /><br />改行や不要なスペース等を除去するだけの、もっとも簡易なモード</li>



<li><strong>SIMPLE_OPTIMIZATIONS</strong><br /><br />WHITESPACE_ONLY モードに加えて、ローカル変数や関数等のリネームによる短縮を行います。<br /><br />これが初期値です。</li>



<li><strong>ADVANCED_OPTIMIZATIONS</strong><br /><br />SIMPLE_OPTIMIZATIONS に加えて、グローバルな変数・関数のリネームを行ったり、<br /><br />恐らく不要であると思われるコードを除去したりする、非常にアグレッシブなモードです。<br /><br />その為のルールに則った書き方をしなければなりません。</li>
</ul>



<p>cf) <a href="https://developers.google.com/closure/compiler/docs/compilation_levels?hl=ja">Closure Compiler Compilation Levels &#8211; Closure Tools — Google Developers</a></p>



<h2 class="wp-block-heading">参考資料</h2>



<ul class="wp-block-list">
<li><a href="http://lisperator.net/uglifyjs/">UglifyJS — JavaScript parser, compressor, minifier written in JS</a></li>



<li><a href="https://github.com/gruntjs/grunt-contrib-uglify">gruntjs/grunt-contrib-uglify</a></li>



<li><a href="https://github.com/gruntjs/grunt-contrib-cssmin">gruntjs/grunt-contrib-cssmin</a></li>



<li><a href="http://yui.github.io/yuicompressor/">YUI Compressor</a></li>



<li><a href="https://developers.google.com/closure/">Closure Tools — Google Developers</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>&#034;LESS&#034; &#8211; Alphabetical Advent Calendar 2013</title>
		<link>https://blog.mach3.jp/2013/12/11/jaac2013-l-less.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Wed, 11 Dec 2013 01:27:25 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Advent Calendar 2013]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[LESS]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3712</guid>

					<description><![CDATA[&#8220;L&#8221; は LESS の &#8220;L&#8221;。 LESS LESS は Sass や Stylus 等と並び称されるCSSのメタ言語です。 くだいて言うと、スタイルシートをもっと楽に効 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>&#8220;L&#8221; は LESS の &#8220;L&#8221;。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/-5LlEB1W9KmU/UqR4i3owvvI/AAAAAAAACYg/1PGmnif8Gvg/s400/ac2013-l.png" alt="L"/></figure>



<p></p>



<span id="more-3712"></span>



<h2 class="wp-block-heading">LESS</h2>



<p><strong>LESS</strong> は <strong>Sass</strong> や <strong>Stylus</strong> 等と並び称されるCSSのメタ言語です。 くだいて言うと、スタイルシートをもっと楽に効率よく書くために開発されたツールです。 三者の中では Sass が筆頭で使われていて、LESS と Stylus がそれに続く印象です。</p>



<p>私の知る限りでは、元々 LESS は Sass と同じく Ruby ベースで開発されていましたが、 並行して開発された LESS.js の方が主流となって JavaScript ベースで開発されるようになり、 現在に至っています。</p>



<h3 class="wp-block-heading">LESS 記法の基本</h3>



<p>上に挙げたメタ言語ではおそらくどれでも共通している機能ですが、</p>



<ul class="wp-block-list">
<li>セレクタを入れ子に出来る</li>



<li>変数が使える</li>



<li>ミックスイン（関数のようなもの）が使える</li>
</ul>



<p>これらの機能を把握しておくだけで、スタイルシートのコーディングが効率化出来るでしょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">// 変数</span>
@color-black: <span class="hljs-comment">#000;</span>
@color-red: <span class="hljs-comment">#c00;</span>

<span class="hljs-comment">// ミックスイン</span>
.mx-box (@bg-color: <span class="hljs-comment">#eee, @radius: 10px){</span>
    background-color: @bg-color;
    border-radius: @radius;
    padding: @radius;
}

<span class="hljs-comment">// セレクタの入れ子</span>
.container {
    .box {
        &amp;.black {
            <span class="hljs-comment">// ミックスインと変数の呼び出し</span>
            .mx-box(@color-black, <span class="hljs-number">8</span>px);
        }
        &amp;.red {
            .mx-box(@color-red, <span class="hljs-number">8</span>px);
        }
    }
}
</code></span></pre>


<p>上のコードを LESS でコンパイルすると、次のようなコードが出力されます。 （拙作ですが、<a href="http://lesstester.com">LESStester.com</a> を使ってオンラインで出力のテストが出来ます）</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-class">.container</span> <span class="hljs-selector-class">.box</span><span class="hljs-selector-class">.black</span> {
    <span class="hljs-attribute">background-color</span>: <span class="hljs-number">#000</span>;
    <span class="hljs-attribute">border-radius</span>: <span class="hljs-number">8px</span>;
    <span class="hljs-attribute">padding</span>: <span class="hljs-number">8px</span>;
}

<span class="hljs-selector-class">.container</span> <span class="hljs-selector-class">.box</span><span class="hljs-selector-class">.red</span> {
    <span class="hljs-attribute">background-color</span>: <span class="hljs-number">#c00</span>;
    <span class="hljs-attribute">border-radius</span>: <span class="hljs-number">8px</span>;
    <span class="hljs-attribute">padding</span>: <span class="hljs-number">8px</span>;
}
</code></span></pre>


<p>残念ながら、この例のコードはあまりに短い為にメタ言語の魅力を十分に伝えきれません。 「単にCSSが長くなっただけじゃないか」と思われる方もいらっしゃるかもしれません。</p>



<p>しかし例えば、似たパーツのバリエーションを多数作らなければいけなかったり、 複雑な子孫関係を持ったセレクタを延々と書かなければならないスタイルシートでは、どうでしょうか。 また、スタイルシートを書いた人の思考は、どちらによりよく反映されるでしょうか。 共有して作業しやすいのは、どちらでしょうか。</p>



<p>コードの行数よりも、調整やメンテナンスの効率で大きな違いが出てくる未来が想像できます。</p>



<h2 class="wp-block-heading">LESS の魅力</h2>



<p>こうしたツールはやはりマジョリティに依りたくなるのが当然です。 機能面でも、歴史があって柔軟かつ多彩な Sass に叶わない部分は多くみられますが、 LESS にも優れている所は勿論あるのです。</p>



<h3 class="wp-block-heading">JavaScript ベースであること</h3>



<p>全て JavaScript で書かれている為、クライアントサイドで動かすことができます。 実際の開発ではコンパイル済みのCSSに差し替えた方が良いと思いますが、 少し何かを試したい場合などには便利ですね。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"stylesheet/less"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"style.less"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"less.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
</code></span></pre>


<p>また、JavaScript ベースだということは、 近年流行にのっている <a href="http://gruntjs.com/">Grunt</a> との相性も良いという事です。</p>



<p>Grunt では Sass / LESS / Stylus 共にコンパイルするプラグインが公式に提供されています。 JSベースである LESS / Stylus は npm でプラグインをインストールすればすぐ使えるようになりますが、 Sass は別途 ruby と sass をインストールしておく必要があります。</p>



<p>また当然、Sass は外部コマンドを node.js から呼ばなければならないので、 どうしてもコンパイルの効率が落ちてしまいます。</p>



<h3 class="wp-block-heading">CSS離れをしない記法であること</h3>



<p>これが LESS を推したい一番の理由なのですが、LESS の記法は他の二者に比べると生のCSSにかなり近い形になっています。 例えば、基本的なミックスイン（関数のようなもの）を LESS で書くとこうなります。</p>


<pre class="wp-block-code"><span><code class="hljs">.border-radius(@radius:10px) {
  -webkit-border-radius: @radius;
     -moz-border-radius: @radius;
          border-radius: @radius;
}
.box { .border-radius(20px); }
</code></span></pre>


<p>CSS でクラスを定義するのとあまり変わりませんね。</p>



<p>「CSS離れをしない」という事は反面、Sass が持つような 条件分岐やループなどの強力な機能を実装しないという事になりますが、 学習コストを抑えられるという点ではメリットになります。</p>



<p>CSSの素養のある方なら誰でもそのコードを理解する事ができ、使いこなすようになるのにさして時間を要しません。</p>



<h3 class="wp-block-heading">Bootstrap は LESS ベースです</h3>



<p>Twitter からリリースされている <a href="http://getbootstrap.com/">Bootstrap</a> は LESS で開発されており、 プロジェクトに Bootstrap を組み込む際には単純にCSSを読み込む他に LESS ファイルを利用する方法があります。</p>



<p>必要なモジュールだけを読み込んだり、変数を書き換えて見た目を調整したりする事ができるほか、 便利なミックスインも多数提供されています。 LESS で設計する際の教材としてみても良いかもしれませんね。</p>



<p>（なお、Bootstrap の Sass 版はサードパーティで公開されている方がいます）</p>



<h2 class="wp-block-heading">注目すべき LESS の機能</h2>



<p>最近になって実装された機能や、おすすめしたい要素等を少しご紹介します。</p>



<h3 class="wp-block-heading">ミックスイン</h3>



<p>ごく基本的な機能ですが、先に紹介した通り LESS のミックスインは非常にシンプルな作りになっています。</p>


<pre class="wp-block-code"><span><code class="hljs">.inline-block(){
    display: inline-block;
    *display: inline;
    *zoom: 1;
}
.test {
    .inline-block();
}
</code></span></pre>


<p>引数を受け取る為の &#8220;()&#8221; 以外は CSS のクラスと変わらない記法です。 さらに、通常の CSS クラスもミックスインとして使用する事ができます。</p>


<pre class="wp-block-code"><span><code class="hljs">.inline-block { ... }
.test {
    .inline-block();
}
</code></span></pre>


<p>上の2つのコードの違いは <strong>&#8220;()&#8221;</strong> の有無ですが、 これが記述されていない場合は通常の CSS クラスとして認識され、それ自身もコンパイル時に出力されます。 &#8220;()&#8221; が記述されていた場合はミックスインとして解釈される為、CSS のコードには出力されません。</p>



<h3 class="wp-block-heading">名前空間</h3>



<p>LESS のミックスインは <strong>名前空間</strong> をサポートしています。 多階層のミックスインを定義し、<strong>&#8220;&gt;&#8221;</strong> で辿る事で呼び出すことができます。</p>


<pre class="wp-block-code"><span><code class="hljs">.font-size (){
    .large (){ font-size: 1.5em; }
    .normal (){ font-size: 1em; }
    .small (){ font-size: 0.8em; }
}
.test {
    .font-size &gt; .large();
}
</code></span></pre>


<p>このコードは次のように出力されます。</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-class">.test</span>{<span class="hljs-attribute">font-size</span>:<span class="hljs-number">1.5em</span>}
</code></span></pre>


<p>ミックスインの名前による衝突をさけたり、LESS ベースのフレームワークを作るときなどに便利そうです。</p>



<h3 class="wp-block-heading">extend</h3>



<p>LESS 1.4 からサポートされたこの機能は、 元々 Sass で実装されていた <strong>extend</strong> を便利に感じた <a href="http://twitter.com/hokaccha">@hokaccha</a> 氏が <a href="http://d.hatena.ne.jp/hokaccha/20111214/1323821463">プルリクエストを送った</a>のが発端になったのだと思われます。 長いディスカッションの末、次のような形に落ち着いた模様です。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">.box {
    background-color: <span class="hljs-comment">#eee;</span>
    border-radius: <span class="hljs-number">.5</span>em;
    padding: <span class="hljs-number">1</span>em;
}
.foo {
    &amp;:extend(.box);
    color: <span class="hljs-comment">#333;</span>
}
.bar {
    &amp;:extend(.box);
    color: <span class="hljs-comment">#00c;</span>
}
</code></span></pre>


<p><strong>&amp;:extend( selector )</strong> とする事で対象のスタイルを受け継ぐ事ができます。 普通のミックスインと違うのは出力の仕方です。 ミックスインの場合は &#8220;.box&#8221; の中身がそのままそこに展開されますが、 extend は巻き上げてグループ化して定義します。</p>



<p>上のコードは次のように出力されます。 最終的なコード量がかなり節約されますね。</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-class">.box</span>,<span class="hljs-selector-class">.foo</span>,<span class="hljs-selector-class">.bar</span>{<span class="hljs-attribute">background-color</span>:<span class="hljs-number">#eee</span>;<span class="hljs-attribute">border-radius</span>:.<span class="hljs-number">5em</span>;<span class="hljs-attribute">padding</span>:<span class="hljs-number">1em</span>}
<span class="hljs-selector-class">.foo</span>{<span class="hljs-attribute">color</span>:<span class="hljs-number">#333</span>}
<span class="hljs-selector-class">.bar</span>{<span class="hljs-attribute">color</span>:<span class="hljs-number">#00c</span>}
</code></span></pre>


<h3 class="wp-block-heading">多彩なインポート</h3>



<p>外部 CSS をインポートする <strong>@import</strong> ですが、LESS では書き方によって特別な働きをします。</p>



<ul class="wp-block-list">
<li><strong>&#8220;*.css&#8221;</strong> をインポートすると @import 文のまま残す</li>



<li><strong>&#8220;*.less&#8221;</strong> をインポートすると、LESS で展開した結果をインポートする</li>



<li><strong>&#8220;*.less&#8221;</strong> の場合は拡張子を省略する事ができる</li>
</ul>



<p>これが基本的なルールですが、 1.4 から <strong>@import (less) &#8220;style.css&#8221;</strong> のように 明示的に展開させる事が出来るようになりました。 現在開発中の 1.5 からは <strong>(inline)</strong> も使えるようになるようです。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// @import 文がそのまま残ります</span>
@<span class="hljs-keyword">import</span> <span class="hljs-string">"style.css"</span>;

<span class="hljs-comment">// LESS でコンパイルされた結果がその場に展開されます。</span>
<span class="hljs-comment">// 拡張子を省略した場合は補完されます。</span>
@<span class="hljs-keyword">import</span> <span class="hljs-string">"style.less"</span>;
@<span class="hljs-keyword">import</span> <span class="hljs-string">"style"</span>;

<span class="hljs-comment">// (1.4~) 明示的にless|cssファイルとして処理する</span>
@<span class="hljs-keyword">import</span> (less) <span class="hljs-string">"style.css"</span>;
@<span class="hljs-keyword">import</span> (css) <span class="hljs-string">"style.css"</span>;

<span class="hljs-comment">// (1.5~) CSSファイルをその場に展開します</span>
@<span class="hljs-keyword">import</span> (inline) <span class="hljs-string">"style.css"</span>;
</code></span></pre>


<h2 class="wp-block-heading">参考資料</h2>



<ul class="wp-block-list">
<li><a href="http://lesscss.org/">LESS « The Dynamic Stylesheet language</a></li>



<li><a href="http://lesstester.com/">LESSTESTER &#8211; Online Compiler fo LESS CSS</a></li>



<li><a href="http://getbootstrap.com/">Bootstrap</a></li>
</ul>



<dl>
<dt>2014/1/10</dt>
<dd>Less の表記を LESS に統一しました。</dd>
</dl>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>FlashCS6+で生成したスプライトシートをjQueryでロードする実験（後編）</title>
		<link>https://blog.mach3.jp/2013/05/14/load-flash-sprite-with-jquery-02.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 14 May 2013 01:22:38 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Animation]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Sprite]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3099</guid>

					<description><![CDATA[前編に引き続き、FlashCS6のスプライトシートをjQueryで処理するお話です。 処理をライブラリにまとめましたので、ご紹介します。 FlashSprite.js Flashspritejs by mach3 Ado [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><a href="/2013/05/load-flash-sprite-with-jquery.html">前編</a>に引き続き、FlashCS6のスプライトシートをjQueryで処理するお話です。 処理をライブラリにまとめましたので、ご紹介します。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-xNwj9NkeFQs/UY_hqVz19JI/AAAAAAAACCQ/WNZ11DXGmtg/s400/20130513-00.png" alt="FlashCS6+で生成したスプライトシートをjQueryでロードする実験（後編）"/></figure>



<p></p>



<span id="more-3099"></span>



<h2 class="wp-block-heading">FlashSprite.js</h2>



<h3 class="wp-block-heading"><a href="http://mach3.github.io/flashspritejs/">Flashspritejs by mach3</a></h3>



<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/-kFIADlJY_kM/UZFMlLZzTJI/AAAAAAAACCw/da9hADPDiDA/s500/20130514-01.png" alt="Flashspritejs by mach3"/></figure>



<p></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Adobe Flash CS6+ で出力されたスプライトアニメーションシートを再生するjQueryベースのライブラリ。</p>
</blockquote>



<p>前回の処理に加えて停止や逆再生、各種設定やイベント発火等の機能を付け足した物です。 使い方は上記URLで概ねわかると思いますが、簡単にご紹介しておきます。</p>



<h2 class="wp-block-heading">簡単な使い方</h2>



<h3 class="wp-block-heading">1. FlashCS6+でスプライトシートを生成する</h3>



<p>FlashIDE上で、ステージに配置したアニメーションインスタンスを右クリックし、 コンテキストメニューから<em>「スプライトシートを生成」</em>を選択してダイアログを開きます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-rEkIabD4d0E/UY_f01DzSxI/AAAAAAAACB4/dfA1WWWMeeU/s498/20130513-02.png" alt="スプライトシートを生成"/></figure>



<p></p>



<p>データ形式は<em>「JSON-Array」</em>を選択し、<em>「書き出し」</em>を行います。 ステージ上でインスタンス名を付けておけばその名前でファイルが作成されます。</p>



<h3 class="wp-block-heading">2. 配置する</h3>



<p>画像ファイルとJSONファイルが出力されるので、任意の場所に保存しましょう。 今回はこんな感じにしてみます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>./<br />
  ├ data/<br />
  │ ├ sprite.json<br />
  │ └ sprite.png<br />
  └ index.html</p>
</blockquote>



<h3 class="wp-block-heading">3. ロードする</h3>



<p>jQueryとFlashSprite.jsを読み込んで、新しい要素を生成してスプライトアニメーションを初期化します。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-keyword">var</span> myAnimation = $(<span class="hljs-string">"&lt;div&gt;"</span>);
        myAnimation.flashSprite({
                <span class="hljs-attr">src</span> : <span class="hljs-string">"data/sprite.json"</span>
        })
        .appendTo($(<span class="hljs-string">"body"</span>));
}());
</code></span></pre>


<p><strong>$.fn.flashSprite()</strong> にオプションを渡す事で初期化され、要素にロードされます。 デフォルトの設定では自動再生がオンになっているので、初期化した時点で再生がはじまります。</p>



<p>無事再生されましたか？</p>



<h2 class="wp-block-heading">イベントとメソッドを使ってみる</h2>



<p>イベントとメソッドを使う事でもう少し細かい処理をする事ができます。 下の例では、データロードの完了を待って、アニメーションを配置・フェードインさせています。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-keyword">var</span> myAnimation = $(<span class="hljs-string">"&lt;div&gt;"</span>);

        <span class="hljs-comment">// JSONと画像がロードされると "flashSpriteReady" イベントが発火します</span>
        myAnimation.on(<span class="hljs-string">"flashSpriteReady"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
                $(<span class="hljs-keyword">this</span>).hide()
                .appendTo($(<span class="hljs-string">"body"</span>))
                .flashSprite(<span class="hljs-string">"config"</span>, { <span class="hljs-attr">fps</span> : <span class="hljs-number">60</span> }) <span class="hljs-comment">// "config" メソッドで設定変更</span>
                .flashSprite(<span class="hljs-string">"play"</span>) <span class="hljs-comment">// "play" メソッドで再生</span>
                .fadeIn();
        });

        myAnimation.flashSprite({
                <span class="hljs-attr">src</span> : <span class="hljs-string">"data/sprite.json"</span>,
                <span class="hljs-attr">autoPlay</span> : <span class="hljs-literal">false</span>, <span class="hljs-comment">// 自動再生をオフに</span>
                <span class="hljs-attr">repeat</span> : <span class="hljs-literal">false</span> <span class="hljs-comment">// 繰り返し再生をオフに</span>
        });
}());
</code></span></pre>


<p>イベントには、ロード完了時に発火される <em>&#8220;flashSpriteReady&#8221;</em> の他に、 停止時の <em>&#8220;flashSrpiteEnd&#8221;</em>、フレーム毎に発火する <em>&#8220;flashSpriteEnterFrame&#8221;</em> が用意されています。</p>



<p>また、<em>jQuery.fn.flashSprite()</em> にメソッド名を文字列で渡すことでメソッドを呼び出す事ができます。 第二引数以降はそのメソッドに渡されます。</p>



<p>それぞれの詳細は<a href="http://mach3.github.com/flashspritejs">ドキュメント</a>をご参照ください。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>と、こんな感じで作ってみました。</p>



<p>実際のところ、機能豊富なCreateJSを利用すべき場面の方が多いと思いますが、 その為に大きなソースを追加で読み込まなければならないのも事実。</p>



<p>ただパラパラ漫画を再生する為だけに大仰な…と感じるようなケースなら、 こんな単機能のライブラリも使い道があるのかな、と思います。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>FlashCS6+で生成したスプライトシートをjQueryでロードする実験（前編）</title>
		<link>https://blog.mach3.jp/2013/05/13/load-flash-sprite-with-jquery.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Mon, 13 May 2013 01:28:32 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Animation]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Sprite]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3090</guid>

					<description><![CDATA[結構前の話ではありますが、FlashはCS6から、アニメーションを「スプライトシート」として書き出す機能が実装されています。 これはCreateJS等で簡単に再生出来る様になる便利な機能ですが、 今回はこのスプライトシー [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>結構前の話ではありますが、FlashはCS6から、アニメーションを「スプライトシート」として書き出す機能が実装されています。 これはCreateJS等で簡単に再生出来る様になる便利な機能ですが、 今回はこのスプライトシートをjQueryで再生してみようというお話です。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-xNwj9NkeFQs/UY_hqVz19JI/AAAAAAAACCQ/WNZ11DXGmtg/w400-h150-no/20130513-00.png" alt="FlashCS6+で生成したスプライトシートをjQueryでロードする実験"/></figure>



<p></p>



<span id="more-3090"></span>



<h2 class="wp-block-heading">スプライトシートってなに</h2>



<p>スプライトシートは、CSSスプライトを利用したアニメーションテクニックです。 アニメーションの全フレームを一つの画像に並べて配置し、 要素の背景画像として埋め込んで background-position を変更していくことで パラパラ漫画のようなアニメーションを再生します。概要はこんな感じ。</p>



<p>一年程前、CS6が出るちょっとだけ前に似たような記事を書いたことがありました。</p>



<ul class="wp-block-list">
<li><a href="/2012/05/moviecrop-js.html">シンプルなスプライトアニメーションライブラリ 「MovieCrop.js」 | Mach3.laBlog</a></li>
</ul>



<p>上の記事はまだCS6が出る前だったので自力でスプライトシートを作成する前提のものですが、 せっかく出力する機能があるんだから利用させて頂こうという事で、今回の記事なわけです。</p>



<h3 class="wp-block-heading">CreateJSでやればよくない？</h3>



<p>その通りです。その方が効率的なのでそれでいいと思います。</p>



<p>今回の記事は、あまり多くの依存ライブラリを読み込みたくなかったり、 宗教上の理由や遺言、あるいは政治的外圧等でjQueryで処理せざるを得ないケースを想定したものです。 CreateJSでの利用の仕方については、おそらく多くの方が詳しい記事を書いてくださっているので、そちらをご参照ください。</p>



<h2 class="wp-block-heading">FlashCS6+でスプライトシートを生成する</h2>



<p>例えば、FlashCS6でアニメーションのムービークリップ等を作り、それをステージに設置します。 その設置されたインスタンスを右クリックすると、コンテキストメニューに「スプライトシートを生成」が表れます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/-L2oEk1ZBi1M/UY_f0ddqmoI/AAAAAAAACB4/JCDGQgWdXIM/w500-h300-no/20130513-01.png" alt="コンテキストメニュー"/></figure>



<p></p>



<p>それを選択すると現れるのがこんなダイアログ。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-rEkIabD4d0E/UY_f01DzSxI/AAAAAAAACB4/dfA1WWWMeeU/w498-h383-no/20130513-02.png" alt="スプライトシートを生成"/></figure>



<p></p>



<p>ここから「書き出し」を行うと、画像とデータ形式で指定したデータが出力されます。 指定出来るデータはJSON、各種ゲームエンジンの形式、そしてCreateJSのeaseljs形式です。</p>



<p>今回は使いやすそうだった &#8220;JSON-Array&#8221; 形式を使用します。</p>



<h2 class="wp-block-heading">JSONデータの中身</h2>



<p>&#8220;JSON-Array&#8221; で出力されたJSONデータの中身はこのような構成になっています。</p>


<pre class="wp-block-code"><span><code class="hljs language-json">{
        <span class="hljs-attr">"frames"</span>: &#91;
                {
                        <span class="hljs-attr">"filename"</span>: <span class="hljs-string">"loading0000"</span>,
                        <span class="hljs-attr">"frame"</span>: {<span class="hljs-attr">"x"</span>:<span class="hljs-number">0</span>,<span class="hljs-attr">"y"</span>:<span class="hljs-number">0</span>,<span class="hljs-attr">"w"</span>:<span class="hljs-number">33</span>,<span class="hljs-attr">"h"</span>:<span class="hljs-number">33</span>},
                        <span class="hljs-attr">"rotated"</span>: <span class="hljs-literal">false</span>,
                        <span class="hljs-attr">"trimmed"</span>: <span class="hljs-literal">false</span>,
                        <span class="hljs-attr">"spriteSourceSize"</span>: {<span class="hljs-attr">"x"</span>:<span class="hljs-number">0</span>,<span class="hljs-attr">"y"</span>:<span class="hljs-number">0</span>,<span class="hljs-attr">"w"</span>:<span class="hljs-number">33</span>,<span class="hljs-attr">"h"</span>:<span class="hljs-number">33</span>},
                        <span class="hljs-attr">"sourceSize"</span>: {<span class="hljs-attr">"w"</span>:<span class="hljs-number">33</span>,<span class="hljs-attr">"h"</span>:<span class="hljs-number">33</span>}
                }
                ,{
                        <span class="hljs-attr">"filename"</span>: <span class="hljs-string">"loading0001"</span>,
                        <span class="hljs-attr">"frame"</span>: {<span class="hljs-attr">"x"</span>:<span class="hljs-number">33</span>,<span class="hljs-attr">"y"</span>:<span class="hljs-number">0</span>,<span class="hljs-attr">"w"</span>:<span class="hljs-number">33</span>,<span class="hljs-attr">"h"</span>:<span class="hljs-number">33</span>},
                        <span class="hljs-attr">"rotated"</span>: <span class="hljs-literal">false</span>,
                        <span class="hljs-attr">"trimmed"</span>: <span class="hljs-literal">false</span>,
                        <span class="hljs-attr">"spriteSourceSize"</span>: {<span class="hljs-attr">"x"</span>:<span class="hljs-number">0</span>,<span class="hljs-attr">"y"</span>:<span class="hljs-number">0</span>,<span class="hljs-attr">"w"</span>:<span class="hljs-number">33</span>,<span class="hljs-attr">"h"</span>:<span class="hljs-number">33</span>},
                        <span class="hljs-attr">"sourceSize"</span>: {<span class="hljs-attr">"w"</span>:<span class="hljs-number">33</span>,<span class="hljs-attr">"h"</span>:<span class="hljs-number">33</span>}
                }

                ...

        ],
        <span class="hljs-attr">"meta"</span>: {
                <span class="hljs-attr">"app"</span>: <span class="hljs-string">"Adobe Flash CS6"</span>,
                <span class="hljs-attr">"version"</span>: <span class="hljs-string">"12.0.0.481"</span>,
                <span class="hljs-attr">"image"</span>: <span class="hljs-string">"sample.png"</span>,
                <span class="hljs-attr">"format"</span>: <span class="hljs-string">"RGBA8888"</span>,
                <span class="hljs-attr">"size"</span>: {<span class="hljs-attr">"w"</span>:<span class="hljs-number">256</span>,<span class="hljs-attr">"h"</span>:<span class="hljs-number">256</span>},
                <span class="hljs-attr">"scale"</span>: <span class="hljs-string">"1"</span>
        }
}
</code></span></pre>


<p>&#8220;frames&#8221; が実際のアニメーションのデータで、配列の中に個々のフレームの情報（サイズや座標等）を格納したオブジェクトが並んでいます。</p>



<p>&#8220;meta&#8221; にはスプライトシートの基本情報が格納されています。</p>



<h3 class="wp-block-heading">このデータから再生するには…</h3>



<p>アニメーションを再生するには、&#8221;frames&#8221;内のインデックスをひとつずつ進めてやり、格納されている座標情報を元に背景画像を移動してやる要領でしょうか。 座標は画像の左上からの座標なので、これを background-position に適用する際はマイナスの数値にしてやる必要がありますね。</p>



<h2 class="wp-block-heading">再生させてみよう</h2>



<p>では早速このデータを元にアニメーションを設置し、再生させてみましょう。 JSONデータも画像データもHTMLと同じディレクトリにある想定で進めます。</p>



<h3 class="wp-block-heading">JSONを読み込む</h3>



<p>まずJSONデータを読み込みます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">$</span>)</span>{

    $.getJSON(<span class="hljs-string">"sample.json"</span>)
    .then(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">data, status</span>)</span>{
            <span class="hljs-keyword">var</span> my = {};

            my.data = data;

            <span class="hljs-comment">// この中でいろいろしよう</span>
    });

}(jQuery));
</code></span></pre>


<h3 class="wp-block-heading">アニメーションの要素を生成、配置する</h3>



<p>受け取ったJSONのデータの内容から、アニメーション用のHTML要素を生成し、bodyに配置します。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">my.node = $(<span class="hljs-string">"&lt;div&gt;"</span>).css({
    <span class="hljs-string">"width"</span> : my.data.frames&#91;<span class="hljs-number">0</span>].sourceSize.w,
    <span class="hljs-string">"height"</span> : my.data.frames&#91;<span class="hljs-number">0</span>].sourceSize.h,
    <span class="hljs-string">"background-image"</span> : <span class="hljs-string">"url("</span> + my.data.meta.image + <span class="hljs-string">")"</span>
})
.appendTo($(<span class="hljs-string">"body"</span>));
</code></span></pre>


<p>要素のサイズははじめのフレームの &#8220;sourceSize&#8221; から取得することにします。</p>



<p>画像は、前述の通り同じディレクトリで展開する想定なのでそのまま代入していますが、<br />
恐らく運用時は他のディレクトリに入れると思うので、その時はその時で画像へのパスをなんやかんやする必要がありますね。</p>



<h3 class="wp-block-heading">再生する</h3>



<p>今回は、単純に setTimeout で再生用の関数をぶん回して繰り返し再生を行います。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">my.index = <span class="hljs-number">0</span>; <span class="hljs-comment">// 現在のフレームインデックス</span>
my.length = my.data.frames.length; <span class="hljs-comment">// 合計フレーム数</span>
my.interval = <span class="hljs-built_in">Math</span>.floor(<span class="hljs-number">1000</span>/<span class="hljs-number">30</span>); <span class="hljs-comment">// 約FPS30ぐらいで再生</span>

my.play = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-keyword">var</span> frame;

    my.index = (my.index + <span class="hljs-number">1</span>) % (my.length - <span class="hljs-number">1</span>);
    frame = my.data.frames&#91;my.index].frame;
    my.node.css(
            <span class="hljs-string">"background-position"</span>,
            <span class="hljs-string">"-"</span> + frame.x + <span class="hljs-string">"px -"</span> + frame.y + <span class="hljs-string">"px"</span>
    );
    setTimeout(my.play, my.interval);
};

my.play();
</code></span></pre>


<p>他にも、ページのスクロール位置やマウスの挙動などをトリガーにしたりすると表現の幅が広がりますね。</p>



<h3 class="wp-block-heading">全体のコード</h3>


<pre class="wp-block-code"><span><code class="hljs language-javascript">(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">$</span>)</span>{

    $.getJSON(<span class="hljs-string">"sample.json"</span>)
    .then(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">data, status</span>)</span>{

        <span class="hljs-keyword">var</span> my = {};

        my.data = data;

        my.node = $(<span class="hljs-string">"&lt;div&gt;"</span>).css({
            <span class="hljs-string">"width"</span> : my.data.frames&#91;<span class="hljs-number">0</span>].sourceSize.w,
            <span class="hljs-string">"height"</span> : my.data.frames&#91;<span class="hljs-number">0</span>].sourceSize.h,
            <span class="hljs-string">"background-image"</span> : <span class="hljs-string">"url("</span> + my.data.meta.image + <span class="hljs-string">")"</span>
        })
        .appendTo($(<span class="hljs-string">"body"</span>));

        my.index = <span class="hljs-number">0</span>;
        my.length = my.data.frames.length;
        my.interval = <span class="hljs-built_in">Math</span>.floor(<span class="hljs-number">1000</span>/<span class="hljs-number">30</span>);

        my.play = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
            <span class="hljs-keyword">var</span> frame;

            my.index = (my.index + <span class="hljs-number">1</span>) % (my.length - <span class="hljs-number">1</span>);
            frame = my.data.frames&#91;my.index].frame;
            my.node.css(
                    <span class="hljs-string">"background-position"</span>,
                    <span class="hljs-string">"-"</span> + frame.x + <span class="hljs-string">"px -"</span> + frame.y + <span class="hljs-string">"px"</span>
            );
            setTimeout(my.play, my.interval);
        };
        my.play();
    });
}(jQuery));
</code></span></pre>


<h2 class="wp-block-heading">めんどくさい！</h2>



<p>勿論毎度これは面倒なので、ライブラリ化してみましたが、それは後編で。</p>



<p>» <a href="https://blog.mach3.jp/2013/05/load-flash-sprite-with-jquery-02.html">FlashCS6+で生成したスプライトシートをjQueryでロードする実験（後編） | Mach3.laBlog</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>コーダーさんの為のGrunt入門（後編）〜CSSプリコンパイラ編</title>
		<link>https://blog.mach3.jp/2013/03/26/gruntjs-css.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 26 Mar 2013 01:28:16 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Grunt.js]]></category>
		<category><![CDATA[LESS]]></category>
		<category><![CDATA[Sass]]></category>
		<category><![CDATA[Stylus]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3066</guid>

					<description><![CDATA[前編の導入編 に続いて、 コーダーさんにとって強力な武器である、Less/Sass/Stylus等のCSSプリコンパイラのコンパイルを Gruntにお任せしてみる方法を紹介していきます。 Less/Sass/Stylus [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><a href="/2013/03/gruntjs.html">前編の導入編</a> に続いて、 コーダーさんにとって強力な武器である、Less/Sass/Stylus等のCSSプリコンパイラのコンパイルを Gruntにお任せしてみる方法を紹介していきます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-InKstkN_iLo/UUl5hpVLk2I/AAAAAAAACAg/zGNCjzkb8f0/s400/20120320-00.png" alt="コーダーさんの為のGrunt入門（後編）〜CSSプリコンパイラ編"/></figure>



<p></p>



<span id="more-3066"></span>



<h2 class="wp-block-heading">Less/Sass/Stylus をGruntでコンパイルする</h2>



<p>ではさっそく、GruntでCSSプリコンパイラを扱うタスクを紹介します。</p>



<ul class="wp-block-list">
<li><a href="https://github.com/gruntjs/grunt-contrib-less">grunt-contrib-less</a> &#8211; LessをCSSにコンパイルします</li>



<li><a href="https://github.com/gruntjs/grunt-contrib-sass">grunt-contrib-sass</a> &#8211; SassをCSSにコンパイルします</li>



<li><a href="https://github.com/gruntjs/grunt-contrib-stylus">grunt-contrib-stylus</a> &#8211; StylusをCSSにコンパイルします</li>
</ul>



<p>指定できるオプションは異なりますが、設定の仕方に差はありません。</p>



<p>違いを挙げるならば、Less/StylusはJavaScriptで書かれているのでnode.js上で動作させられますが、 RubyベースのSassは外部のsassコマンドを呼び出す仕組みになっており、別途インストールが必要です。 結果、Gruntとより相性が良いのはLess/Stylusであると言えますね。</p>



<p>ここでは、私の好きなLessを例にあげてみます。</p>



<h2 class="wp-block-heading">Lessをコンパイルする（grunt-contrib-less）</h2>



<h3 class="wp-block-heading">基本設定</h3>



<p>まず &#8220;grunt-contrib-less&#8221; をインストールしておきます。</p>


<pre class="wp-block-code"><span><code class="hljs">$ npm install grunt-contrib-less
</code></span></pre>


<p>Gruntfile.js の内容は、例えば次のようになります。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-built_in">module</span>.exports = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">grunt</span>)</span>{

    <span class="hljs-comment">// grunt-contrib-less タスクの読み込み</span>
    grunt.loadNpmTasks(<span class="hljs-string">"grunt-contrib-less"</span>);

    grunt.initConfig({
        <span class="hljs-attr">less</span> : {
            <span class="hljs-comment">// 作業のラベルは"dist"にしてみます</span>
            <span class="hljs-attr">dist</span> : {
                <span class="hljs-comment">// オプションの指定</span>
                <span class="hljs-attr">options</span> : {
                    <span class="hljs-attr">compress</span> : <span class="hljs-literal">true</span>
                },
                <span class="hljs-comment">// コンパイルするファイルの指定</span>
                <span class="hljs-attr">files</span> : {
                    <span class="hljs-string">"./assets/css/style.css"</span> : <span class="hljs-string">"./assets/less/style.less"</span>
                }
            }
        }
    });
};
</code></span></pre>


<p>※ 基本的なタスクの書き方については <a href="/2013/03/gruntjs.html">前編</a> にて</p>



<p><em>&#8220;options&#8221;</em>セクションでオプションの設定を行い、 <em>&#8220;files&#8221;</em>セクションで出力するファイルの指定を行います。</p>



<p><em>&#8220;files&#8221;</em>のキー（左辺）には出力先のCSSファイル、値（右辺）には元となるLessファイルへのパスを指定してください。 上の例では、 &#8220;./assets/less/style.less&#8221; がコンパイルされた結果が、&#8221;./assets/css/style.css&#8221; に保存されます。</p>



<h3 class="wp-block-heading">実行</h3>


<pre class="wp-block-code"><span><code class="hljs">$ grunt less:dist
</code></span></pre>


<h3 class="wp-block-heading">オプション</h3>



<p>多く使われるであろうオプションは次の物でしょう。</p>



<ul class="wp-block-list">
<li><em>compress</em> : Boolean (false) &#8211; 空白などを除去して圧縮します</li>



<li><em>yuicompress</em> : Boolean (false) &#8211; cssmin.js（YUICompressorのJS版）で圧縮します</li>
</ul>



<p>その他のオプションについては <a href="https://github.com/gruntjs/grunt-contrib-less">grunt-contrib-lessのREADME</a> を参照してください。</p>



<h2 class="wp-block-heading">ファイルの更新を検知してコンパイルする（grunt-contrib-watch）</h2>



<h3 class="wp-block-heading">基本設定</h3>



<p>多くのコンパイラにも実装されているファイル監視機能ですが、 Gruntでも <a href="http://github.com/gruntjs/grunt-contrib-watch">grunt-contrib-watch</a> というプラグインとして提供されています。</p>


<pre class="wp-block-code"><span><code class="hljs">npm install grunt-contrib-watch
</code></span></pre>


<p>先ほどのLessのタスクを、ファイルを監視して実行してみます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-built_in">module</span>.exports = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">grunt</span>)</span>{
    grunt.loadNpmTasks(<span class="hljs-string">"grunt-contrib-less"</span>);
    grunt.loadNpmTasks(<span class="hljs-string">"grunt-contrib-watch"</span>);

    grunt.initConfig({
        <span class="hljs-attr">less</span> : {
            <span class="hljs-attr">dist</span> : { ... }
        },
        <span class="hljs-attr">watch</span> : {
            <span class="hljs-comment">// ラベルは"less"にしてみます</span>
            <span class="hljs-attr">less</span> : {
                <span class="hljs-comment">// "files"セクションで監視するファイルの条件を指定</span>
                <span class="hljs-attr">files</span> : &#91;
                    <span class="hljs-string">"./assets/less/*.less"</span>
                ],
                <span class="hljs-comment">// "tasks"セクションで実行するタスクを指定</span>
                <span class="hljs-attr">tasks</span> : &#91;
                    <span class="hljs-string">"less:dist"</span>
                ]
            }
        }
    });
};
</code></span></pre>


<p><em>&#8220;files&#8221;</em>セクションで監視するファイルの条件を設定します。 そして<em>&#8220;tasks&#8221;</em>セクションで、<em>&#8220;files&#8221;</em>のファイルが更新された場合に実行するタスクを設定します。</p>



<p><em>&#8220;files&#8221;</em>の値には、直接ファイル名を指定する他にパターンマッチングを使用する事ができ、特定ファイルの除外などの細かい設定が可能です。 詳細は公式ドキュメントにあるのでご参照ください。</p>



<p>cf) <a href="http://gruntjs.com/configuring-tasks#globbing-patterns">Globbing patterns | Configuring tasks &#8211; Grunt: The JavaScript Task Runner</a></p>



<h3 class="wp-block-heading">実行</h3>



<p>監視を開始するとターミナルは待機状態になります。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$ grunt watch:less
Running <span class="hljs-string">"watch:less"</span> task
Waiting...
</code></span></pre>


<p>&#8220;./assets/less/&#8221; にあるLessファイルを更新すると、自動的に &#8220;less:dist&#8221; タスクを実行する様になります。</p>



<h3 class="wp-block-heading">livereload もある？</h3>



<p>私は使ったことがありませんが、livereload（ファイル更新を検知してブラウザをリロードする）を実現するプラグインもあるようです。</p>



<ul class="wp-block-list">
<li><a href="https://github.com/gruntjs/grunt-contrib-livereload">gruntjs/grunt-contrib-livereload · GitHub</a></li>
</ul>



<p>ここでは説明を省きますが、このプラグインは上で挙げた <em>&#8220;grunt-contrib-watch&#8221;</em> ではなく <a href="https://github.com/yeoman/grunt-regarde">&#8220;grunt-regarde&#8221;</a> の使用が推奨されるようです。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Note that grunt-contrib-livereload is designed to use grunt-regarde instead grunt-contrib-watch (mainly due to shortcomings in the watch task which doesn&#8217;t give access to changed files because it spawns tasks in subprocesses.)</p>
</blockquote>



<h2 class="wp-block-heading">GUIコンパイラでいいんじゃないの？</h2>



<p>非常にもっともなご意見です。</p>



<p>本記事で挙げたCSSプリコンパイラの事例に限って言えば、 <a href="http://compass.handlino.com/">Compass</a>、<a href="http://incident57.com/codekit/">CodeKit</a>や<a href="http://incident57.com/less/">Less.app</a>等、優秀なGUIコンパイラが数多くリリースされているので、 「黒い画面」が苦手な方は無理して導入する事もないと思います。</p>



<p>ただ、GUIコンパイラに対するGruntの優位点を挙げるとすれば、 環境を跨いでの設定の共有が極めて容易な点かな、と思っています。 nodeが動く環境ならばOS問わずどこでも同じ設定ファイルで、コマンド一発で同じ事が出来るわけです。</p>



<p><a href="/2013/03/gruntjs.html">前編</a>で触れたGruntの魅力に興味を持たれたならば、 これを機に「黒い画面」とのお付き合いを始めてみても良いのではないでしょうか。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>そんなわけで、最近ではGitとGruntとBowerのセットで制作を進めています。</p>



<p>これらの優秀なソフトウェアの開発者には足をむけて寝られませんが、 オープンソース故に多方面にいらっしゃるわけで、逆立ちして寝るしかなさそうです。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ブロック要素の高さを行毎にあわせるjQueryプラグインを習作する</title>
		<link>https://blog.mach3.jp/2013/03/04/jquery-lineup.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Mon, 04 Mar 2013 04:20:38 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Plugin]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3018</guid>

					<description><![CDATA[既知の類似プラグインは多数あるこの課題ですが、ちょっと習作してみました。 横並びにレイアウトされたブロック要素の高さを揃えるライブラリです。 なにをしたいのか 例えば、フロートなどで横並びにした要素があって、それぞれの高 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>既知の類似プラグインは多数あるこの課題ですが、ちょっと習作してみました。 横並びにレイアウトされたブロック要素の高さを揃えるライブラリです。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-TSd5WohPCGs/UTQfLChlnQI/AAAAAAAAB_w/TkFc4tMI7mI/s400/20130304-00.png" alt="ブロック要素の高さを行毎にあわせるjQueryプラグインを習作する"/></figure>



<p></p>



<span id="more-3018"></span>



<h2 class="wp-block-heading">なにをしたいのか</h2>



<p>例えば、フロートなどで横並びにした要素があって、それぞれの高さを揃えたい時があります。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/-lp97dUVlQBY/UTQfLKfMYUI/AAAAAAAAB_w/SiY77LGJ1WQ/s586/20130304-01.png" alt="ブロック要素の高さを行毎にあわせる"/></figure>



<p></p>



<p>こんな感じに。この処理をしてくれるライブラリを書いてみます。</p>



<h2 class="wp-block-heading">書いてみた物</h2>



<h3 class="wp-block-heading"><a href="http://mach3.github.com/jquery-lineup/">jQuery.lineUp</a></h3>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/-u17jUX-izt0/UTQfLG7vKhI/AAAAAAAAB_w/JwEyWhSlHhM/s500/20130304-02.png" alt="jQuery.lineUp"/></figure>



<p><a href="http://mach3.github.com/jquery-lineup/">  </a></p>



<h3 class="wp-block-heading">使い方</h3>



<p>例えばこんな要素があるとして</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"items"</span>&gt;</span>
    <span class="hljs-comment">&lt;!-- 異なるコンテンツ量のブロック達 --&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"item"</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"item"</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"item"</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"item"</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"item"</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></span></pre>


<p>こんなスタイルが当たっているとします。</p>


<pre class="wp-block-code"><span><code class="hljs">.items {
    overflow: hidden;
}
.items .item {
    float: left;
    width: 200px;
    ...
}
</code></span></pre>


<p>この .item に対して整列の処理を行いたい場合は次のようにします。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-string">".item"</span>).lineUp();
</code></span></pre>


<p>オプションを渡して設定ができます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-string">".item"</span>).lineUp({
    <span class="hljs-attr">onResize</span> : <span class="hljs-literal">false</span>,
    <span class="hljs-attr">onFontResize</span> : <span class="hljs-literal">false</span>
});
</code></span></pre>


<p>オプションの詳細や、その他の細かい機能等は <a href="https://github.com/mach3/jquery-lineup/blob/master/README.md">README</a> をご参照ください。</p>



<p>また、Ajax等で要素の高さが変わるような場合、 非同期処理のコールバックなどで再度同じセレクタに対してlineUpを実行するとリフレッシュされます。（追記:2013/3/4）</p>



<h2 class="wp-block-heading">主な特徴</h2>



<p>JavaScriptでこの処理を行うにあたって色んなアプローチがあるとは思いますが、 注意してみたのは次のような点です。</p>



<h3 class="wp-block-heading">行毎に高さを設定する</h3>



<p>行毎に最大の高さを求めて、その高さにあわせてheightを更新します。</p>



<p>他の類似ライブラリ等では、行のグループ分けをクラス名で行う物などがありましたが、 今回は自動で行を判定して一行ずつ処理しています。 判定材料には jQuery.fn.position().top を使いました。</p>



<h3 class="wp-block-heading">ウィンドウサイズ・文字サイズ変更時に自動更新する</h3>



<p>これは他のライブラリでも多く実装されていますね。 設定で無効にする事もできます。</p>



<h3 class="wp-block-heading">script要素のdata-*属性でセレクタを設定する</h3>



<p>jquery-lineup.js を読み込んでいるscript要素のdata-lineup-selector属性を設定する事で、 そのセレクタに対してdomreadyのタイミングでjQuery.fn.lineUpを実行します。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"assets/js/jquery-lineup.js"</span> <span class="hljs-attr">data-lineup-selector</span>=<span class="hljs-string">".item-a, .item-b"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
</code></span></pre>


<p>これは次の内容と同じ処理をします。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"assets/js/jquery-lineup.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="javascript">
$(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    $(<span class="hljs-string">".item-a"</span>).lineUp();
    $(<span class="hljs-string">".item-b"</span>).lineUp();
});
</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
</code></span></pre>


<p>JavaScriptファイルを連結してミニファイしたりする場合にはちょっとアレですが、 そうでない場合には便利かもしれないのでつけてみたオマケ機能です。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>車輪の再発明ですね。</p>



<p>私自身、そういうレイアウトを組む必要性にあまり出会ったことはないのですが、 必要になった時にまた実用してみたいと思います。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<dl>
<dt>2013/3/4</dt>
<dd>バグを見つけたので修正。ついでに非同期処理に関して追記</dd>
</dl>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>スタイルガイドを生成する「StyleDocco」の使用感</title>
		<link>https://blog.mach3.jp/2013/01/07/styledocco.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Mon, 07 Jan 2013 01:31:35 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Grunt.js]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[Styledocco]]></category>
		<category><![CDATA[Styleguide]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2944</guid>

					<description><![CDATA[先日スタイルガイドを制作する機会がありまして、 せっかくなので、スタイルガイドの生成に利用したStyleDoccoの使用感などをまとめておきます。 スタイルガイドについて ざっくり言うとスタイルシートのドキュメントです。 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>先日スタイルガイドを制作する機会がありまして、 せっかくなので、スタイルガイドの生成に利用したStyleDoccoの使用感などをまとめておきます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/-n9KiTBJByMY/UOlgq5P3IrI/AAAAAAAAB5s/Lnug37hl7KA/s400/20120106-00.png" alt="スタイルガイドを生成する「StyleDocco」の使用感"/></figure>



<p></p>



<span id="more-2944"></span>



<h2 class="wp-block-heading">スタイルガイドについて</h2>



<p>ざっくり言うとスタイルシートのドキュメントです。</p>



<p>自分一人で完結するその場限りのページなら良いのですが、 複数人のチームで組み込んでいたり、メンテナンス担当が他の方だったりする場合、 プロジェクトのCSSをドキュメント化しておく必要が出てきますね。例えば、</p>



<ul class="wp-block-list">
<li>どのような命名規則や方針で書かれていて</li>



<li>どこになにがあり</li>



<li>どのようなモジュールがどこで使えて</li>



<li>そのモジュールはどうするとどのような挙動を起こすのか</li>
</ul>



<p>等をまとめておく文書になると思います。 規模によってはかなり骨な作業になりそうです。</p>



<h2 class="wp-block-heading">StyleDoccoとは</h2>



<ul class="wp-block-list">
<li><a href="http://jacobrask.github.com/styledocco/">StyleDocco</a></li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>StyleDocco generates documentation and style guide documents from your stylesheets.</p>
</blockquote>



<p>スタイルシートを読み込んで、自動的にドキュメンテーションを生成してくれるツールです。</p>



<p>その為の記法に従う必要がありますが、 基本的にはCSSの記述の前に、コメント（ /* */ )で、概要文とプレビュー用のHTMLを書くだけです。 もちろんそのままCSSとしても機能します。</p>



<h2 class="wp-block-heading">インストール</h2>



<p>早速インストールをしてみます。 node.jsで動作するので、先に導入しておきましょう。</p>



<p>node.jsが入ったら、npmコマンドを叩くだけです。<br />
※環境によってはsudoや管理者権限が必要だったりします。</p>


<pre class="wp-block-code"><span><code class="hljs">$ npm install -g styledocco
</code></span></pre>


<h2 class="wp-block-heading">使い方</h2>



<h3 class="wp-block-heading">CSSの書き方</h3>



<p>前述の通り、ドキュメントの生成にはその為の記法に従う必要があります。</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-comment">/*
# ボタン

基本的なボタンスタイル。

    &lt;button class="button"&gt;ボタン&lt;/button&gt;

*/</span>

<span class="hljs-selector-class">.button</span> {
    <span class="hljs-attribute">border-radius</span>:<span class="hljs-number">4px</span>;
    <span class="hljs-attribute">border</span>:<span class="hljs-number">1px</span> solid <span class="hljs-number">#ccc</span>;
    <span class="hljs-attribute">background-color</span>:<span class="hljs-number">#f9f9f9</span>;
}
</code></span></pre>


<ul class="wp-block-list">
<li>概要文はMarkdown記法に対応しています。</li>



<li>プレビュー用のHTMLにはインデントが必要です。<br /><br />（タブでもいけましたが、一応公式によれば4スペースとの事です。）</li>
</ul>



<h3 class="wp-block-heading">生成コマンド</h3>



<p>インストールすると <code>styledocco</code> コマンドが使用出来るようになります。 以下は、「css」ディレクトリの中のファイルを元にドキュメントを生成する例。 出力先はデフォルトで「docs」ディレクトリになります。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$ styledocco -n <span class="hljs-string">"My Project"</span> css
</code></span></pre>


<p>使いそうな引数オプションはここらへんでしょうか。</p>



<ul class="wp-block-list">
<li>&#8211;name -n プロジェクト名（ドキュメントタイトルになります）</li>



<li>&#8211;out -o 出力ディレクトリ（デフォルトはdocs）</li>



<li>&#8211;preprocessor 使用するプリプロセッサ（Sassとかlessのコマンドを渡します）</li>
</ul>



<p>例えば以下は「My Project」というタイトルで、「styles」フォルダのソースを元に「mydocs」へ出力をし、 プリプロセッサには「lessc」コマンドを使用する事になります。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">styledocco -n <span class="hljs-string">"My Project"</span> -o mydocs --preprocessor <span class="hljs-string">"lessc"</span> styles
</code></span></pre>


<p>cf) <a href="http://jacobrask.github.com/styledocco/index.html#usage">StyleDocco &#8211; Usage</a></p>



<h3 class="wp-block-heading">gruntで自動化など</h3>



<p>gruntでwatchして自動化したい場合は、<a href="https://github.com/indieisaconcept/grunt-styleguide">grunt-styleguide</a>等を利用します。 （諸事情により私は使いませんでした）</p>



<ul class="wp-block-list">
<li><a href="https://github.com/indieisaconcept/grunt-styleguide">indieisaconcept/grunt-styleguide · GitHub</a></li>
</ul>



<p>あるいは <a href="https://github.com/sindresorhus/grunt-shell">grunt-shell</a> でシェルコマンドを書いたり、 自分でタスクを書くなどして、うまいこと楽をすると良いでしょう。</p>



<h2 class="wp-block-heading">その他、細かい使用感など</h2>



<h3 class="wp-block-heading">ページのはじめに謎の空白のボックスが？</h3>



<p>ちょっとハマった箇所ですが、ページの一番はじめのセクションで謎の空白ボックスが生まれてしまいました。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/-R7TDcIMjxHs/UOlgq8NnCHI/AAAAAAAAB5s/8bVqDgymdjw/s500/20120106-01.png" alt="ページのはじめに謎の空白のボックスが"/></figure>



<p></p>



<p>概要文のコメントの先頭に改行を挟んでしまうとこうなります。</p>


<pre class="wp-block-code"><span><code class="hljs">/*

# これはダメ



/*
# こうしましょう
</code></span></pre>


<h3 class="wp-block-heading">プレビューHTML前の改行</h3>



<p>概要文とHTMLの間は基本的に1行空いていればいいのですが、 概要文がMarkdownのリスト等になっている様な場合は2行以上あけないとプレビューが正常に表示されません。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml">/*
# ボタン

* リスト
* リスト


    <span class="hljs-comment">&lt;!--こういったケースは2行あけましょう。--&gt;</span>
</code></span></pre>


<h3 class="wp-block-heading">プリコンパイラも併せて使うと重たい？</h3>



<p>私の携わったプロジェクトではSass+bootstrapで実装をしていた為、 Sassの重さとbootstrapのボリュームが相まってcss自体のジェネレートに少々時間を要しました。 それに加えて、StyleDoccoのドキュメント生成もある程度時間がかかるため、合わせ技で相当遅くなります。 gruntで自動化をしなかったのはその為です。</p>



<p>ただ、ファイル数やボリュームにも因る所が大きいので一概には言えません。 また、逆に最適化をする機会にも繋がるとも言えますね。</p>



<h3 class="wp-block-heading">ナビゲーションの生成について</h3>



<p>ドキュメントのヘッダナビゲーションには、 スタイルシートのファイル毎にメニューが生成されます。 また、フォルダでファイルを分けている場合は、プルダウンメニューになります。</p>



<p>例えばこのような構造にしてあった場合</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><pre class="wp-block-code"><span><code class="hljs">css/
  ├ common/
  │   ├ foo.css
  │   ├ bar.css
  │   └ baz.css
  ├ components/
  ├ widgets/
  └ README.md
</code></span></pre></blockquote>



<p>このような感じに出力されます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/--AxdiR0u-y0/UOlgq8-MQ6I/AAAAAAAAB5s/esRZQKbgp-s/s500/20120106-02.png" alt="ナビゲーションの生成"/></figure>



<p></p>



<p>ただし、Macでは問題なかったのですが、当方のWindows環境ではサブフォルダを全て無視されてしまいました。 Issueに投げてみたので、何か反応があったらお伝えします。</p>



<h3 class="wp-block-heading">ドキュメントページのパフォーマンス</h3>



<p>生成されたドキュメントページで動作がもたつくな、と感じたので中身をみてみました。</p>



<p>StyleDoccoのドキュメントページは、ページ毎にひとつのHTMLになっています。 CSSやJavaScriptなどの外部リソースはありません。完全にひとつのファイルです。</p>



<p>プレビューの出力はどうやっているのかというと</p>



<ol class="wp-block-list">
<li>iframeを動的に生成して、そこに自分自身を読み込む</li>



<li>読まれたHTMLでプレビューを生成し、描画する</li>
</ol>



<p>という処理をHTMLファイルに記述されたJavaScriptで行なっているようです。</p>



<p>JSで動的に生成している関係上、物とボリュームによっては描画や目次の生成などの動作がもたつく場合があります。 が、「単一ファイルでいきたい！！」というポリシーがひしひしと伝わってくるので、これはこういう物だと思って割り切りました。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>自前のテンプレートでスタイルガイドを書く手もありますが、 うまく用途にマッチするのであれば、こういうツールを使って楽をしていきたいですね。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>CSS3のbox-shadowでお絵かきアプリを書いてみたものの…</title>
		<link>https://blog.mach3.jp/2012/10/09/shadowcanvas.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 09 Oct 2012 02:00:00 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[box-shadow]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[Illustration]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Library]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2731</guid>

					<description><![CDATA[先日、CSS3のbox-shadowで描画されたモナリザが話題となりましたが、 インスパイアされて同じ手法でお絵かきアプリを作ったらどうなるか試してみました。 作ってみたもの まずはデモから。当たり前ですが、box-sh [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>先日、<a href="http://codepen.io/jaysalvat/pen/HaqBf">CSS3のbox-shadowで描画されたモナリザ</a>が話題となりましたが、 インスパイアされて同じ手法でお絵かきアプリを作ったらどうなるか試してみました。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-CYh_0uVRHXE/UHOEkHMC8zI/AAAAAAAABn4/yZ5IoXHh0C8/s400/20121009-00.png" alt="CSS3のbox-shadowでお絵かきアプリを書いてみたものの…"/></figure>



<p></p>



<span id="more-2731"></span>



<h2 class="wp-block-heading">作ってみたもの</h2>



<p>まずはデモから。当たり前ですが、box-shadowに対応していないブラウザでは動きません。</p>



<ul class="wp-block-list">
<li><a href="http://jsbin.com/osenaj/1/edit">DEMO on JS Bin</a></li>
</ul>



<p><style type="text/css">
  iframe.jsbin-embed {<br />
    height:700px !important;<br />
}<br />
</style>
</p>



<p><a class="jsbin-embed" href="http://jsbin.com/osenaj/1/embed?live">JS Bin</a><script src="http://static.jsbin.com/js/embed.js"></script></p>



<h2 class="wp-block-heading">感想</h2>



<p>作って動かしてみた率直な感想を申し上げると…そもそもこういう用途を想定していないと思うので、当然あまり捗りませんでした。 が、描かれる物の雰囲気は、これはこれで嫌いではないです。水墨画的な物が描けそう。</p>



<h3 class="wp-block-heading">重さが加速する</h3>



<p>Webkitはかなり軽快に動くのですが、Firefoxだとかなりもっさりした動きになります。IE9だとまだマシです。 そして、書けば書くほど重くなっていきます。 box-shadowを一点ずつどんどん重ねていっているわけですから、そりゃ当然重くなりますよね。</p>



<h3 class="wp-block-heading">線を引きにくい</h3>



<p>基本的にブラシで点描を繰り返している様な物なので、あまりはやく描こうとすると途切れて線になりません。 そういうブラシだと思うしかないでしょう。 間を補完するような感じに描画しようかとも思いましたが、むしろ味が損なわれる感じがしたので途中でやめました。</p>



<h2 class="wp-block-heading">ライブラリ</h2>



<p>書いてみたライブラリがこちら。別にやってる事はどうということはないです。 使い道は多分ないと思うのですが、使ってみたい方はお好きにお使いください。</p>



<h3 class="wp-block-heading"><a href="https://gist.github.com/3851837">ShadowCanvas : Drawing illustration with css box-shadow — Gist</a></h3>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">/**
 * ShadowCanvas
 *
 * Drawing illustration with css box-shadow
 *
 * <span class="hljs-doctag">@version </span>0.9
 * <span class="hljs-doctag">@author <span class="hljs-variable">mach3ss</span></span>
 * <span class="hljs-doctag">@require <span class="hljs-variable">jQuery</span></span>
 */</span>
<span class="hljs-keyword">var</span> ShadowCanvas = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">selector, option</span>)</span>{

    <span class="hljs-comment">// config</span>
    <span class="hljs-keyword">this</span>.option = $.extend({}, <span class="hljs-keyword">this</span>.option, option);
    <span class="hljs-keyword">this</span>.node = $.extend({}, <span class="hljs-keyword">this</span>.node);

    <span class="hljs-comment">// nodes</span>
    <span class="hljs-keyword">this</span>.node.container = $(selector);
    <span class="hljs-keyword">this</span>.node.canvas = $(<span class="hljs-string">"&lt;div&gt;"</span>)
    .css({<span class="hljs-attr">position</span>:<span class="hljs-string">"absolute"</span>})
    .appendTo(<span class="hljs-keyword">this</span>.node.container);

    <span class="hljs-comment">// events</span>
    <span class="hljs-keyword">this</span>.node.container
    .on(<span class="hljs-string">"mousemove"</span>, $.proxy(<span class="hljs-keyword">this</span>._onMouseMove, <span class="hljs-keyword">this</span>))
    .on(<span class="hljs-string">"mousedown"</span>, $.proxy(<span class="hljs-keyword">this</span>.start, <span class="hljs-keyword">this</span>))
    .on(<span class="hljs-string">"mouseleave mouseup"</span>, $.proxy(<span class="hljs-keyword">this</span>.stop, <span class="hljs-keyword">this</span>));
};
(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">fn</span>)</span>{

    fn.boxShadowText = <span class="hljs-string">"{x}px {y}px {blur}px {size}px {color}"</span>;
    fn.drawing = <span class="hljs-literal">false</span>;

    fn.node = {
        <span class="hljs-attr">container</span> : <span class="hljs-literal">null</span>,
        <span class="hljs-attr">canvas</span> : <span class="hljs-literal">null</span>
    };

    fn.option = {
        <span class="hljs-attr">color</span>: <span class="hljs-string">"black"</span>,
        <span class="hljs-attr">blur</span> : <span class="hljs-number">5</span>,
        <span class="hljs-attr">size</span> : <span class="hljs-number">5</span>
    };

    <span class="hljs-comment">/**
     * Configure option or get the option value
     *
     * @param String key
     * @param Mixed value (optional)
     * @return Mixed
     */</span>
    fn.config = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">key, value</span>)</span>{
        <span class="hljs-keyword">if</span>(<span class="hljs-keyword">this</span>.option.hasOwnProperty(key)){
            <span class="hljs-keyword">if</span>(<span class="hljs-keyword">typeof</span>(value) !== <span class="hljs-string">"undefined"</span>){
                <span class="hljs-keyword">this</span>.option&#91;key] = value;
                <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
            } <span class="hljs-keyword">else</span> {
                <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.option&#91;key];
            }
        }
    };

    <span class="hljs-comment">/**
     * Get css text for box-shadow
     *
     * @param Integer x
     * @param Integer y
     * @return String
     */</span>
    fn._getBoxShadowText = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">x, y</span>)</span>{
        <span class="hljs-keyword">var</span> o, callback;
        o = <span class="hljs-keyword">this</span>.option;
        o.x = x;
        o.y = y;
        callback = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">a, b</span>)</span>{
            <span class="hljs-keyword">return</span> o&#91;b];
        };
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.boxShadowText.replace((<span class="hljs-regexp">/\{(\w+)\}/g</span>), callback);
    };

    <span class="hljs-comment">/**
     * Draw the point with box-shadow
     *
     * @param Integer x
     * @param Integer y
     * @return self
     */</span>
    fn.draw = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">x, y</span>)</span>{
        <span class="hljs-keyword">var</span> shadow = <span class="hljs-keyword">this</span>.node.canvas.css(<span class="hljs-string">"boxShadow"</span>);
        shadow = shadow === <span class="hljs-string">"none"</span> ? <span class="hljs-string">""</span> : <span class="hljs-string">","</span> + shadow ;
        shadow = <span class="hljs-keyword">this</span>._getBoxShadowText(x, y) + shadow;
        <span class="hljs-keyword">this</span>.node.canvas.css(<span class="hljs-string">"boxShadow"</span>, shadow);
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
    };


    <span class="hljs-comment">/**
     * Start drawing
     *
     * @return self
     */</span>
    fn.start = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">this</span>.drawing = <span class="hljs-literal">true</span>;
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
    };

    <span class="hljs-comment">/**
     * Stop drawing
     *
     * @return self
     */</span>
    fn.stop = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">this</span>.drawing = <span class="hljs-literal">false</span>;
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
    };

    fn._onMouseMove = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
        <span class="hljs-keyword">var</span> offset, x, y;

        <span class="hljs-keyword">if</span>(! <span class="hljs-keyword">this</span>.drawing){
            <span class="hljs-keyword">return</span>;
        }

        offset = <span class="hljs-keyword">this</span>.node.container.offset();
        x = e.clientX - offset.left + <span class="hljs-built_in">document</span>.body.scrollLeft;
        y = e.clientY - offset.top + <span class="hljs-built_in">document</span>.body.scrollTop;
        <span class="hljs-keyword">if</span>(x &lt; <span class="hljs-keyword">this</span>.node.container.width() &amp;&amp; y &lt; <span class="hljs-keyword">this</span>.node.container.height()){
            <span class="hljs-keyword">this</span>.draw(x, y);
        }
    };

    <span class="hljs-comment">/**
     * Clear all on canvas
     *
     * @return self
     */</span>
    fn.clear = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">this</span>.node.canvas.css(<span class="hljs-string">"boxShadow"</span>, <span class="hljs-string">"none"</span>);
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
    };

    <span class="hljs-comment">/**
     * Get css text of the illustration on canvas now
     *
     * @return String
     */</span>
    fn.getCSS = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.node.canvas.css(<span class="hljs-string">"boxShadow"</span>);
    };

}(ShadowCanvas.prototype));
</code></span></pre>


<p>使い方は、キャンバスにしたいボックス要素のセレクターを引数にしてnewするだけです。 各設定はconfigで。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> myCanvas = <span class="hljs-keyword">new</span> ShadowCanvas(<span class="hljs-string">"#my-canvas"</span>);
myCanvas.config(<span class="hljs-string">"color"</span>, <span class="hljs-string">"black"</span>);
myCanvas.config(<span class="hljs-string">"size"</span>, <span class="hljs-number">8</span>);
myCanvas.config(<span class="hljs-string">"blur"</span>, <span class="hljs-number">10</span>);
</code></span></pre>


<h2 class="wp-block-heading">まとめ</h2>



<p>表現力は結構ありそうですが、実用的なアプリかと問われると…</p>



<p>cf) <a href="http://kachibito.net/web-design/pure-css-mona-lisa.html">CSS3のbox-shadowだけで作られたモナリザ・・・ &#8211; かちびと.net</a></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
