奇術の日なので、ScrollMagicとかJavaScriptのスクロール連動ライブラリについて調べてみました

##はじめに

**12月3日**は、ワン・ツー・スリーということで、**奇術の日**らしいですよ！
今回は、奇術にちなんでスクロール連動型コンテンツを作成するときに便利なJavaScript（以下、js）ライブラリ「ScrollMagic」や、その他の類似ライブラリについて調べてみました。

この時期はクリスマス向けのコンテンツや年賀コンテンツなどで、コンテンツのスクロール量に応じて演出が展開するような特別なページを作成する機会が多いと思いますが、そんな時に実装を少し楽しく（楽に！）してくれるライブラリを利用してみるのはいかがでしょうか。

##スクロール連動型コンテンツ向けJavaScriptライブラリ7選

スクロール連動型コンテンツを作成する際に便利な、jQueryなどの他のライブラリに依存しない、非依存型のjsライブラリを7つピックアップしてみました。掲載順はGithubスター数（※2018年12月現在）で、「サポート」は部分的に動作可能な環境も含まれた内容です。サイズはgithubに公開されているソースコードで、圧縮（minify）された配布ファイルのサイズを参照しています。

| 名称 |サイズ<br>（約KB）| スター数<br>（約）| サポート | ライセンス | 概要 |
|:-------------|:-------:|:------:|:------:|:---------:|:----|
| [ScrollReveal](#scrollreveal)|16.2|16600|IE10+|GPL<br>商用|演出用css必要無し<br>商用あり<br>アップデート多め |
| [ScrollMagic](#scrollmagic)|17|10400|IE9+|MIT<br>GPL|高機能<br>アップデート多め|
| [Waypoints](#waypoints) |8.8|9500|IE9+|MIT|軽量<br>老舗の安定感<br>アップデート停滞気味|
| [WOW.js](#wowjs)|8.2|8600|IE9+|GPL<br>商用|[animate.css](https://daneden.github.io/animate.css/)が必要<br>IE10以上推奨<br>アップデート停滞気味|
| [AOS](#aos)|14.3|7900|IE10+?|MIT|オリジナルcss<br>現在[ベータ版v3](https://github.com/michalsnik/aos)が進行中<br>[安定版v2](https://github.com/michalsnik/aos/tree/v2)
| [in-view.js](#in-viewjs)|5.2|4300|IE9+|MIT|アップデート停滞気味|
| [ScrollOut](#scrollout)|2.4|440|IE11+|MIT|モダンブラウザ向け<br>アップデート多め<br>類似に[sal.js](https://mciastek.github.io/sal/)や[delighters](https://q42.github.io/delighters/)|

- [MITライセンス | Wikipedia](https://ja.wikipedia.org/wiki/MIT_License)
- [GPL（GNU GPL v3）ライセンス | Wikipedia](https://ja.wikipedia.org/wiki/GNU_General_Public_License)

ここで言う「スクロール連動」とは、閲覧者のページ上のでのスクロール（量）を検知し、特定の量やビューポート（ブラウザの表示領域）内に特定の要素が検知されたときに、特定のイベントや演出が展開されるコンテンツ。としています。


###[ScrollReveal](https://scrollrevealjs.org/) 
![ScrollReveal.png](https://qiita-image-store.s3.amazonaws.com/0/163449/8aa21717-3994-6c07-eed1-0909e93966ac.png)
[ScrollReveal](https://scrollrevealjs.org/) は、他の類似ライブラリに比べてスター数も多く、頻繁にアップデートも行われているようで、2018年12月現在のバージョンは4.0.5。非商用は[GNU GPL v3](https://ja.wikipedia.org/wiki/GNU_General_Public_License)。商用ライセンスも用意されています。

アニメーションなど演出処理もjsに含まれた演出一体型ライブラリで、別途cssを読み込む必要はないので、手軽に使用できるのがメリット。他のライブラリと同様に、スクロール・要素検知イベントが用意されているので、イベント発火時に要素にセレクタを付与して、演出系スタイルやjsと連携することもできます。

<p data-height="265" data-theme-id="0" data-slug-hash="EOzMBp" data-default-tab="js,result" data-user="untspringk" data-pen-title="Xmas Carol Lyrics with ScrollReveal" class="codepen">See the Pen <a href="https://codepen.io/untspringk/pen/EOzMBp/">Xmas Carol Lyrics with ScrollReveal</a> by Takayasu.B (<a href="https://codepen.io/untspringk">@untspringk</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

**[個人的な感想]**
少量のコードでスクロール連動コンテンツを実装できるところは長所だと思います。ただ使いやすさを優先しているせいか、カスタマイズ性が低めなのと、モーションのバリエーションが少ないので、これらの点が改善されると良いなと思いました。

###[ScrollMagic](http://scrollmagic.io/) 
![ScrollMagic ♥ Demo.png](https://qiita-image-store.s3.amazonaws.com/0/163449/171c7e44-64fd-5fa6-8163-7386ed5c0bc4.png)
[ScrollMagic](http://scrollmagic.io/) も人気のライブラリで、頻繁にアップデートも行われています。2018年12月現在のバージョンは2.0.3。ライセンスは、MITとGPLの[デュアルライセンス](https://github.com/janpaepke/ScrollMagic/blob/master/LICENSE.md)です。

アニメーションなどの演出処理はライブラリに含まれていないので、GSAP（TweenMaxなど）、Velocity.jsなどの演出系jsライブラリや、[animate.css](https://daneden.github.io/animate.css/)などの演出系cssライブラリと連携して実行します。

<p data-height="265" data-theme-id="0" data-slug-hash="pQmXMr" data-default-tab="js,result" data-user="untspringk" data-pen-title="Xmas Carol Lyrics with ScrollMagic" class="codepen">See the Pen <a href="https://codepen.io/untspringk/pen/pQmXMr/">Xmas Carol Lyrics with ScrollMagic</a> by Takayasu.B (<a href="https://codepen.io/untspringk">@untspringk</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

**[個人的な感想]**
少しサイズが大きいですが、多機能で他のライブラリとの連携も取りやすいのが良いです。少し凝った演出やインタラクションが必要な場合にはおすすめのライブラリだと思います。

###[Waypoints](http://imakewebthings.com/waypoints/)
![Waypoints.png](https://qiita-image-store.s3.amazonaws.com/0/163449/c30783c7-8968-b48d-a5d9-0372fb42fd56.png)
[Waypoints](http://imakewebthings.com/waypoints/)は、スクロール連動系統では古株の人気ライブラリですが、2年ほど前から目立ったアップデートは行われていません。2018年12月現在のバージョンは4.0.1。ライセンスは、MITです。

軽量で手軽、そしてjQuery版も用意されていることから、今でも多くの現場で利用される人気のライブラリだと思います。演出分離型です。

<p data-height="265" data-theme-id="0" data-slug-hash="vQoyBG" data-default-tab="js,result" data-user="untspringk" data-pen-title="Xmas Carol Lyrics with Waypoints" class="codepen">See the Pen <a href="https://codepen.io/untspringk/pen/vQoyBG/">Xmas Carol Lyrics with Waypoints</a> by Takayasu.B (<a href="https://codepen.io/untspringk">@untspringk</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

**[個人的な感想]**
とにかく要素の検出をしたい時は、とりあえずWaypointsを使っておけば良いという安定感があります。今後はモダンブラウザ向けなどの他のライブラリが使用されることが多くなると思いますが、うまく動作しなかった時などの安定の一手として、使い方を覚えておくのも良いと思います。

###[WOW.js](https://mynameismatthieu.com/WOW/)
![Reveal Animations When Scrolling — WOW js.png](https://qiita-image-store.s3.amazonaws.com/0/163449/3316737b-8a27-d9fe-1877-8bf1e53f1803.png)
[WOW.js](https://mynameismatthieu.com/WOW/)も、Waypointsと同様に老舗なライブラリですが、最近は目立ったアップデートが行われていません。2018年12月現在のバージョンは1.1.3。ライセンスは非商用はGPL、商用版も用意されています。

軽量なライブラリで、アニメーションなどの演出はanimate.cssを基本としていますが、他のライブラリと同様に対象要素にセレクタを付与するシンプルな仕組みで作られているので、animate.css以外の演出系スタイルシートに差し替えることも可能です。[HTML5要素のカスタム属性でWOWの一部の制御系設定を指定できる](http://mynameismatthieu.com/WOW/docs.html)ので、jsに慣れていない人でも手軽に利用できるでしょう。

<p data-height="265" data-theme-id="0" data-slug-hash="zyOYXz" data-default-tab="js,result" data-user="untspringk" data-pen-title="Xmas Carol Lyrics with WOW.js" class="codepen">See the Pen <a href="https://codepen.io/untspringk/pen/zyOYXz/">Xmas Carol Lyrics with WOW.js</a> by Takayasu.B (<a href="https://codepen.io/untspringk">@untspringk</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

**[個人的な感想]**
要素が画面内に入って演出が起動するときは、class属性に「animated（※デフォルト）」セレクタが付与されるだけというシンプルな規約なので、animate.css以外にも様々な演出スタイルと連携できるのが良いですね。上のデモの最初の5つのセクションは、自前のフェードインアニメーションで実行しています。後半はanimate.cssのアニメーションです。バリエーション豊かですね。

ScrollReveal同様に非常に少量のjsコードの記述で良く、jsに慣れていない人でも利用できるように配慮されていると思います。反面、jsで色々とカスタマイズしたい場合は少し物足りないかもしれません。

###[AOS](https://michalsnik.github.io/aos/)
![AOS   Animate on scroll library.png](https://qiita-image-store.s3.amazonaws.com/0/163449/5e4bee6e-51ae-ef36-136b-0e2648fde69f.png)
[AOS](https://michalsnik.github.io/aos/)も人気のライブラリで、現在v3がベータ版で公開されていますが、すぐに利用するなら[安定版のv2](https://github.com/michalsnik/aos/tree/v2)を利用しても良いでしょう。ライセンスは、MIT。

演出は制御系処理が記載されたaos.jsとは切り離され、[同時に配布されているオリジナルのaos.cssを利用](https://github.com/michalsnik/aos/tree/v2/dist)します。WOW.js同様にHTML5要素のカスタム属性で制御系設定を指定できるのが特徴です。

<p data-height="265" data-theme-id="0" data-slug-hash="YdzVNK" data-default-tab="js,result" data-user="untspringk" data-pen-title="Xmas Carol Lyrics with AOS" class="codepen">See the Pen <a href="https://codepen.io/untspringk/pen/YdzVNK/">Xmas Carol Lyrics with AOS</a> by Takayasu.B (<a href="https://codepen.io/untspringk">@untspringk</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

**[個人的な感想]**
scrollRevealやWOW.jsと同様に、なるべくjsを記述しなくても実装ができるように配慮されたライブラリです。アニメーション用のcssも用意され、その指定方法も簡単なので、初めてスクロール連動コンテンツを作成する場合にはお勧めです。ただ、ビューポートリサイズ時の処理に弱いので、動的に要素の高さが変わるコンテンツの場合は注意が必要です。

###[in-view.js](https://camwiegert.github.io/in-view/)
![in view js   Get notified when a DOM element enters or exits the viewport .png](https://qiita-image-store.s3.amazonaws.com/0/163449/a6f4eeb7-5e62-4d60-914b-61c299586074.png)
[in-view.js](https://camwiegert.github.io/in-view/)は、他の類似ライブラリとは少し毛色が異なり、DOM要素同士の交差状態を監視する[IntersectionObserver API](https://developer.mozilla.org/ja/docs/Web/API/Intersection_Observer_API)の代替手段の1つとなることを目指して作成されたようです。ここ2年ほど更新はされていません。ライセンスは、MIT。

演出処理との連携はWaypointsなどの他のライブラリと同様に、イベント駆動時のコールバック関数内で処理することになります。また、ライブラリサポートの注意点として、DOM変更後の可視（visibility）チェックに[MutationObserver API](https://developer.mozilla.org/ja/docs/Web/API/MutationObserver)を利用しているようで、このAPIがサポートされていないIE9とIE10は、[Custom Elements (v1) Polyfill](https://github.com/webcomponents/custom-elements)が必要になるとのことです。

<p data-height="265" data-theme-id="0" data-slug-hash="yGLboK" data-default-tab="js,result" data-user="untspringk" data-pen-title="Xmas Carol Lyrics with in-view.js" class="codepen">See the Pen <a href="https://codepen.io/untspringk/pen/yGLboK/">Xmas Carol Lyrics with in-view.js</a> by Takayasu.B (<a href="https://codepen.io/untspringk">@untspringk</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

**[個人的な感想]**
Waypointsのような安定感があると思いますが、jsによる実装がメインになるので、jsによる実装に慣れていない人には少し敷居が高いかもしれません。

このライブラリは要素の監視処理をスクロール毎時ではなく、100msごとに実行してブラウザの負荷を減らすとともに、リサイズ時のトリガー（要素交差判定）のズレが起こらないようにもしているので、要素の高さが動的に変化するコンテンツの場合に是非利用を検討したいライブラリだと思います。

###[ScrollOut](https://scroll-out.github.io/)
![ScrollOut.png](https://qiita-image-store.s3.amazonaws.com/0/163449/40ab954c-58db-b6af-fa7c-aaec609a8a99.png)
[ScrollOut](https://scroll-out.github.io/)は、[cssカスタムプロパティ（変数）](https://developer.mozilla.org/ja/docs/Web/CSS/--*)などを利用しているなど、モダンブラウザ向けのライブラリです（IE11以上）。超軽量で、わずか2.4KB。ライセンスは、MIT。

モダンブラウザ向け、超軽量で設計された類似ライブラリに[sal.js](https://mciastek.github.io/sal/)や[delighters](https://q42.github.io/delighters/)がありますが、[デモ](https://codepen.io/collection/npPbNM/)がいい感じだったという単純な理由でこちらを選びました。

レガシーなブラウザを考慮しない作品であれば、これらのライブラリを試しつつ、通常あまり関わることの少ないIntersectionObserver APIやMutationObserver API、CSSカスタムプロパティなどに触れる良い機会になるかもしれません。

<p data-height="265" data-theme-id="0" data-slug-hash="EGxmdJ" data-default-tab="js,result" data-user="untspringk" data-pen-title="Xmas Carol Lyrics with ScrollOut" class="codepen">See the Pen <a href="https://codepen.io/untspringk/pen/EGxmdJ/">Xmas Carol Lyrics with ScrollOut</a> by Takayasu.B (<a href="https://codepen.io/untspringk">@untspringk</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

**[個人的な感想]**
非常に少ないコードで実装できることや、jsでもcssでも連携がしやすく、特にスクロール量とcssカスタムプロパティとの連携は、より閲覧者の操作と演出との連携を実現しやすくなると思います。これまでもjsで実現可能でしたが、要素検知などの制御系をjsで、演出などのふるまいをcssで、といった処理の分担がより明確にできるようになるでしょう。

##おわりに

本記事は以上になります。各ライブラリの最低限の機能しか紹介できていないし、検証もちゃんとしていない内容で恐縮ですが、スクロール連動や要素監視系の実装が必要なときの参考になれば幸いです。

今年も残すところわずかですね。
それでは、また。