CSSで2つの要素をふわっとアニメーション切り替えする

2つの要素をふわっとフェードアウトしながら切り替えたいケースがまれによくあると思いますが、そんな時はCSSでアニメーションして実装しちゃいましょう


## シンプルに切り替える場合
ほとんどの場合はこれでいけると思います。
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="PwYPZqb" data-pen-title="animation1" data-user="yeeururn-the-sans" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/yeeururn-the-sans/pen/PwYPZqb">
  animation1</a> by tkiha (<a href="https://codepen.io/yeeururn-the-sans">@yeeururn-the-sans</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

1枚目のCSSを抜粋するとこんな感じです
```sass
// 10秒アニメーションをずっと繰り返す。アニメーション名はanime1
animation: 10s infinite anime1

// アニメーション名:anime1 の動作
@keyframes anime1
  // 最初は普通に表示 
  0%
    opacity: 1
  // 2.5秒までは1枚目を表示 
  25%
    opacity: 1
  // 2.5秒〜5秒までアニメーションで消えていく
  50%
    opacity: 0
  // 5秒〜7.5秒まで透明
  75%
    opacity: 0
  // 7.5秒〜10秒までアニメーションで表示していく
  100%
    opacity: 1
```

2枚目はこんな感じですね。1枚目の逆みたいなイメージです
```sass
// 10秒アニメーションをずっと繰り返す。アニメーション名はanime2
animation: 10s infinite anime2

// アニメーション名:anime2 の動作
@keyframes anime2
  // 最初は透明にして非表示 
  0%
    opacity: 0
  // 2.5秒までは2枚目は透明 
  25%
    opacity: 0
  // 2.5秒〜5秒までアニメーションで表示
  50%
    opacity: 1
  // 5秒〜7.5秒まで2枚目を表示
  75%
    opacity: 1
  // 7.5秒〜10秒までアニメーションで消えていく
  100%
    opacity: 0

```

これらの2つの要素を、`position: absolute;`で重ねて表示しておくことで、ふわっと切り替えるように見えます
```html
<div class="container">
  <div class="body1">1枚目</div> ← position: absolute;
  <div class="body2">2枚目</div> ← position: absolute;
</div>
```


## リンクがある場合の問題点

上のパターンだと、aタグが乗っかっている場合に、aタグは非表示になっているだけなので、1枚目も2枚目も、どちらを表示していてもリンクがクリックできてしまいます。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="zxOBgdP" data-pen-title="リンクがある場合の動作" data-user="yeeururn-the-sans" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/yeeururn-the-sans/pen/zxOBgdP">
  リンクがある場合の動作</a> by tkiha (<a href="https://codepen.io/yeeururn-the-sans">@yeeururn-the-sans</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

なので、非表示と同時に`display: none`を指定する必要があります。

```sass
@keyframes anime2
  // 最初は非表示にして、1枚目ではクリックできないようにする
  0%
    display: none
  // 2.5秒の前までは2枚目は非表示 
  24%
    display: none
  // 2.5秒から2枚目を透明に変える 
  25%
    display: block
    opacity: 0
  // 2.5秒〜5秒までアニメーションで表示
  50%
    opacity: 1
  // 5秒〜7.5秒まで2枚目を表示
  75%
    opacity: 1
  // 7.5秒〜10秒までアニメーションで消えていく
  100%
    opacity: 0
```

## リンクがある場合でも、これで大丈夫
上記を適用するとこんな感じの動作になります。2枚目が消えている時はリンクがクリックできなくなっていると思います。
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="yyBJmZo" data-pen-title="アニメーションで二つの要素を切り替える（aタグが乗っかっている場合）" data-user="yeeururn-the-sans" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/yeeururn-the-sans/pen/yyBJmZo">
  アニメーションで二つの要素を切り替える（aタグが乗っかっている場合）</a> by tkiha (<a href="https://codepen.io/yeeururn-the-sans">@yeeururn-the-sans</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>