10分ぐらいで理解するGrid Layout

みなさんこんにちは、まえんぬです
この記事は[Othlo Tech Advent Calendar 2018](https://qiita.com/advent-calendar/2018/othlotech)の14日目の記事です
cssでレイアウトが組めちゃうGrid Layoutについて解説します:point_up_tone1:

#はじめに
まずはこの2つの用語を頭にいれましょう

**グリッドコンテナー**
レイアウトする枠であり箱です（親要素）
**グリッドアイテム**
箱の中にいれるものです（小要素）

コードにするとこのようになります
（クラス名はわかりやすい名前で大丈夫です:ok_hand_tone1:）

```html
<!-- グリッドコンテナー -->
<div class="gd-container">
  <!-- グリッドアイテム -->
  <div class="gd-item gd-A">A</div>
  <div class="gd-item gd-B">B</div>
  <div class="gd-item gd-C">C</div>
  <div class="gd-item gd-D">D</div>
  <div class="gd-item gd-E">E</div>
</div>
```
実際のブラウザだとまだこんな感じ
（みやすくするためにcssで色とかつけました:thumbsup_tone1:）
![a1d85da1-e7a6-4ebb-86ab-543cea0b2779.png](https://qiita-image-store.s3.amazonaws.com/0/321040/c5ab0386-3891-4e66-019d-7760999ed432.png)

##グリッド化
このコードをグリッドレイアウトにするためグリッドコンテナーに`display: grid;`をいれてみましょう

```css
.gd-container{
  display: grid;
}
```
すると見た目には変化はありませんがグリッドレイアウトに関するプロパティが使えるようになります

##余白をつける
これまで余白をつけるときは`margin`や`padding`で行っていましたが
グリッドレイアウトではグリッドコンテナーに`gap`を指定することで余白をつけることができます

```css
.gd-container{
  gap: 10px;
}
```
↓こんな感じ！
![7afa7738-1ad4-45c5-8ff3-db458e342501.png](https://qiita-image-store.s3.amazonaws.com/0/321040/3ea7ff2c-058a-bd4d-a906-7cb98f0b9a55.png)

#レイアウトしてみる
レイアウトするときに使う2つのプロパティを紹介します
`grid-template-columns`　←列の幅を指定（値が高くなるほど横に大きくなる）
`grid-template-rows`　←行の幅を指定（値が高くなるほど高さが増える）

話が脱線するけどrowsとcolumns、どっちが縦で横なのかわからなくなったら頭文字を大文字にして穴をふさぐ線の向きで縦か横なのかわかるって母ちゃんが言ってた:thumbsup_tone1:

実際に使うとこんな感じ

```css:縦3×横2のレイアウト
.gd-container{
  grid-template-columns: 200px 400px;
  grid-template-rows: 200px 100px 300px;
}
```
![e05e1cce-8ec7-42ce-98f1-8447a014151e.png](https://qiita-image-store.s3.amazonaws.com/0/321040/64c5233f-14e4-6a85-e029-60da0c10c890.png)

じゃあ縦横あべこべにするには？:thinking:
こうです↓

```css:縦2×横3のレイアウト
.gd-container{
  grid-template-columns: 200px 100px 300px;
  grid-template-rows: 200px 400px;
}
```

![3d48c483-a62e-44a5-b87d-845177f30067.png](https://qiita-image-store.s3.amazonaws.com/0/321040/1b194cd3-2945-ad78-a0d1-1ec3627dc6b2.png)

つまり指定した値の数だけ行や列ができます
ちなみに`fr`というグリッドレイアウトのみで使える単位を使って比率で指定することもできます

##指定したグリッドアイテムの大きさを変えてみる
次はグリッドアイテムをドンと増やしたこれを使って説明します
![c57abc61-0a38-495a-86f2-b282bc27ad3f.png](https://qiita-image-store.s3.amazonaws.com/0/321040/3a652004-085e-2c15-290f-1f33a8d7707e.png)


CSSもせっかくなので`fr`を使ってみました

```css:縦3×横2のレイアウト
.gd-container{
  grid-template-columns: 1fr 1fr 1fr;
  grid-template-rows: 1fr 1fr 1fr 1fr;
}
```
ではグリッドアイテム「D」を縦横２個分の大きさにしましょう
使うのは`grid-row`と`grid-column`の２つ
変更した「D」のクラス`gd-D`にかけてあげましょう

```css
.gd-D{
  grid-column: 1/3;
  grid-row: 2/4;
}
```
値は何分の何ってみえますが
（**始まりの位置**）/（**終わりの位置**）という意味です

この位置のことを**ライン**と呼びます
ラインの数え方は汚い図だけどこんな感じ
青が`grid-column`、緑が`grid-row`です
周りの縁も含めることと、数字が１から始まるところに気をつけましょう:frowning2:
![wakariyasui.png](https://qiita-image-store.s3.amazonaws.com/0/321040/9d82369e-96c8-0e33-99ee-7f83f1e0228e.png)

ブラウザではこのように表示されます
![3522204e-4912-4aeb-bede-09ac7eb16b8f.png](https://qiita-image-store.s3.amazonaws.com/0/321040/90685f34-7f02-2b6d-d910-79e9bde88a61.png)
こんなランダムな大きさもグリッドレイアウトならわりと簡単にできちゃいます
![430b2392-738f-4418-a434-90e4cb1857bf.png](https://qiita-image-store.s3.amazonaws.com/0/321040/dbb8ff8e-2a35-02df-49bd-82918ecdab95.png)

#終わりに
今までFlexBoxだとめんどくさかったレイアウト作成もGridLayoutを使えば結構簡単にできることがわかりました

ちなみに今回、アドベントカレンダー7日目の「[Animate.cssで遊んでみた](https://qiita.com/AsukaOkochi/items/cf4a31821de8e3fffd04)」の記事をかかれた「きなこ」さんに誘われ、はじめてqiitaに記事をかいてみました
私はこの記事をかく前まではGridLayoutに関しては名前しか知らなかったのですが
記事をかき終わった今ではもう実際に使えそうな気がします
そう考えると学んだことを記事にするのはいいことだとわかりました

あと、もしよかったら「いいね」を押してください
いいねがつくたびに私「まえんぬ」が喜び、腕立て伏せ10*3セットがんばります:muscle_tone1::smiley:

ここまで読んでくださって本当にありがとうございました！