パララックス(視差効果)をskrollrで実装してみた

#はじめに
ラブライブのAqours活動５周年記念のファンサイトを作ってみたくなったので、作ってみた。
ただのサイトでは面白くないので、よくアニメとかのサイトにありがちなパララックス(視差効果)を取り入れたサイトを作ってみた。
#完成品
実際の作品はこちら：http://no10pj.php.xdomain.jp/
Githubはここ：https://github.com/Kumampet/Aqours5thaniv
#jQueryのライブラリの`skrollr`をダウンロードする
配布先：https://github.com/Prinzhorn/skrollr
ダウンロードしたら、プロジェクトのJavascriptが入ってるところに`skrollr.js`をぶち込む。
`skrollr/src/skrollr.js`に入ってるよ。
#HTMLファイルに読み込まれるようにする
通例通り`<script src="[your_Javascript_path]/skrollr.js"></script>`で読み込んであげる。
この時jQueryの読み込み位置より下にすること(常識だよね！)
#配置場所がキモの`skrollr.init();`
なんか公式ドキュメントとかほかに使ってる人の投稿見ると、どうやら`skrollr.init();`という関数を実行する必要があるらしい。

私は「あ、skrollr.js読みこんだ次の段階でinitすればええんかなぁ」と思って

```html:index.html
<script src="./js/skrollr.js"></script>
<script type="text/javascript">
  skrollr.init();
</script>
```

とやってみたら、ハズレでした。

##正解は？
`scrollr.init();`の置く場所としては**すべての視差効果の終了地点**でした。
要するに、プロジェクトの最後に持ってくればいいわけですね。
私の場合は`index.html`すべてに視差効果が含まれているので

```index.html
<body id="top">
    --------------------------------hohefugahogera-------------------------------
    <!-- こいつは最後に持ってくる -->
    <script type="text/javascript">
        skrollr.init();
    </script>
</body>
```
として`body`タグの終了直前に持ってくることで解決しました。
#パラメータの設定の仕方
ここまでくればあとは動かしたいオブジェクトにパラメータを設定するだけです。
手順としては以下の通り
###1.視差効果を付けたいオブジェクトを作る
まずはトップ画面とスクロールしたら次に出る画面を作っておきます。
今回の作品を例に画面と該当のコードを張っておきます。
またCSSについては今回は動く部分のみに絞って説明します。

A.タイトル画面↓↓↓↓↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355857/bc043e11-9d78-d550-4873-0786b7af6134.png)

```html:index.html
<div id="anime0" class="intro" data-0="display:block; top:0%; opacity:1;" data-900="opacity:0;" data-930="top: -100%; opacity:0;">
  <img class="aqours-logo" src="./img/181119_lovelive_3rd_007_aqours.png" alt="aqours_logo">
  <div class="scrolle-bar">
    scrolle
  </div>
  <p class="attention">*このサイトは非公式のファンメイドサイトです。公式とは一切関係ございませ
     <br>*ご理解のある方のみご覧ください。
     <br>*また、PCでの閲覧を強く推奨します。スマートフォンにはまだ対応しておりません。
  </p>
</div>
```

B.画面その１↓↓↓↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355857/dfa1f0c7-a88a-1159-bbc1-84959f80e2fc.png)

```html:index.html
<div id="aqbg" data-930="top:0%;" data-4000="top:0%;" data-6000="top:-100% display:block;">
        <!-- 後ろの白いシルエット -->
        <img class="aqalph" src="./img/aqours_omohito_alph.png" alt="aqpph" data-930="opacity:0; transform: translateY(90deg);" data-4000="opacity:1; transform: translateY(270deg); top:50%;" data-8000="top: 0%;">
        <!-- Happy Birthday Aqours -->
        <img class="hpb-aq" src="./img/hpb-aq.png" alt="happybirthday_aqours" data-300="top:50%;" data-4000="top:0%;">
</div>
```

C.キャラクターの画面その１
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355857/f62cdd4c-441f-fc68-095b-af9273731537.png)
D.キャラクターの名前の文字
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355857/370a3371-552c-7bb6-e228-e737e5147ebf.png)

```html:index.html
<!--場面Cと場面Dのコードは同じです。-->
<div id="anime1" class="canvas" data-4000="top: 100%; display: block;" data-6000="top:0%; height:100%;" data-8000="height:130%; top:0%;" data-12000="top:-100%;" data-14000="display: none;">
        <!--キャラクター画像-->
        <img class="character" src="./img/member/chika/pc/chika_1_pc.jpg" alt="chika">  
　　　　 <!--名前の文字-->
        <img class="name" src="./img/member/chika/chikatakami.png" alt="name" data-6000="bottom:100%;" data-6500="bottom:5rem;">
</div>
```

とりあえずこの４場面をスクロールするごとに下からのスワイプで切り替えていくことにしましょう。
###2.スクロール値をとってどれくらいスクロールしたらどれくらい動かすのか考える
スクロール値を表示するスクリプトを組んで、画面に表示させつつ、どれくらいスクロールしたら動かすのかを考えていく。(左上に小さく出てるのがスクロール値)
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355857/1247f7b4-0d99-dc0c-187e-7e010b400087.gif)

スクロール値の出し方は、まず表示させるエリアを作る。

```html:index.html
<div id="output"></div>
```
エリアにDOMを上書きしていくようにjs(jQuery)を書き込んでいく

```javascript:scrolle.js
$(function () {
    $(window).scroll(function () {
        $("#output").html($(window).scrollTop());
    });
});
```
CSSはわかればいいので、とりあえず外形と同化しないようにして、`z-index:9999`とかにして常に最前面にできるようにする。

```css:scrolle.css
div#output {
        position: fixed;
        z-index: 9999;
        background-color: white;
}
```

###3.書式に沿って値を指定していく
動かしたいスクロール値が分かったら、実際にコマンドを書き込んでいく。
書き込む場所はHTMLタグの中に書きこむっぽい
基本のコマンドは`data-[scrollei-length]="[css command]"`となっているやつ
div要素とかimg要素に`data-4000="top: 100%; display: block;"`とか書いてあるやつ

```html:index.html
<div id="anime1" class="canvas" data-4000="top: 100%; display: block;" data-6000="top:0%; height:100%;" data-8000="height:130%; top:0%;" data-12000="top:-100%;" data-14000="display: none;">
        <img class="character" src="./img/member/chika/pc/chika_1_pc.jpg" alt="chika">  
        <img class="name" src="./img/member/chika/chikatakami.png" alt="name" data-6000="bottom:100%;" data-6500="bottom:5rem;">
</div>
```
これは例えば`data-4000="top: 100%; display: block;" data-6000="top:0%; height:100%;" data-8000="height:130%; top:0%;" data-12000="top:-100%;" data-14000="display: none;"`なら「スクロール値:4000のとき`top: 100%; display: block;`で始まり、スクロール値:6000の時`top:0%; height:100%;`になるようにし、スクロール値:8000のとき`height:130%; top:0%;`になるようにして・・・」という風に最初の宣言から指定したスクロール値を経過するまでにCSSのどの要素をどれくらい変化させるか、という命令を書いていく。

div要素にブロック全体の視差効果
`img class=name`には画像が天井に着いてから、上から降ってくるように命令

上記の命令は次のGIFの動きをする
![ezgif.com-video-to-gif (3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355857/62af6623-0550-542e-82ab-eb786d80dc81.gif)

#おわりに
Aqoursはいいぞ
ラブライブはいいぞ
（技術系の話しろ）