GridLayoutをアニメーションさせたかった話

#ことの始まり
**ある日**
GridLayoutで要素を配置していくの楽でたのしー！
headerもfooterもSideBarもdiv地獄にならずに設置できていい感じに作れるのがいい。

…
………
…………

SideBarの幅を動的に広げたり狭めたりするのと連動して、広い方も幅が狭くなるように動いてほしいな…。
でも、gridLayoutってAnimationてできるんだろうか…。

という事から始まった、gridLayoutでAnimationさせてみたを今回やってみましょう。
##調べてみた
まずは、gridLayoutがAnimationさせれるかを調べてみましょう。
ブラウザごとによって対応しているかどうかの、[Can I](https://caniuse.com/)で調べてみます。

[grid animation](https://caniuse.com/#search=Grid%20animation)で検索してみます。
`grid-template-rows`と`grid-template-columns`に関するCSSプロパティの対応表がヒットしました。
これら2つはgridLayoutの縦幅を決めるプロパティですね。
対応表を見てみると、FireFoxだけ対応していて他の主要ブラウザは非対応状態です。

###こうすればできるらしい
ということで、実際にコードを書いて確認してみましょう。

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

Chromeで確認するとカクカクしていてAnimationしていません。
Firefoxで確認すると綺麗にAnimationしています。

##それでもアニメーションさせたい
GridLayoutの`grid-template-rows`と`grid-template-columns`をAnimationさせることは可能ということが解りましたが、
対応ブラウザが1つだけでは実践ではとてもじゃないが使えません。
~~ブラウザ毎にCSS変えるのってとてもめんどくｓ~~

ということで、なんとかシンプルでgridLayoutをAnimationさせれないか調べてみました。
そしたら、FireFox 66 以降のバージョンでAnimationさせる方法を解説している記事を見つけました。
その中にgridLayoutで別の方法を用いAnimationさせるやり方が記載されていました。

[New in Firefox 66: Animating CSS Grid](https://blog.logrocket.com/new-in-firefox-66-animating-css-grid-b4ed90ac32f5/)

その中の記事で、上記の方法の他に`grid-gap`を使う方法ともう要素の幅を変更することでの方法が書かれています。
まずは`grid-gap`の方から見ていきましょう。
###grid-gap

最初に、`grid-gap`が何かをMDNを確認してみましょう。
[grid-gap](https://developer.mozilla.org/ja/docs/Web/CSS/gap)
>CSS の gap プロパティは、行や列の間のすき間 (溝) を定義します。
>これは row-gap 及び column-gap の一括指定です。

`grid-gap`は行と列の隙間の幅を設定するプロパティですね。
上記の解説記事を参考に、`grid-gap`でAnimationさせてみた感じはこんなふうになりました。
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="css,result" data-user="okauend" data-slug-hash="YzzpoGZ" style="height: 400px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="gridLayout-gapAnimation">
  <span>See the Pen <a href="https://codepen.io/okauend/pen/YzzpoGZ">
  gridLayout-gapAnimation</a> by OKAUEND (<a href="https://codepen.io/okauend">@okauend</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

ChromeでもAnimationするようになりましたが、左右からせり出してくる感じのAnimationですね。
`grid-gap`は、列の隙間幅や行の隙間幅を設定することはできますが、
「n番目のラインの列側だけを設定したい」みたいな個別には対応していないので、今回私がやりたい事にはマッチしなさそうです。

###幅を指定してやってみる
解説記事の続きにある、「**How about other browsers?**」に要素の幅を実際に変更する方法があります。
記事を参考にコーディングしてみました。
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="css,result" data-user="okauend" data-slug-hash="gOOgOLX" 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="gridLayout-widthAnimation">
  <span>See the Pen <a href="https://codepen.io/okauend/pen/gOOgOLX">
  gridLayout-widthAnimation</a> by OKAUEND (<a href="https://codepen.io/okauend">@okauend</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

この方法だと、ChromeでもSideBarに当たる部分だけが綺麗にAnimationしますね。
FireFoxでも同くChromeと同じようにAnimationをしています。
ちなみにEdgeでも同じようにAnimationしています。
gridLayoutでAnimationさせたい場合は、この方法がどのブラウザでも適応できそうです。

#終わりに
今回はgridLayoutで無事Animationをすることができました。
`grid-template-rows`と`grid-template-columns`を用いてのAnimationは、現状ではFireFoxしか対応していないので、
Animationさせたい要素の幅を変更することで、どのブラウザでも適応できるAnimationの方法を学ぶことができました。

FireFoxが対応している、`grid-template-rows`と`grid-template-columns`の値を変更することでのAnimationも、
Chromeや他のブラウザでも対応してほしいところですが、実装予定の中には確認できなかったので、しばらくは対応しなさそうです。