CSS animation で遊び倒す - Useful Buttons -

CSS animation day38 となりました。
毎日記事を投稿しているせいで、画像アップロード制限(100MB月)されました。
大変申し訳ないのですが、解除されるまで、画像は極力抑えて、codesandobox で随時貼り付けてお届けいたします。


今日で2月が終わりますね。
本日も、マイクロインタラクションで使える、ボタンを作っていきます。
[前回](https://qiita.com/duka/items/e758f977957d08334e69) のボタンは確かに綺麗ですが、機能的に美しいとは言えません。




#1. 完成版
<p class="codepen" data-height="318" data-theme-id="0" data-default-tab="css,result" data-user="hiroyaiizuka" data-slug-hash="OqyVRE" style="height: 318px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="Next Button">
  <span>See the Pen <a href="https://codepen.io/hiroyaiizuka/pen/OqyVRE/">
  Next Button</a> by hiroya iizuka (<a href="https://codepen.io/hiroyaiizuka">@hiroyaiizuka</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

#2.なぜか？
[Medium](https://medium.muz.li/3-good-reason-why-you-might-want-to-remove-that-hamburger-menu-from-your-product-69b9499ba7e2) や、[impress](https://webtan.impress.co.jp/e/2016/12/02/24529) の記事によると
ハンバーガーメニューがあるとユーザーはクリックしなかったり、再訪問やPV数が落ちることがあるそうです。

なぜかというと、ハンバーガーメニューを見るだけでは、どんな情報が隠れているか、どんなアクションが次に起こるかがわからず、わざわざ重い腰を上げてクリックする気にならないからと思います。(ハンバーメニューは完全に悪だ！という意見に対し擁護する声も散見されますが、確かにUserにとって、あまり優しくないデザインと個人的に思ってます。)

ボタンに当てはめて考えてみると。
ベストなボタンとは、押す前から、どんなボタンかが一目でわかり、かつ押した(触れた)瞬間に、想像通りの動きをしてくれるボタンです。(むやみやたらに豪華で派手な演出をつける必要ないです。)こういう時に予想外な奇天烈のアニメーションは、人を驚かせてしまい、その0コンマ数秒がおそらく、ユーザーにとって負の感情を産ませてしまう可能性があります。

デザイナーのエゴをすて、単一の動きでマイクロインタラクションを表現する必要があり、今日はそこを意識して作っていきましょう。


#3. 参考文献
[Button Hover Effects | Html CSS](https://www.youtube.com/watch?v=CzedjonaEjc)
[Button hover effects with box-shadow](https://codepen.io/giana/pen/BZaGyP)

#4. 分解してみる

❶. 
マークアップしましょう。

```index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <link rel="stylesheet" href="css/styles.css" />
  </head>
  <body>
    <div class="container">
      <div class="button">
        Button
      </div>
    </div>
  </body>
</html>
```


```styles.scss
body {
  background: #000;
  margin: 0;
  padding: 0;
}

.container {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 100vw;
  height: 100vh;
}

.button {
  position: relative;
  width: 200px;
  height: 100px;
  text-align: center;
  line-height: 100px;
  color: #ff7f82;
  font-size: 24px;
  border-radius: 30px;
  border: 2px solid #ff7f82;
  background-size: 400%;
}
```


これで、背景が黒いところに、ボタンが中央に配置されました。
(画像なくて申し訳ありません m(__)m)
<br/>

❷.
では、どんなアニメーションをつけると良いでしょうか？　
ボタンを押した時に、次のページへ進む、機能を持つものとします。

「次に進む」、
`1. 左から右に、ボタンの背景の色が変わる
 2. 文字がNext、次へなどと、みただけでボタンの機能がわかるものとなっている
 3.  →が付いている`

などが考えられます。(他にもアイデアがあったら教えてください。)

注意点として、左から右の一方向の流れを設定しているため、
逆方向や回転、跳ねる、広がるなどの動きは、[microinteractionの流儀](https://techacademy.jp/magazine/11670) から外れてしまいます。デザイナーのエゴを捨てましょう。


上記3つのアニメーションを取り入れます。



```styles.scss
.button {
  position: relative;
  width: 200px;
  height: 100px;
  text-align: center;
  line-height: 100px;
  color: #ff7f82;
  font-size: 28px;
  border-radius: 30px;
  border: 2px solid #ff7f82;
  background-size: 400%;

  &:hover {
    animation: insetChange 0.5s ease both;

    &:before {
     animation: arrowChange 0.2s ease-in both;
    }
  }
}

@keyframes insetChange {
  100% {
    box-shadow: 240px 0px 0px 0px #ff7f82 inset;
    color: #fff;
  }
}

@keyframes arrowChange {
  30% {
    color: #fff;
  }
  100% {
    transform: translateX(15px);
  }
}

.button:before {
  position: absolute;
  content: ">>>";
  top: 0px;
  right: 10px;
}
```

<p class="codepen" data-height="318" data-theme-id="0" data-default-tab="css,result" data-user="hiroyaiizuka" data-slug-hash="OqyVRE" style="height: 318px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="Next Button">
  <span>See the Pen <a href="https://codepen.io/hiroyaiizuka/pen/OqyVRE/">
  Next Button</a> by hiroya iizuka (<a href="https://codepen.io/hiroyaiizuka">@hiroyaiizuka</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>



ポイントは、
・animation の設定に both をつけ、hover終了時のアニメーションを維持でき、hoverを外すと、最初に戻るとこ。
・beforeクラスをつけて、矢印を作り、アニメーションを設定。
ただし、マイクロインタラクションを意識して、左から右に、色も統一感を出しました。
・ease-in をつけることで、はじめゆっくり動き、Buttonのbox-shadowが広がっていくのを待ってから動くことを意識しました。

いい感じですね！　
では、また明日〜！