figmaでinfiniteでcenteredなカルーセルを作る

figmaってきっとこんなのは作れないよなと思い込んでいたけど、作ってみたら意外とできたので、忘れないようにまとめます。
きっと需要はあるはずなのに案外調べても出て来なかったので、同じように諦めている方の気付きにつながればうれしいです。

# 作るもの

▼こういうタイプのループするカルーセルをプロトタイプで作ります。
![Pasted image 20211010101417.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92494/917726f5-5328-1caf-0d82-941322e35790.png)

- アクティブなスライドが中央に表示され、その前後一枚が少し顔をのぞかせている
- 最後までめくると最初のスライドにもどる

完成形はこんな感じです。
![2021-10-17 11.13.59.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92494/c885152e-4b9a-664d-ddd7-90611eeb5c08.gif)

# 下ごしらえ
まずスライドを6枚用意します。名前はそれぞれSlide00〜05とします。
そこにAuto Layoutをかけ、Auto Layoutの枠となっているFrameの名前は"Container"とします。
![Pasted image 20211010101832.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92494/ee6efaf3-84a7-0cd5-2828-8d60550921db.png)

## レイヤー名が大切
Smart animateは、各フレーム内の同じレイヤー名のものを同じものと判別してアニメーションしています。
レイヤーが入れ子になっている場合、親要素から順に判別されているようなので、親要素から名前を合わせる必要があります。
(同じ名前の親要素の中の同じ名前の要素がアニメーションされる)

▼レイヤーで見るとこういう状態になっています。
![Pasted image 20211009164230.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92494/ba0ef1ac-6102-8f9d-fd38-3ff315acfdc4.png)


材料のストックとしておいて置きたいので、Containerごと複製し、スライドを並び替えます。
初期状態のSlide00を中心に前後2枚ずつ、スライド5枚が並んだ状態を作ります。

Slide04・Slide05をSlide00の左へ移動し、Slide03を削除しました。
この状態のContainerをFrameに入れます。サイズと位置は程よく調整してください。
![Pasted image 20211010105414.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92494/d529d62c-3449-fd2d-1d44-a976ae23d4a5.png)

これがSlide00がActiveな状態です。Frameの名前はindex: 00としておきます。

Clip contentするとこんな感じです。
![Pasted image 20211009165305.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92494/4ade3334-920b-70dc-1c20-aa41e3e2984b.png)
このFrameが基本の構成になります。


一度に表示するのはスライド3枚なのに、なぜ5枚必要なのかというと、外から登場するアニメーションを作るためには動き始める前に動きの最初の位置にいる必要があるからです。前のシーンにいないとSmart Animateはアニメーションしてくれません
（冷静に考えると当たり前なんですが、頭がこんがらがることがちょくちょくあります…）

舞台上で演技をしている役者さんと、舞台袖で次の出番のためにスタンバイしている役者さんのようなイメージと考えるとわかりやすいかも知れません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92494/3a86f462-1de5-ad41-2ef3-7203bffd8308.png)
今回の構成だと、Frame内に表示される内側3枚はアニメーションを見せるため、両端2枚は次のシーンの為にスタンバイしている状態です。
この次のシーンで、Slide01 or 05は中心に移動、Slide02 or 04は外から登場し、また次に登場するスライドがスタンバイに入ります。この繰り返しでループするカルーセルは出来上がります。

（こういう仕組みになので、表示させるスライドの数　+ 2枚を用意するようにすれば![2021-10-17 11.13.59.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92494/a5b2059e-f31a-c394-e20c-9680635b0203.gif)
)

# 基本の動きを作ってみる
まずはテストとして、一枚進んだ状態と一枚戻った状態を作り、Interactionをつけて動きを確認してみます。

まず1枚進んだ状態を作りましょう。
今度はSlide01が中心に来ます。
index: 00のFrameを複製し、名前をindex: 01とします。
Slide04を削除し、Slide03をストックからコピーして右に追加します。
![Pasted image 20211010105543.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92494/0f9cee20-99b9-e89c-079a-399dd6d981cb.png)

次は1枚戻った状態。今度はSlide05が中心です。
Index: 00のFrameを複製し、名前をindex: 05とします。
Slide02を削除し、Slide03を左に追加します。
![Pasted image 20211010105957.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92494/0e1c71be-95ca-22ad-0a63-55ec62577817.png)


### Interactionsを設定する
動きの設定をします。
まずindex: 00からindex: 01へ進む設定です。

Prototypeモードにして、Index: 00のContainerからIndex: 01を繋げます。
![Pasted image 20211009165952.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92494/fe245a35-1156-cb65-3c11-3d8036b20440.png)


Containerに、次のように設定します。

* On drag
* Navigate to: index: 01
* Animation
    * Move outの左から右
    * Smart animate matching layersをチェック

![Pasted image 20211009170028.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92494/9d924992-e232-5a9b-518e-827600c65142.png)


次はindex: 00からindex: 05へ戻る設定です。
自分はなかなか気が付かなかったのですが、同じ種類のアクションでも複数登録ができます。
![Pasted image 20211009170414.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92494/1ad67aa5-0d41-699a-0296-185aeb7128ff.png)

Containerに、次のように設定します。

- On drag
- Navigate to: index: 05
- Animation
	- Move outの右から左
	- Smart animate matching layersをチェック


![Pasted image 20211009170456.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92494/1422c866-6185-c48d-df5b-ba1d666ca774.png)


前後へのInteractionsが設定できました。
![Pasted image 20211010110515.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92494/48df70ab-7658-c6e6-988f-7e8c9083d983.png)

Presentで見てみます。
左から右へドラッグすると…
![2021-10-09 17.24.14.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92494/6b733700-0e23-ed49-a973-cd96edeeb1a4.gif)

Rキーを押して初期状態に戻し、右から左へドラッグすると…
![2021-10-09 17.23.55.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92494/cd7a870f-2b19-6b4b-8f3c-d0b5aeb4143b.gif)
#### ドラッグの方向と遷移先はInterractionｓで設定している方向に連動している
ドラッグの方向と遷移先は、Move out(Move inでも同様)で設定している方向に連動しています。
（オフィシャルの情報で明確に記載は見つけられませんでしたが、多分…）

動きとしてはほとんどSmart Animateによる動作なのですが、方向を設定する為にMove outを使用しています。


#同じ事をすべての状態で作る
同様の手順を繰り返し、index: 00 〜 index: 05までの状態を作り、その間をInteractionで繋げていきます。

---

#### tip： Interactionsはコピペできる
Interactionsは項目の左端にマウスホバーするとハンバーガーアイコンが
表示されます。そこをクリックして選択すると、コピーしてほかのオブジェクトにペーストすることができます。
![Pasted image 20211010112643.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92494/f519a0fe-64ee-52f0-5cd2-d28c1eaa3664.png)
▲左側にこんなアイコンが表示される

まとめて適用して遷移先を個別に変更していくと効率的です。
アニメーションの方向と遷移先の組み合わせはわかっていてもよく間違えるポイントです。
（一つ目のInteractionは進む、二つ目は戻るなど留意して行うと間違えにくいと思います）

---

全部設定できました。
▼こんな状態になります。
![Pasted image 20211010112436.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92494/f3fcb43b-a8b9-3031-8084-cd1d42a58098.png)

Presentで表示すると…
![adjusted.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92494/b64f43fd-91b5-327f-a51b-50228fde97c2.gif)

これで完成です！
FrameにAfter delayで進むように設定してAutoを再現したり、ドットをつけたり応用でいろんなバリエーションを作れます。