Asial Blog

Recruit! Asialで一緒に働きませんか?

javascriptライブラリ「MooTools」を使ってみました。

カテゴリ :
フロントエンド(HTML5)
タグ :
Ajax
JavaScript
ライブラリ紹介
Tech
はじめまして。
8月にアシアルに入社した橋本です。

今回はjavascripライブラリの一つである「MooTools」を使ってみました。
MooToolsは、軽量かつ高機能を謳っているライブラリで、オブジェクト指向に基づいて設計されています。知名度的にはいま一つかもしれませんが、優秀なjavascriptライブラリのようです。

現在、以下のサイトでMooToolsを30日でマスターするチュートリアルが連載されています。
30 Days of Mootools 1.2 Tutorials
今回はそのチュートリアルを参考に、MooToolsを使って遊んでみました。
チュートリアルは残念ながら(?)英語で書かれているのですが、JavaScript初心者でも理解できるように書かれているため、内容自体は大変わかりやすいものとなっています。

では、以下サンプルファイルです。
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  5. <title>SmoothScroll Using MooTools 1.2 Example</title> 
  6. <script type="text/javascript" src="js/mootools-1.2-core.js"></script>
  7. <script type="text/javascript" src="js/mootools-1.2-more.js"></script>
  8. <script type="text/javascript" src="js/mooSamples.js"></script>
  9. <style type="text/css">
  10.   #tween_element{
  11.   height: 50px;
  12.   width: 10px;
  13.   background-color: #3399CC;
  14.   }
  15.   #morph_element2{
  16.   width: 0px;
  17.   height: 0px;
  18.   background-color: #ffffff;
  19.   }
  20. </style>
  21. </head> 
  22. <body>
  23. <h3 class="title">Fx.Tweenの使用例</h3>
  24. <div class="contents">
  25.   <div class="contetns_wrap">
  26.   <div id="tween_element"></div><br />
  27.   <button id="tween_reset">リセット</button>
  28.   <button id="tween_long">伸びる</button>
  29.   <button id="tween_short">縮む</button>
  30.   <button id="tween_fade_out">フェードアウト</button>
  31.   <button id="tween_fade_in">フェードイン</button>
  32.   </div>
  33. </div>
  34. <h3 class="title">Fx.Morphの使用例</h3>
  35. <div class="contents">
  36.   <div class="contetns_wrap">
  37.     <div id="morph_element"></div>
  38.     <button id="morph_set">セット</button>
  39.     <button id="morph_big">大きく</button>
  40.     <button id="morph_small">小さく</button>
  41.     <button id="morph_reset">リセット</button>
  42.   </div>
  43. </div>
  44. <h3 class="title">組み合わせ例</h3>
  45. <div class="contents">
  46.  
  47.   <div class="contetns_wrap">  
  48.     <div id="morph_element2">
  49.         <div id="text" style="color: #ffffff">
  50.       optionで「link」を指定することで、<br />
  51.       このようなアニメーション効果を生み出すことも出来ます。<br />
  52.     </div>
  53.     </div>
  54.       <button id="start">スタート</button>
  55.       <button id="reset">リセット</button>
  56.   </div>
  57. </div>
  58. </body> 
  59. </html>

javascriptファイル
  1. //tween効果使用例
  2. var tweenerLong  = function() {
  3.   $('tween_element').tween('width', '200px');
  4. }
  5.  
  6. var tweenerShort  = function() {
  7.   $('tween_element').tween('width', '50px');
  8. }
  9.  
  10. var tweenerReset  = function() {
  11.   $('tween_element').tween('width', '10px');
  12. }
  13.  
  14. var tweenFadeOut = function() {
  15.   $('tween_element').fade('out');
  16. }
  17.  
  18. var tweenFadeIn = function() {
  19.   $('tween_element').fade('in');
  20. }
  21.  
  22. //Morph効果使用例
  23. var morphSet = function(){
  24.   this.set({
  25.     'width': 0,
  26.     'height': 0,
  27.     'background-color': '#ffffff'
  28.   }).start({
  29.     'width': 20,
  30.     'height': 20,
  31.     'background-color': '#000000'
  32.   });
  33. }
  34.  
  35. var morphBig = function(){
  36.   this.start({
  37.     'width': 50,
  38.     'height': 50,
  39.     'background-color': '#d3715c'
  40.   });
  41. }
  42.  
  43. var morphSmall = function(){
  44.   this.start({
  45.     'width': 30,
  46.     'height': 30,
  47.     'background-color': '#006544'
  48.   });
  49. }
  50.  
  51. var morphReset = function(){
  52.   this.set({
  53.     'width': 0,
  54.     'height': 0,
  55.     'background-color': '#ffffff'
  56.   });
  57. }
  58.  
  59. var morphReset = function(){
  60.   this.set({
  61.     'width': 0,
  62.     'height': 0,
  63.     'background-color': '#ffffff'
  64.   });
  65. }
  66.  
  67. //組み合わせ例
  68. var morphChange = function(){
  69.   this.set({
  70.     'width': 0,
  71.     'height': 0,
  72.     'background-color': '#ffffff'
  73.   }).start({
  74.     'width': 10,
  75.     'height': 10,
  76.     'background-color': '#dddddd'
  77.   }).start({
  78.     'width': 300,
  79.     'height': 10,
  80.     'background-color': '#888888'
  81.   }).start({
  82.     'width': 400,
  83.     'height': 120,
  84.     'background-color': '#333333'
  85.   });
  86. }
  87.  
  88. var morphReset2 = function(){
  89.   this.set({
  90.     'width': 0,
  91.     'height': 0,
  92.     'background-color': '#ffffff' 
  93.   });  
  94. }
  95.  
  96. window.addEvent('domready', function() {
  97.   //変数の定義
  98.  
  99.   //Fx.Morph
  100.   var morphElement = $('morph_element');
  101.   
  102.   //組み合わせ例
  103.   var morphElement2 = $('morph_element2');
  104.   
  105.   //Accordion
  106.   var title = $$('.title');
  107.   var contents = $$('.contents');
  108.     var accordObj = new Accordion(title,contents, {
  109.       fixedHeight: 150,
  110.         onComplete: function(){
  111.       $$('.contetns_wrap').fade('in');
  112.     }
  113.     });
  114.  
  115.   //Morph
  116.     var morphObject = new Fx.Morph(morphElement, {
  117.       link: 'chain',
  118.       transition: 'back:out',
  119.   });
  120.   
  121.   var morphObject2 = new Fx.Morph(morphElement2, {
  122.       link: 'chain',
  123.       transition: 'back:out',
  124.     onComplete: function(){
  125.         $('text').fade('in');
  126.     }
  127.   });
  128.   //Tween使用例
  129.   $('tween_reset').addEvent('click', tweenerReset);
  130.   $('tween_long').addEvent('click', tweenerLong);
  131.   $('tween_short').addEvent('click', tweenerShort);
  132.   $('tween_fade_out').addEvent('click', tweenFadeOut);
  133.   $('tween_fade_in').addEvent('click', tweenFadeIn);
  134.     
  135.   //Morph使用例
  136.   $('morph_set').addEvent('click', morphSet.bind(morphObject));  
  137.   $('morph_big').addEvent('click', morphBig.bind(morphObject));
  138.   $('morph_small').addEvent('click', morphSmall.bind(morphObject));
  139.   $('morph_reset').addEvent('click', morphReset.bind(morphObject));
  140.   
  141.   //組み合わせ例
  142.   $('start').addEvent('click', morphChange.bind(morphObject2));
  143.   $('reset').addEvent('click', morphReset2.bind(morphObject2));
  144. });

HTMLファイルの中身ですが、各タイトルをクリックすると隠された内容が表示されるようになっています。
これはMooToolssの拡張モジュールの一つであるアコーディオンモジュールを使用したものです。
アコーディオンモジュールはMooToolsの公式サイトから「MooTools 1.2 More Builder」をダウンロードすることで使用することができます。
使用方法は簡単で、タイトルとして表示したい要素と、クリックした際に表示したい内容を引数として、
Accordionクラスのオブジェクトを作成するだけです。
  1. window.addEvent('domready', function() {
  2. //Accordion
  3.     //引数として表示したい要素を渡す
  4.   var title = $$('.title');
  5.   var contents = $$('.contents');
  6.   
  7.   //Accordionクラスのオブジェクトを作成
  8.     var accordObj = new Accordion(title,contents);
  9. });

1つめのサンプルでは、Tween効果の使用例を表示しています。
  1. //tween効果使用例
  2. var tweenerLong  = function() {
  3.   $('tween_element').tween('width', '200px');
  4. }
  5.  
  6. var tweenerShort  = function() {
  7.   $('tween_element').tween('width', '50px');
  8. }
  9.  
  10. var tweenerReset  = function() {
  11.   $('tween_element').tween('width', '10px');
  12. }
  13.  
  14. var tweenFadeOut = function() {
  15.   $('tween_element').fade('out');
  16. }
  17.  
  18. var tweenFadeIn = function() {
  19.   $('tween_element').fade('in');
  20. }
  21.  
  22. window.addEvent('domready', function() {
  23.     //ボタンを押すと実行
  24.   $('tween_reset').addEvent('click', tweenerReset);
  25.   $('tween_long').addEvent('click', tweenerLong);
  26.   $('tween_short').addEvent('click', tweenerShort);
  27.   $('tween_fade_out').addEvent('click', tweenFadeOut);
  28.   $('tween_fade_in').addEvent('click', tweenFadeIn);
  29. });
今回は標準要素に対して、あらかじめ用意されたメソッド(tween,fade)を利用していますが、
取得した要素からFx.Tweenクラスのオブジェクトを作成して、Tween効果を独自に設定することも可能です。


2つ目のサンプルでは、Fx.Morphクラスのオブジェクトを作成し、取得した要素を拡大、縮小したり、
色を変えたりしています。
  1. //Fx.Morph使用例
  2. var morphSet = function(){
  3.   this.set({
  4.     'width': 0,
  5.     'height': 0,
  6.     'background-color': '#ffffff'
  7.   }).start({
  8.     'width': 20,
  9.     'height': 20,
  10.     'background-color': '#000000'
  11.   });
  12. }
  13.  
  14. var morphBig = function(){
  15.   this.start({
  16.     'width': 50,
  17.     'height': 50,
  18.     'background-color': '#d3715c'
  19.   });
  20. }
  21.  
  22. var morphSmall = function(){
  23.   this.start({
  24.     'width': 30,
  25.     'height': 30,
  26.     'background-color': '#006544'
  27.   });
  28. }
  29.  
  30. var morphReset = function(){
  31.   this.set({
  32.     'width': 0,
  33.     'height': 0,
  34.     'background-color': '#ffffff'
  35.   });
  36. }
  37.  
  38. window.addEvent('domready', function() {
  39.   //Fx.Morphクラスのオブジェクトを作成
  40.   var morphElement = $('morph_element');
  41.     var morphObject = new Fx.Morph(morphElement, {
  42.       link: 'chain',
  43.       transition: 'back:out',
  44.   });
  45.   //ボタンを押すと実行
  46.   $('morph_set').addEvent('click', morphSet.bind(morphObject));  
  47.   $('morph_big').addEvent('click', morphBig.bind(morphObject));
  48.   $('morph_small').addEvent('click', morphSmall.bind(morphObject));
  49.   $('morph_reset').addEvent('click', morphReset.bind(morphObject));
  50. });
オブジェクトを作成する際にオプションを指定することで、アニメーションの動きに変化をつけることもできます。
詳しくは先ほど紹介したチュートリアルの11日目の記事の中程あたりを参照してください。
30 Days of Mootools 1.2 Tutorials - Day 11 - Using Fx.Morph, Fx Options and Fx Events

3つ目のサンプルでは。二つ目のサンプルで使用したFx.Morphモジュールの表示効果を組み合わせたアニメーション効果を表示しています。
  1. //組み合わせ例
  2. var morphChange = function(){
  3.   this.set({
  4.     'width': 0,
  5.     'height': 0,
  6.     'background-color': '#ffffff'
  7.   }).start({
  8.     'width': 10,
  9.     'height': 10,
  10.     'background-color': '#dddddd'
  11.   }).start({
  12.     'width': 300,
  13.     'height': 10,
  14.     'background-color': '#888888'
  15.   }).start({
  16.     'width': 400,
  17.     'height': 120,
  18.     'background-color': '#333333'
  19.   });
  20. }
  21.  
  22. var morphReset2 = function(){
  23.   this.set({
  24.     'width': 0,
  25.     'height': 0,
  26.     'background-color': '#ffffff' 
  27.   });  
  28. }
  29.  
  30. window.addEvent('domready', function() {
  31.   var morphObject2 = new Fx.Morph(morphElement2, {
  32.       link: 'chain',
  33.       transition: 'back:out',
  34.     onComplete: function(){
  35.         $('text').fade('in');
  36.     }
  37.   });
  38.   //ボタンを押すと実行
  39.   $('start').addEvent('click', morphChange.bind(morphObject2));
  40.   $('reset').addEvent('click', morphReset2.bind(morphObject2));
  41. });
2つ目の例でも使用していたのですが、オブジェクトを生成する際のオプションとして、
「link: 'chain'」を指定することで、連続した動作を表現することが出来ます。

今回はいくつかの簡単な例を紹介しましたが、そのほかにも様々なモジュールがあります。
公式ページにもサンプルがいくつか載っているので参考にしてみてください。
MooTools - a compact javascript framework

また、冒頭に紹介したチュートリアルは現在21日目まで進んでおり、今月末までには30日目まで公開されるようです。こちらも参考にしてみてください。
30 Days of Mootools 1.2 Tutorials

今回は短い時間触っただけですが、javascript初心者かつAjax初心者の僕でもこんなに簡単にアニメーション効果を実現出来てしまいました。
素晴らしいですね。
そんなMooTools、皆さんも試してみてはいかがでしょうか。