Grid Layout の特徴とその使い方。


## 概要

長い間、Windows OSに標準で付いていたInternet Explorer （通称 IE）。

マイクロソフト社が2022年6月15日IEのサービス終了を発表しました。

それに伴い、多くのWebサービスを開発している企業・個人が
今までIEにも対応しないといけないからと使うのを躊躇していたCSSプロパティを
勉強しはじめたと思います。

僕もその1人です。

この記事では、IEのサービス終了を機によく使われるようになるであろう**Grid Layout**の特徴と具体的な使い方について。

## Grid Layout とは何か
Grid Layoutは、列と行を定義する水平線と垂直線の集合が交差したものをCSSで表現したものになります。


**【Grid Layoutの基本形】**

<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="zYPxJyQ" data-user="sp_degu" 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/sp_degu/pen/zYPxJyQ">
  Untitled</a> by でぐぅー | Qiita (<a href="https://codepen.io/sp_degu">@sp_degu</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

1. グリットに置くアイテムの親要素(.wrapper)に`display: grid`を入力する
1. グリッドレイアウトの列数（`grid-template-columns`）・行数(`grid-template-rows`)・カラムの大きさを決める 

`grid-template-columns`は、 列のwidthと列の数同時に指定することができます。 (`grid-template-rows`も同様です。)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/0a38ef21-6f5c-d81d-b78c-0363397505a8.png" width="650px" />

<br>

## Grid Layoutの特徴
Grid Layoutの特徴は以下の通りです。

1. 固定サイズの要素と可変サイズの要素を組み合わせたレイアウトが簡単に作成できる
1. グリットに置くアイテムの位置を制御できる
1. 同じグリットの中に複数のアイテムを入れることができる

### 固定サイズの要素と可変サイズの要素を組み合わせたレイアウトが簡単に作成できる
Grid Layoutで、固定サイズの要素と可変サイズの要素を組み合わせができるようになったのは
Grid Layoutで使える単位 `fr` があるからです。

**frとは？**
`fr` は、親要素の利用可能な余白の比率を表すことができます。

**例えば**
親要素のwidthが1000pxで、親要素に`grid-template-columns: 500px 1fr 1fr;`と指定すると
1行目は500pxの固定幅になるので、のこり500pxを1:1で分割することになります。
そのため、 1行目は500px、3行目は250px、3行目は250pxのwidhtになります。
![スクリーンショット 2022-03-06 16.12.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/5de5f2ef-2dc2-8e2c-07e6-75653d1fd387.png)


このように、`fr`を駆使することで、固定サイズの要素と可変サイズの要素を組み合わせたレイアウトが簡単に作成できます。


### グリットに置くアイテムの位置を制御できる
Grid Layoutで、グリットに置くアイテムの位置を制御できるようになったのは、
各エリアの名前を定義する`grid-template-areas`とアイテムをエリアに配置する`grid-area`があるからです。

**grid-template-areasとgrid-areaとは？** 
grid-template-areasとは、`grid-template-columns`と`grid-template-rows`で指定したエリアにそれぞれ、名前を定義するCSSプロパティです。
grid-areaとは、`grid-template-areas`で定義したエリアにアイテムを配置するCSSプロパティです。

**例えば**
<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="MWOxrbP" data-user="sp_degu" 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/sp_degu/pen/MWOxrbP">
  grid areas</a> by でぐぅー | Qiita (<a href="https://codepen.io/sp_degu">@sp_degu</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

`grid-template-rows: 50px 200px 50px;`と`grid-template-columns: 100px 1fr 100px;`を指定して、↓こんな感じのレイアウトを作成し、`grid-template-areas`でそれぞれのグリットの名前を定義しています。

各アイテムのスタイルに`grid-area: エリア名；`エリア名の位置に配置しています。
隣接している同じ名前のエリアは、エリアを結合して、配置できます。 （L型）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/fc0b2341-9a26-463c-2c82-b78560ddd953.png" width="650px" />


### 同じグリットの中に複数のアイテムを入れることができる
Grid Layoutで、同じグリットの中に複数のアイテムを入れることができるようになったのは、
アイテムを配置する位置を指定する`grid-column`(grid-column-end・grid-column-start)や`grid-row`(grid-row-end・grid-row-start)があるからです。

**grid-column・grid-rowとは？**
`grid-column`・`grid-row`では、グリッド線を基準に位置を決めることができます。

３x２のグリッドには、4本の縦グリット線と3本の横グリット線があります。
グリット線は、番号が振られており、縦グリット線は左から、横グリット線は上から１、２、3となっています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/9cd61cbd-e55a-87db-ef4e-fb63644bef54.png" width="650px" />


**例えば**
<p class="codepen" data-height="300" data-default-tab="css,result" data-slug-hash="ZEaPrEE" data-user="sp_degu" 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/sp_degu/pen/ZEaPrEE">
  grid line</a> by でぐぅー | Qiita (<a href="https://codepen.io/sp_degu">@sp_degu</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

item1のように、`grid-column: 1 / 3;` `  grid-row: 1;`と指定してあげることで、
縦グリット線1番から3番まで、縦グリット線1番の位置に配置することができます。

それを応用すると、上のように同じグリット内に複数のアイテムを配置することが可能です。


## まとめ
この記事では、IEのサービス終了を機によく使われるようになるであろう**Grid Layout**の特徴と具体的な使い方について解説しました。

今後、色々なサイトでGrid Layoutを使っていただけると嬉しいです。

---

最後まで読んでくださってありがとうございます！

X(Twitter)でも情報を発信しているので、良かったらフォローお願いします！

https://twitter.com/degudegu2510