CSSをある程度使えるようになった人が覚えたいtransitionプロパティの使い方


##はじめに
HTML,CSSをある程度勉強したし、そろそろJavaScript（jQuery）でも勉強しようかなーと思っていませんか？
いや、ぜひJavaScriptは勉強してください。
しかし、まず基礎となる**CSSで何ができるか**ぐらいは分かっておいたほうがいいと思います（自分に向けて）。
ということで、まずCSSで変化をつけるための基礎となるプロパティ、**transition**の使い方を備忘的にまとめます。

##目次
 - [この記事の対象](#記事の対象)
 - [transitionとは](#transitionとは)
 - [transitionプロパティの使い方](#transitionプロパティの使い方)
 - [1.transition-property](#1transition-property)
 - [2.transition-duration](#2transition-duration)
 - [3.transition-timig-function](#3transition-timing-function)
 - [4.transition-delay](#4transition-delay)
 - [おわりに](#おわりに)


##記事の対象
 - WEBアプリ作成したくてProgateやその他でHTML,CSSを学び、ある程度自分の思い通りのレイアウトを作れるようになった。
 - コピペでそれっぽい動きのあるものを作っていた。
 - `transition`というプロパティがあるのは知っているけど、使い方が実際よく分からない。

という方（自分）に向けて書きます。
実践的な内容ではありません。
##transitionとは
`transition`はCSSアニメーションのひとつであり、動きに変化をつけるためのプロパティです。
具体的には何かアクションが行われたときやプロパティが変化するときなど、例えば

- マウスカーソルをボタンに乗せたとき
- クリックしたとき

など
つまり、疑似クラスである`:hover`や`:active`などと組み合わせて使います。
疑似クラスだけでも変化をつけることはできますが、それに加え**変化をどのように行うか、どのぐらい時間をかけて変化するか**指定することでアニメーションと呼ばれる挙動をとることになります。
それを指定するのが`transition`です。

また、`animation`というプロパティともよく一緒に使われます。こちらは疑似クラスよりも変化を自由に指定できるプロパティです。
##transitionプロパティの使い方
`transition`は`:hover`などと一緒によく使われるので、`:hover`側に指定したくなるのですが（自分が）、CSSを適用させたい元のCSSで指定します。

```css:CSS

セレクタ{
  background-color: black;
  color: white;
  transition: all 0.3s;/** こっちに記述 **/
}
セレクタ:hover {
  background-color: white; 
  color: black;
  /** こっちじゃない **/
}
```
##transitionプロパティの種類
`transition`にはショートハンド（参考：[CSSのショートハンド](https://qiita.com/kouh/items/94018ab5dafdb09e0d8a)）を除くと4つのプロパティが用意されています。

よくショートハンドで使われるのを見ますが、まずは4つのプロパティひとつひとつを指定してしっかり役割を覚えたいところです。（自分に向けて）

| No  |       プロパティ名 |   説明   |
|:-----------------:|:------------------:|:------------------|
|1  | transition-property|適用されるCSSプロパティを指定。 |
|2  | transition-duration |変化が始まってから終わるまでの時間を指定。|
|3  |  transition-timing-function |変化の仕方を指定。   |
|4  |  transition-delay |変化が始まる時間を指定。|
|#  |  transition |ショートハンドプロパティ。一度に上の4つの値を指定できる。|

では以下で詳しく説明します。

##1.transition-property
適用されるCSSプロパティを指定するプロパティ（ややこしいですね）。

指定できる値は

| 値 |     説明   |
|:-----------------:|:------------------|
|all | プロパティ全てに適用される。|
|none|どのプロパティも適用されなくなる。|
|プロパティ名|transitionを指定できるプロパティをひとつに適用する。|

以上の3つです。
`:hover`などでは`all`で指定されるのをよく見かけますね。

###表示結果
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="fumu238" data-slug-hash="NWqgMJy" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="transition-property">
  <span>See the Pen <a href="https://codepen.io/fumu238/pen/NWqgMJy">
  transition-property</a> by fumu (<a href="https://codepen.io/fumu238">@fumu238</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
上のback-colorの箱は`transition-property`に`background-color`だけを指定しています。
想像がつくかとは思いますが、このプロパティは、プロパティを指定するだけのものですので、**これ自体ではホバー時の変化の仕方は変わりません**。
`transition-duration`を一緒に指定してあげることで、**指定した`background-color`だけ**が、3秒かけて変化していますね。文字色はホバーされた瞬間に変わります。

下のallの箱は、`all`を指定しているので、`background-color`、`color`共に3秒かけて変化します。

##2.transition-duration
変化が始まってから終わるまでの時間を指定するプロパティ。つまり**変化にかける時間**を指定します。
時間指定なので、単位を指定してあげます。

指定できる単位は

| 単位 |     説明   |
|:-----------------:|:------------------|
|s | second。つまり秒。10sで10秒です。|
|ms|milli second。 つまりミリ秒。500msで0.5秒です。|

0.1sなど小数でも指定できるので、sのほうが使いやすいかと思います。

`transition-property`のほうでも出てきましたが、一応こちらも使用例を
###表示結果
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="fumu238" data-slug-hash="oNXwyvx" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="transition-duration">
  <span>See the Pen <a href="https://codepen.io/fumu238/pen/oNXwyvx">
  transition-duration</a> by fumu (<a href="https://codepen.io/fumu238">@fumu238</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
BOX1は`transition-duration`が`4s`で指定してあるので、4秒かけてホバー時のプロパティの値に変化します。
BOX2は`1s`なので、より速い変化です。

ちなみに`transition-property`を指定しないと`all`を指定することと同じになり、全てのプロパティに適用されます。


##3.transition-timming-function
変化の仕方を設定するプロパティ。
個人的に最近知ったのでよく最初はよく分かりませんでした。
指定できる値が多く覚えるのが大変ですが頑張りましょう（自分に向けて）。


| 値 |     説明   |
|:-----------------:|:------------------|
|ease(デフォルト)| 開始時と終了時は緩やかに変化。|
|linear|開始から終了まで一定の変化。|
|ease-in |開始時は緩やかに、終了時に近づくにつれ速く変化。|
|ease-out|開始時は速く、終了に近づくにつれ緩やかに変化。ease-inの逆|
|ease-in-out|開始時と終了時はとても緩やかに変化。|
|cubic-bezier|変化の度合いを3次ベジェ曲線で指定。|

`transition-timing-function`を指定しない場合は、全て`ease`が適用されている状態となります。
たくさんあって覚えづらいですが、easeは「**緩やか**」と覚えておけばなんとかなるはず。

`cubic-bezier`は**3次ベジェ曲線**と呼ばれるちょいムズな線で変化を決めるものなので、余裕があったら覚える程度でいいと思います。
GoogleChromeのデベロッパーツールを使用するとこの線がどんなものか触って確かめることができますが、今回は割愛します。

###表示結果
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="fumu238" data-slug-hash="BaNZVQx" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="timing-function">
  <span>See the Pen <a href="https://codepen.io/fumu238/pen/BaNZVQx">
  timing-function</a> by fumu (<a href="https://codepen.io/fumu238">@fumu238</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
※要素のどこにホバーしても一斉に変化します。
5つ全て`transition-duration`は3sを設定していますが、かなり変化の仕方に差が出ているのが分かります。
なんなら絶対これ3秒以上かかってるだろみたいなものもありますが、全て3秒です、多分。

自分の好みや、目的によって使い分けをしていくことで実践的に使えるようになりたいところです。

##4.transition-delay
変化が始まるまでの時間を指定するプロパティ。
時間差で規則的な変化をつけたい場合などに有効かと思われます。

時間を指定するので[transition-duration](#2transition-duration)と同じくs(秒)またはms（ミリ秒）で指定できます。

##表示結果
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="fumu238" data-slug-hash="rNVwKGa" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="rNVwKGa">
  <span>See the Pen <a href="https://codepen.io/fumu238/pen/rNVwKGa">
  rNVwKGa</a> by fumu (<a href="https://codepen.io/fumu238">@fumu238</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
※要素のどこにホバーしても一斉に変化します。
上から順に0.1秒ごと加算しているので、規則正しく順番に変化していきます。
これと`transition-delay`と`transform`などを組み合わせると面白い変化をするオブジェクトを作れそうです。

##おわりに
CSSにで簡単にアニメーションができるようになるtransitionの使い方まとめでした。
これをいかに他のCSSと組み合わせていい感じの変化にできるかが大事かと思います。
とにかく試しまくって覚えていくしかありませんね。