『CSSアニメーションが終わったら、JSでなにかしらの処理を走らせる』といった場合、CSSアニメーションのduration値とJSのsetTimeoutの値を合わせたりするわけですが、それって結局同じ値。
これに限らず、CSS/JS間で共通した値(アニメーション時間やプロパティ)を使うんだったら一元管理したいですよね。
そんなときは...そうだあれだ!
Gruntでやってしまいましょう!
Gruntのモジュール 「grunt-shared-config」 を使います。
CSSプリプロセッサー(SassとかSCSSとかLESSとかStylus)とJSで共通で使えるconfigファイルを生成してくれるモジュールです。
Gruntを使うので、Grunt.jsとNode.jsが必須です。
詳しくはこちら↓
※Mac環境で行っています(OSX: 10.8.5)
任意の場所に動作環境用のフォルダを作ります。
フォルダ構成はこんなかんじにしてみます。
test ├bin │├ css ││ └ style.css (style.scssからコンパイルするCSSファイル) │├ js ││ ├ config.js (config.jsonから生成されるJSファイル) ││ └ test.js (config.jsの値を使ってスクリプトを記述したJSファイル) │└ sample.html ├node_modules (インストールしたGruntファイルがいろいろと) ├src │└ sass │ ├ config.scss (config.jsonから生成されるSassファイル) │ └ style.scss (config.scssをインポートしつつ、他のスタイルも設定するSassファイル) ├config.json (一元管理するための設定ファイル) ├Gruntfile.js (Grunt用設定ファイル) └package.json (node環境のマニフェストファイル)
ターミナルを開いて、作っておいたトップディレクトリのフォルダ(ここでは"test")へ移動したら...
cd [フォルダまでのパス]
以下のコマンドを。
sudo npm init
聞かれるがまま、MacOSのパスワードを入力した後は、こちら↓
name: (test) test version: (0.0.0) 0.0.1 description: this project is only test that controls propaties of animation of sass and js from one source. entry point: (index.js) test command: git repository: keywords: sass js author: monster dive license: (BSD-2-Clause) MIT
こんなかんじでいろいろ聞かれるので、必要なところを入力&returnしていくと...
Is this ok? (yes)
イエス!ということで「yes」と入力。
フォルダに設定した内容の package.json ができているはずです。
次に、Gruntと例のGruntモジュール grunt-shared-config をインストールします。
sudo npm install grunt --save-dev
sudo npm install grunt-shared-config --save-dev
Gruntの設定ファイルも用意しましょう。
module.exports = function(grunt){ 'use strict'; var _pkg = grunt.file.readJSON('package.json'), _taskName; grunt.initConfig({ pkg: _pkg, shared_config: { default: { options: { name: 'Config',// Sass, JSで吐き出すファイル名 cssFormat: 'dash',// Sassのフォーマット jsFormat: 'uppercase',// JSのフォーマット amd: false }, src: 'config.json',// 一元管理するJSON dest: [ 'src/sass/config.scss',//吐き出すSCSSのパス 'bin/js/config.js'// 吐き出すJSのパス ] } } }); // package.jsonに記載されているパッケージを自動読み込み for(_taskName in _pkg.devDependencies) { if(_taskName.substring(0, 6) == 'grunt-') { grunt.loadNpmTasks(_taskName); } } grunt.registerTask('default', ['shared_config']); };
Written by Junichi.Honda
6行目から20行目の記述が、grunt-shared-config用です。
CSSとJSの出力フォーマットも設定できます。
JSON形式でconfigファイルを作ります。
{ "speed" : 3, "animation_class_name" : "data-execute" }
gruntコマンドを実行すると、以下のファイルが生成されます。
grunt
config.scss(Sass用の変数セット)
$speed: 3; $animation_class_name: "data-execute";
config.js(JS用の変数セット)
var Config = { "SPEED": 3, "ANIMATION_CLASS_NAME": "data-execute" };
Gruntfile.jsで設定したフォーマットに沿った変数セットが出力されています。
出力されたSass/JSの設定ファイルを使って、アニメーションを作ってみます。
config.js、test.js、style.cssを読み込みます。
また、jQueryを使っているので、jQueryのライブラリも必要です。
jQuery(document).ready(function(){ 'use strict'; // ------------------------------------------------------------------------- // function // ------------------------------------------------------------------------- var onClick, onAnimationCompleted; onClick = function(){ // Config.jsに設定したアニメーション用のクラスをaddClassする _obj.addClass(Config.ANIMATION_CLASS_NAME); setTimeout(onAnimationCompleted, _watingTime); return false; }; // CSS側のアニメーションが終ったはず onAnimationCompleted = function(){ alert('css3 animation completed!'); }; // ------------------------------------------------------------------------- // initialize // ------------------------------------------------------------------------- // CSSのアニメーションを待たせる時間 // config.jsに生成される値の単位はJSで使用する"ms"じゃないので1000をかけておく var _watingTime = Config.SPEED * 1000, _btn = jQuery(document.getElementById('data-btn').getElementsByTagName('a')[0]).on('click', onClick), _obj = jQuery(document.getElementById('data-object')); });
Written by Junichi.Honda
いろいろ書いていますが重要なのはこの辺↓
// config.scssをインポート @import "config"; // アニメーションのduration値に共通変数「$speed」を使用(単位をつけて) .data-execute { -webkit-animation: anim $speed + s linear forwards; -moz-animation: anim $speed + s linear forwards; animation: anim $speed + s linear forwards; .count { -webkit-animation: count $speed + s ease forwards; -moz-animation: count $speed + s ease forwards; animation: count $speed + s ease forwards; } }
ということでサンプルです。
ボタンをクリックしてから共通変数で設定した3s(秒)間、CSSアニメーションが動作した後、JSでアラートを表示させます。
動作環境)IE10以上、Chrome、Firefox、Safari
CSSアニメーションが終了したタイミングでJSのアラートが!
ちょうどいい具合!
もちろん、config.jsonでアニメーションの時間設定を調整してgruntコマンドを実行すれば、それぞれのファイルを開くことなく修正ができます。便利!
今回試した使い方の他にも、アニメーションはJSよりCSSで動かすほうが軽い!ということを活かして、CSSアニメーションが有効なブラウザ(IE10以上、モダンブラウザ)ではCSS、それ以外のブラウザ(IE9以下)ではJSでアニメーションさせる際にも設定を一元管理すれば、あっちを直してこっちは直して...ない!などというケアレスミスも防げるし、とても効率的です。
CSSで出来ることも増えていますが、動的な処理はもちろんJSにおまかせするわけで、今後益々、CSS(Sass)とJSの連携の機会は増えていきそうな気配ですね。
Grunt/JS監修・協力:Kentaro.Otsuka, Junichi.Honda