CSSのグリッドレイアウトでアドベントカレンダーを書いてみた🎄

## はじめに
[dipアドベントカレンダー](https://qiita.com/advent-calendar/2023/dip-dev)9日目の記事です！
某カ●ディで毎日お菓子が出てくるリアルアドベントカレンダーを買おうと思ったら売り切れてました・・・😢
アドベントカレンダーがないなら作ればいいじゃない。ということでCSSのグリッドレイアウトについて紹介しながらアドベントカレンダー風デザインのサンプルコードを書いてみようと思います！
なお、サンプルに使用している画像はCanvaの生成AIを、物語はChatGPT3.5を利用しました。
## まずは作ったものを・・・
まずはグリッドレイアウトを利用して作ったアドベントカレンダーをご覧ください🎉
各日付のカードをめくると物語が読める仕掛けになっています。

<p class="codepen" data-height="1000" data-default-tab="result" data-slug-hash="LYqqjGZ" data-editable="true" data-user="e-furusawa" 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/e-furusawa/pen/LYqqjGZ">
  Untitled</a> by Furusawa (<a href="https://codepen.io/e-furusawa">@e-furusawa</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## グリッドレイアウトとは何か
グリッドレイアウトは格子状に分割したレイアウトに要素を配置するためのCSSの機能です。
元々はグリッドシステムというデザイン手法をCSSでも扱えるようにしたものではないかと理解しています。
サンプルに示したデザインでは、おそらくフレックスボックスでも実現できるのではないかと思います。
しかし今年主要なブラウザで利用可能となったsubgridを利用することで、フレックスボックスでは実現できなかった柔軟なレイアウトが可能となりました。
グリッドレイアウトを子要素にも適用することで、子要素同士でレイアウトを合わせることが簡単になりました([参考](https://coliss.com/articles/build-websites/operation/css/about-css-subgrid.html))
JavaScriptで計算せずとも子要素内のグリッドアイテムの高さを隣接する子要素同士で合わせる事ができるのはグリッドレイアウトならではです。
## グリッドレイアウトにまつわるプロパティの概要
私はもともとdisplay:flexの申し子(自称)だったんですが、今回サンプルのコードを書くにあたりプロパティの多さとその理解に苦しみました。
苦しみの先にいいデザインといいコードは生まれると思うのでめげずに今後もグリッドレイアウトにチャレンジしていきます。
今後再度苦しむことになるであろう未来の私に向けてグリッドレイアウトにまつわるプロパティの概要を纏めようと思います。
### グリッドコンテナの定義に利用するプロパティ
- [grid](https://developer.mozilla.org/ja/docs/Web/CSS/grid)
  - すべてのグリッドプロパティを設定するためのショートハンド
- [grid-template](https://developer.mozilla.org/ja/docs/Web/CSS/grid-template)
  - グリッド構造とその行数と列数を定義する
- [grid-template-areas](https://developer.mozilla.org/ja/docs/Web/CSS/grid-template-areas)
  - 名前付きのグリッドエリアを定義する
- [grid-template-columns](https://developer.mozilla.org/ja/docs/Web/CSS/grid-template-columns)
  - グリッド内の列のサイズを設定する。ここでsubgridを指定すると、親要素の列のサイズから取得される。
- [grid-template-rows](https://developer.mozilla.org/ja/docs/Web/CSS/grid-template-rows)
  - グリッド内の行のサイズを設定する。ここでsubgridを指定すると、親要素の行のサイズから取得される。
### グリッドアイテムの配置に利用するプロパティ
- [grid-area](https://developer.mozilla.org/ja/docs/Web/CSS/grid-area)
  - グリッドアイテムに名前を割り当て、グリッド配置関連のプロパティで参照できるようにする
- [grid-column](https://developer.mozilla.org/ja/docs/Web/CSS/grid-column)
  - グリッド内でアイテムの列の配置を決定するショートハンド
- [grid-column-start](https://developer.mozilla.org/ja/docs/Web/CSS/grid-column-start)
  - グリッドアイテムの列の開始位置を定義する
- [grid-column-end](https://developer.mozilla.org/ja/docs/Web/CSS/grid-column-end)
  - グリッドアイテムの列の終了位置を定義する
- [grid-row](https://developer.mozilla.org/ja/docs/Web/CSS/grid-row)
  - グリッド内でアイテムの行の配置を決定するショートハンド
- [grid-row-start](https://developer.mozilla.org/ja/docs/Web/CSS/grid-row-start)
  - グリッドアイテムの行の開始位置を定義する
- [grid-row-end](https://developer.mozilla.org/ja/docs/Web/CSS/grid-row-end)
  - グリッドアイテムの行の終了位置を定義する
### 自動配置に利用するプロパティ
- [grid-auto-columns](https://developer.mozilla.org/ja/docs/Web/CSS/grid-auto-columns)
  - 明示的に定義されていない列のサイズを設定する
- [grid-auto-rows](https://developer.mozilla.org/ja/docs/Web/CSS/grid-auto-rows)
  - 明示的に定義されていない行のサイズを設定する
- [grid-auto-flow](https://developer.mozilla.org/ja/docs/Web/CSS/grid-auto-flow)
  - グリッド内の自動配置されるアイテムの位置を指定する
## 最後に
グリッドレイアウトに慣れると、漫画みたいなレイアウトやアイテムの多いポスターのようなレイアウトでも自由に柔軟に組むことができるようになると思います。
初めはグリッド上への配置や入れ子にした場合のグリッドの理解など難しいところもありますが、どんなレイアウトでもかかってこいなつよつよマークアップエンジニア(?)を目指して皆さんもぜひチャレンジしてみてください！
## 参考
- [グリッドレイアウトの基本概念](https://developer.mozilla.org/ja/docs/Web/CSS/CSS_grid_layout/Basic_concepts_of_grid_layout)
- [CSSのSubgridが全ブラウザ対応。Gridの入れ子の基本から応用までを完全理解する](https://zenn.dev/moneyforward/articles/css-subgrid-all-browsers)
- [CSSのサブグリッド（subgrid）の基礎知識と使い方、たった一行のCSSで複数カードの水平グリッドを簡単に揃えられる！](https://coliss.com/articles/build-websites/operation/css/about-css-subgrid.html)