高度で複雑なWebアニメーションが自在に作れる!GreenSockプラグイン5つ

2017/10/05

Maria Antonietta Perna

155

Articles in this issue reproduced from SitePoint
Copyright © 2017, All rights reserved. SitePoint Pty Ltd. www.sitepoint.com. Translation copyright © 2017, KADOKAWA CorporationJapanese syndication rights arranged with SitePoint Pty Ltd, Collingwood, Victoria,Australia through Tuttle-Mori Agency, Inc., Tokyo

FlashライクなWebアニメーションを実現するJavaScriptライブラリー「GreenSock」。イラストからテキストまで、思い通りのアニメーションを作成できる便利なプラグインを紹介します。

GreenSockのプラグインをいくつか紹介します。

紹介するプラグイン

  • ベジェ曲線パスに沿ってプロパティをアニメーションする「BezierPlugin」
  • 画面上で要素をドラッグできるGSAPの「Draggable」ユーティリティと、要素を滑らかに動かしてスムーズに停止させる「ThrowPropsPlugin」
  • SVGストロークを動的に描画する「DrawSVGPlugin」
  • パスのポイント数が異なっていても任意のSVGパスを別のパスにモーフィングできる「MorphSVGPlugin」
  • おもしろいテキストアニメーションエフェクトを実現する「SplitText」ユーティリティ

このチュートリアルを最後まで読めば、短時間で複雑なWebアニメーションを作成できます。

シンプルなシーケンスアニメーションとstaggerアニメーションでのTweenMaxの使い方を含むGreenSockの基本については、さよならFlash!いまこそ学ぶWebアニメライブラリー「GreenSock」入門を参照してください。

GreenSockのパワフルなタイムライン(TimelineLiteとTimelineMax)は本格的なタイムラインアニメが作れる最強ライブラリーTimelineMaxの使い方を参照してください。

GreenSockのBezierPluginを使ったパスに沿ったアニメーション

パスに沿ったモーションは曲線パスやジグザグパスといった定義済みのパスにオブジェクトが沿って動くことで構成されます。適切に使えば、リアルなアニメーションが作れます。

アニメーションにはSMIL(同期マルチメディア統合言語)も使えますが非推奨です。

パスに沿ったモーションはCSSで実装できますが、ChromeやOperaなどにブラウザーサポートが限定されているため、リスクがあります。

一貫したブラウザーサポートが期待でき、しかも実装が簡単な、GSAPのBezierPluginはすばらしいオプションです。

BezierPluginはTweenMaxに無料で入っています。試してみてください。

GreenSockのBezierPluginの基本

GSAPのBezierPluginを使うには、TweenMaxをダウンロードし、外部JavaScriptファイルと同様HTMLドキュメントの末尾でプロジェクトにインクルードします。

基本構文は以下のとおりです。

TweenMax.to(document.getElementById('myDiv'), 5, {
  bezier:[
    {left:100, top:250}, 
    {left:300, top:0}, 
    {left:500, top:400}
  ], 
  ease:Power1.easeInOut
});

.myDiv要素にTweenMaxのto()メソッドを実装しています。プロパティのうち、bezierプロパティには値としてオブジェクトの配列を設定しています。各オブジェクトには値として座標のペアを格納しています。上の例ではtopプロパティとleftプロパティが使われていますが、xyでも指定できます。

座標のリストが長くなるときは1つの変数にまとめて格納し、関数の中でオブジェクトではなく変数を使います。

const points = [
  {left:100, top:250}, 
  {left:300, top:0}, 
  {left:500, top:400}
];

TweenMax.to(document.getElementById('myDiv'), 5, {
  bezier: points, 
  ease:Power1.easeInOut
});

座標の設定にxyを使う場合、値はキャンバスではなく要素の位置を参照します。たとえばx: 10と設定すると、要素は10から現在位置に対して右方向に動きます。後続のポイントも、先に指定されたポイントではなく要素の最初の位置を基準にします。

ある座標のセットから次の座標のセットにスムーズに要素を動かすために、BezierPluginでは2つのオプションが提供されています。

  • typeプロパティを'soft'に設定。設定した座標がマグネットの役割をして要素を引きつけるが、要素は特定のポイントを経由して動くわけではない
  • typeプロパティをデフォルト値の'thru'に設定するとcurvinessプロパティに値を指定できる。線の張り具合を定義できる。Bezier: 0で直線、1で通常の曲線、2で通常の2倍の値。curvinessプロパティはtypeプロパティを'thru'に設定した場合のみ適用可能

autoRotateプロパティをtrueに設定すると、ベジェパス上の要素の位置に沿ってスピンエフェクトを要素に実装できます。

これらのプロパティの動作を示すデモです。curvinessの値を選択し、チェックボックスでチェックをオンオフしてautoRotateプロパティを設定してください。ラジオボタンで'thru''soft'を選択します。

ちなみにtypeプロパティのデフォルト値は'thru'です。'soft'を選択するとcurvinessの値を設定するドロップダウンボックスが無効になります。

SVG画像のデザイン:Vecteezy Editor

GSAPのBezierPluginの使い方は、以下のリンクを参照してください。

GreenSockの有料(プレミアム)プラグインとユーティリティ

TweenMaxの機能すべてを使って多くのことを達成できますが、1歩進んだGreenSockの有料プラグインとユーティリティはとても魅力的です。

ローカル開発環境や運営しているWebサイト向けに有料の機能をダウンロードするため、Club GreenSockの「Shockingly Green」会員に登録します。

CodePenデモを見てください。GSAPアニメーションをCodePenで動かすだけなら、GSAPの有料プラグインを無料で試せます。

CopyボタンをクリックしてプラグインのURLをコピーし、自分のPenに追加すると使えます。

CollectionボタンをクリックしてGreenSockのデモの中から興味のあるプラグインを使ったものをフォークし、ベースとして使うこともできます。

GSAP Premium Plugins CodePen Page.

GreenSockのDraggableとThrowPropsを使ったドラッグ&ドロップ

ユーティリティライブラリーのDraggableは、ドラッグ&ドロップアニメーションをあっという間にコーディングできます。クロスブラウザーとタッチスクリーン用デバイスに対応して、HTMLとSVG要素にも適用可能なコードを作成できます。

DraggableをThrowPropsPluginと併用すれば、画面上で滑らかな物理曲線のような動きを演出できます。

シンプルな実装例です。

Draggable.create('#yourID');

id「yourID」をもつ要素を縦横にドラッグできます。

要素(の動き)を所定の範囲内に限定するにはboundsプロパティを使います。抜群の滑らかな動きを実装するためにThrowPropsPluginをダウンロードして追加します。throwPropstrueに設定するだけで使えます。

Draggable.create('#yourID', {
  bounds: '.container',
  throwProps: true
});

draggable要素は.containerクラスの要素の境界外にドラッグできなくなります。

ドラッグ時の動きを縦方向か横方向に固定します。

Draggable.create('#yourID', {
  bounds: '.container',
  throwProps: true,
  type: 'y' //only vertical scroll
});

これで要素は縦軸方向にのみドラッグ可能になります。横軸方向に変更する場合、typeプロパティの値'y''x'に置きかえます。

typeプロパティの値は'rotation'にも設定できます。要素を縦横方向にドラッグする代わりに、円を描くように回転します。

アニメーションを使ったCodePenのデモです。

SVG画像のデザイン:Vecteezy Editor

このデモには3つの特徴があります。

  • DraggableはonDragStart()onDragEnd()などの便利なコールバック関数を搭載している。ドラッグモーションのステージ関連の作業に使える
  • GreenSockではCSS変数やカスタムプロパティも操作できる。ライブラリーの最新リリースで追加された機能
  • GreenSockのsvgOrigin(TweenMaxのパッケージ)はCSSPluginに含まれる特別なプロパティsvgOriginを使うと、transformOriginを要素に対して相対的ではなく、SVGのグローバル座標空間内に設定できる。Illustratorの使用も役立つといわれているが、私は試行錯誤の末、この方法が良いと考えるようになった

DraggableとThrowPropsPluginは、以下の資料を参考にしてください。

GreenSockのDrawSVGPluginでSVGストロークアニメーションをライブドローイング

GreenSockのDrawSVGPluginを使えば、画面上でライブドローイング風のSVG画像を手軽に作成できます。

アニメーションをCSSで作成するのは難しくありませんが、GSAPを使うメリットもあります。

  • SVGストロークの長さの計算に必要なgetTotalLenght()メソッドを使わずに長方形、円といったシンプルなSVGシェイプを扱える
  • SVGをスケーリングして異なるサイズの画面でレスポンシブに動かす場合、getTotalLength()メソッドでは対応できない。DrawSVGを使えば心配無用
  • DrawSVGではinteger(整数型)、ブール型(trueかfalseで設定)、パーセントを使ってストロークアニメーションを実装できる

DrawSVGを始めます。

TweenLite.fromTo("#path", 1, {
  drawSVG:"0 5%"
}, {
  drawSVG:"95% 100%"
});

アニメーションを動かすにはSVGにストロークを定義します。SVG自体のプレゼンテーション属性ですが、CSSでも定義できます。

// Define a stroke and stroke-width in CSS:
#path {
  stroke-width: 5px;
  stroke: blue;
}

GSAPのstaggerメソッドで複数のSVGストロークにstaggerを実装できます。DrawSVGPluginは、GSAP APIとシームレスに統合されます。

/* All elements with the class of .element 
   will have a stroke animation with a 0.1 
   delay between each of them during 1 second */
   
TweenMax.staggerFrom(".element", 1, {
  drawSVG: 0
}, 0.1);

DrawSVGPluginを使ったライブデモです。

詳しくは以下の資料を参考にしてください。

GreenSockのMorphSVGPluginを使ったシェイプシフトアニメーション

GSAPのMorphSVGPluginを使うと、1行のコードでSVGシェイプを別のシェイプにモーフィングできます。モーフィングする2つのシェイプのパスのポイント数が一致していなくても大丈夫です。簡単にかっこいいエフェクトを実現できます。

MorphSVGPluginはシンプルなコードで使えます。

TweenLite.to("#circle", 1, {
  morphSVG:"#square"
});

SVGの#circle要素は1秒かけて#square要素にモーフィングします。

GSAPのメソッドに完全に統合されているため、これまで取り上げなかったことは上のスニペットに含まれません。

#squareを使わずに関数にパスデータを渡す方法もあります。

デモで動作を確認してください。

背景写真:Luca Zanon。出典:Unsplash.com

SVGでパスではなくシンプルなシェイプを使うなら、MorphSVGでも実現できます。MorphSVGPlugin.convertToPath()関数を使うだけで、「GSAPではシェイプをパスに変換してモーフィングできます」。

別のデモです。

SVG画像のデザイン:Vecteezy Editor

GSAPのMorphSVGPluginは以下の資料を参考にしてください。

GreenSockのSplitTextユーティリティを使ったおもしろいテキスト効果

アニメーションを適切に使うと、Web上のテキストをより魅力的にできます。GSAPはテキストを扱うプラグインを数多く提供していますが、私のお気に入りはSplitTextです。

数行のコードでテキストをセンテンス、単語、文字単位に分割でき、思いのままにアニメーションできます。

基本的な例です。

const el = document.getElementById('elID');
const split = new SplitText(el, {
  type: 'lines, words, chars'
});

elにはテキストを格納し、splitにはテキストの操作に使うsplitTextインスタンスを格納します。

たとえば行に分割されたテキストの配列をsplit.linesに格納すると、GreenSockのAPIで簡単にアニメーションできます。

バックヤードで、GSAPは追加の<div>要素を各行、単語、センテンスに作成します。コードはコンテナをターゲットにして、個別にアニメーションできます。

GreenSockには、アニメーション終了後に不要になったマークアップを削除できる便利な関数revert()があります。この関数はコールバック関数onComplete()の内部で呼び出せます。

onComplete: function() {
  split.revert();
}

以下のライブデモでSplitTextの動作を確認してください。

背景写真はUnsplash.comの厚意による

詳しくは以下の資料を参考にしてください。

最後に

GSAPをプロジェクトにインクルードし、Webサイトにアニメーションのトリックを追加できるようになったことでしょう。

豊富なAPIとプラグインを搭載したGreenSockは莫大な可能性を秘めているので、熟達を目指してドキュメントページを参考にし、実践を続けてください。困難に直面したら、ためらわずにGreenSockのフォーラムに参加してください。フレンドリーで役立つフォーラムで、参加しているGSAPのエキスパートが助けになってくれるでしょう。

JavaScriptアニメーションライブラリーの探索もここまでにします。今度はみなさんの番です。オリジナルのアニメーションを作成し、Webをさらに魅力的な空間にしてください。

「Beyond CSS: Dynamic DOM Animation Libraries(動的DOMアニメーションライブラリー)」シリーズ

(原文:Fancy Web Animations Made Easy with GreenSock Plugins

[翻訳:新岡祐佳子/編集:Livit

Copyright © 2017, Maria Antonietta Perna All Rights Reserved.

Maria Antonietta Perna

Maria Antonietta Perna

SitePointのHTML/CSSチャンネルの共同編集者・フロントエンドWeb開発者です。CSSでいろんな手法を試すことを楽しんでいます。また、フロントエンドのプログラミング指導方法にも興味を持っています。コーディングやWeb関連の執筆をしていないときは、哲学書や散歩、おいしいものを楽しんでいます。

Loading...