【スライド】画像をアニメーションで切り替えたい！オシャレに！【縦 横 斜め】

[画像をアニメーションで切り替えたい！オシャレに！](https://qiita.com/drooooopp/items/5d7ef537461ae3f23c3b) の詳細記事となります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116793/41567b57-ecc8-e0c1-fbd2-2cba659fcc56.gif" width="300">

今回は【縦 横 斜めにスライドする】アニメーションです。
実際の挙動は以下のようになります。(以下は横にスライドする挙動です。)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116793/7f5a561f-3eec-7d2f-c980-4669100b4f29.gif" width="300">

CSSの `mask-image` を利用しての実装になります。
早速実装です！

## 1. HTMLの追加

```{html}
<div class="animate js-animate" data-is-animated="false">
  <div class="animate_item" data-animate-number="1">
    <img src="image_1-1.jpg">
  </div>
  <div class="animate_item" data-animate-number="2">
    <img src="image_1-2.jpg">
  </div>
</div>
```

まずHTMLで、 `切り替え前の画像` `切り替え後の画像` を用意します。
それぞれ、上なのか下なのかがわかるようにdata属性を割り当てその外側にも状態管理用のdata属性を記載します。

**image_1-1**
![image_1-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116793/51fb059b-673f-6cec-e9c4-116b7152dae1.jpeg)

**image_1-2**
![image_1-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116793/cbe4a0f6-f8e8-8b36-dedd-193d57b6d1ed.jpeg)


## 2. CSSの追加

```{css}
.animate {
  position: relative;
}

.animate_item {
  position: absolute;
}

[data-is-animated="true"] [data-animate-number="1"] img,
[data-is-animated="false"] [data-animate-number="2"] img {
  position: relative;
  z-index: 2;
  animation: slide-animation 0.6s;
  mask-image: linear-gradient(90deg,#000 0%,#000 0%,transparent 0%,transparent 100%);
  -webkit-mask-image: linear-gradient(90deg,#000 0%,#000 0%,transparent 0%,transparent 100%);
  mask-size: auto 100%;
  mask-repeat: no-repeat;
  mask-position: 0 0;
  animation-fill-mode: forwards;
  -webkit-mask-repeat: no-repeat;
  -webkit-mask-position: 0 0;
}

[data-is-animated="true"] [data-animate-number="2"] img,
[data-is-animated="false"] [data-animate-number="1"] img {
  position: relative;
  z-index: 1;
  animation: inherit;
}
```

CSSではそれぞれの `切り替え前の画像` `切り替え後の画像` に対して、表示するときのアニメーションなどの記載をします。

### (slide-animation... どこに書いてあります...?)

```{scss}
@keyframes slide-animation {
  @for $i from 0 to 100 {
    $i% {
      mask-image: linear-gradient(90deg,#000 0%,#000 $i%,transparent $i%,transparent 100%);
      -webkit-mask-image: linear-gradient(90deg,#000 0%,#000 $i%,transparent $i%,transparent 100%);
    }
  }
}
```
普通に書くと4行×100のとてつもないキーフレームを書くことになるので、postcssなど、CSSプリプロセッサを利用してeachやforで書くと良いと思います。

### 横ではなく、縦・斜めにするには
`linear-gradient` の指定を変更します。
現在 `90deg` となっている箇所を変更することで調整可能です。

**斜め**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116793/aa4b4ac9-64e5-bf08-87ce-1f116d728e0b.gif" width="300">

**縦**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116793/5b3c0749-d0e6-21d6-83ea-8fd84c725067.gif" width="300">


## 完成！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116793/6f4d2fc2-ee65-587f-cb65-690724476548.gif" width="200">

画像を可愛い猫にしてみました。
こんなにオシャレに！（猫がかわいい）画像切り替えが！（アゴを乗せるのが好きみたいです...）簡単に！（ラグドールちゃんですね）できちゃいました！（かわいいなぁ...）

スライダー系のプラグインでは1番目と2番目に表示される画像の位置は、スライドしながらスライドすると思います。（語彙力）
こちらは位置はそのままでスライドするのです。（語彙力）
なので、少し違った見え方になって良いですね。

あとは必要に応じてCSSでのレイアウトや、JavaScriptでのタイミングを調整すれば色々な見せ方ができると思います。

## 最後に
[mask-position | Can I use...](https://caniuse.com/mdn-css_properties_mask-position)
実案件で利用できるかは上記を踏まえてご利用ください。

### その他のアニメーション切り替え記事はこちら
[【ブラシ】画像をアニメーションで切り替えたい！オシャレに！【塗りつぶし】](https://qiita.com/drooooopp/items/58ae4baeb863e52e64ce)
[【斜め】画像をアニメーションで切り替えたい！オシャレに！【グリッド】](https://qiita.com/drooooopp/items/daae7613269d41d612b7)
[【フリップ】画像をアニメーションで切り替えたい！オシャレに！【くるっと】](https://qiita.com/drooooopp/items/586813b06591af3ef37b)