CSS Grid Layoutのおさらい

気になっていたGrid Layoutを触る機会があったのでメモ

# Grid Layoutとは

> CSS グリッドレイアウトは、二次元グリッドシステムを CSS にもたらします。グリッドは、主要なページ領域や小さなユーザーインターフェース要素のレイアウトに利用できます。
MDNより

# Grid Layout

下記のようなhtml

```html

<div class="container">
  <div class="item-1">1</div>
  <div class="item-2">2</div>
  <div class="item-3">3</div>
  <div class="item-4">4</div>
  <div class="item-5">5</div>
  <div class="item-6">6</div>
  <div class="item-7">7</div>
  <div class="item-8">8</div>
  <div class="item-9">9</div>
</div>

```

## 3*3マスのGrid Layout

![css_grid](https://qiita-image-store.s3.amazonaws.com/0/178856/f9e268d6-ef25-d64d-8f9c-dc458c41a2b9.png)
)

```css
.container {
  display: grid;
  grid-template-rows: 80px 80px 80px;
  grid-template-columns: 80px 80px 80px;
}

.container {
  display: grid;
  grid-template: 80px 80px 80px / 80px 80px 80px;
}

.container {
  display: grid;
  grid-template: repeat(3, 80px) / repeat(3, 80px);
}
```

どれも同じになる

## 3*3だが画面幅まで揃えたい

![css_grid_auto-fill](https://qiita-image-store.s3.amazonaws.com/0/178856/07359914-8872-4e9f-1e02-31bf633c8b88.png)

```css
.container {
  background: #eee;
  display: grid;
  grid-template: repeat(3, 80px) / repeat(auto-fill, 80px);
}
```

ただレスポンシブで幅を縮めて、ピクセル幅によっては余白が生まれたりすることがある

![css_grid_autofill_2.png](https://qiita-image-store.s3.amazonaws.com/0/178856/f50748ad-5f2c-ee19-c0f2-a8dee7b1db1c.png)

## 幅をピクセルではなくパーセントで設定

```css

.container {
  background: #eee;
  display: grid;
  grid-template: 80px 80px 80px / 50% 80px 80px;
}
```

パーセントにすると我慢幅の％（この場合左側が常に50%）を維持する

![percent1.png](https://qiita-image-store.s3.amazonaws.com/0/178856/12ce8779-4efe-5a82-c668-25ecd8295d68.png)
![percent2.png](https://qiita-image-store.s3.amazonaws.com/0/178856/e15f0e7e-b2a6-fc98-6641-138bf93374ae.png)

**※ただ％の加算値が100以上になると突き抜けてしまう（画面幅を超えるため）**

## 比率で表示

```css

.container {
  background: #eee;
  display: grid;
  grid-template: 80px 80px 80px / 50% 1fr 2fr;
}

```

frはfraction（分数）この場合、columnsの残り50%を3等分してそれを1/3、2/3で分けている
そのため画面幅が変わっても比率は維持される

![fraction1](https://qiita-image-store.s3.amazonaws.com/0/178856/444e5539-3f2c-8024-e99a-f2632c28bcc7.png)

![fraction2](https://qiita-image-store.s3.amazonaws.com/0/178856/6790ae15-cedb-a699-bdf0-cb615aa1ca0f.png)

## 余白を設定したい

```css
.container {
  background: #eee;
  display: grid;
  grid-template: 80px 80px 80px / 50% 1fr 2fr;
  grid-gap: 10px 5px;
}
```

gridはpaddingやmarginと違い、rowsとcolumnsで考える
**※ブラウザによっては 接頭辞に```grid-``` をつける必要がある**

![grid-gap.png](https://qiita-image-store.s3.amazonaws.com/0/178856/cdf9549d-d4b1-c4f2-007d-2cdca8c9b245.png)

## 位置を調整したい

```css
.container {
  background: #eee;
  display: grid;
  grid-template: 80px 80px 80px / 50% 1fr 2fr;
}
.item-1 {
  background: hsl(300, 80%, 30%);
  grid-row: 3;
  grid-column: 3;
}
```

これで.item-1が右下rowで3行目、columnで3列目になる。

spanやareaのプロパティがあるがここでは割愛

### 右下からの番号でも配置が可能

```css
.container {
  background: #eee;
  display: grid;
  grid-template: 80px 80px 80px / 50% 1fr 2fr;
}
.item-1 {
  background: hsl(300, 80%, 30%);
  grid-row: -2;
  grid-column: -2;
}
```

### 数値ではなく変数で表す

```css
.container {
  background: #eee;
  display: grid;
  grid-template: 80px 80px 80px / 50% 1fr [item-1] 2fr;
}
.item-1 {
  background: hsl(300, 80%, 30%);
  grid-row: -2;
  grid-column: item-1;
}
```

![grid-area.png](https://qiita-image-store.s3.amazonaws.com/0/178856/000f6688-73e8-0467-f87a-76397e1121b6.png)

## 重なった場合z-index

```css
.container {
  background: #eee;
  display: grid;
  grid-template: 80px 80px 80px / 50% 1fr 2fr;
}
.item-1 {
  background: hsl(300, 80%, 30%);
  grid-row: 3;
  grid-column: 3;
}
.item-4 {
  background: hsl(200, 80%, 30%);
  grid-row: 2 / 4;
  grid-column: 3 / 4;
}
```

こうすると4が1に重なってしまい、1の上に表示させたい場合

![z-index_1.png](https://qiita-image-store.s3.amazonaws.com/0/178856/63019d31-521b-71cc-7759-adc83016f0d6.png)

```css
.container {
  background: #eee;
  display: grid;
  grid-template: 80px 80px 80px / 50% 1fr 2fr;
}
.item-1 {
  background: hsl(300, 80%, 30%);
  grid-row: 3;
  grid-column: 3;
  z-index: 0;
}
.item-4 {
  background: hsl(200, 80%, 30%);
  grid-row: 2 / 4;
  grid-column: 3 / 4;
}
```

```z-index: 0;```で一番上に表示される

![z-index_2.png](https://qiita-image-store.s3.amazonaws.com/0/178856/6e8530b2-a342-1c25-0fb0-511cd7f57913.png)

## areasを使って配置する

gridは名前を使用することで自由に配置ができる

```css
.container {
  background: #eee;
  display: grid;
  grid-template: 80px 80px 80px / 50% 1fr 2fr;
  grid-template-areas:
    "header header header1"
    "right-middle . left-middle"
    "footer footer footer";
  }
/*親要素にgrid-template-areasで名前を設定し、子要素にgrid-areaで名前を適用する*/
/*配置したくない箇所には.を設定する*/
.item-1 {
  background: hsl(300, 80%, 30%);
  grid-area: header;
}
.item-2 {
  background: hsl(300, 80%, 40%);
  grid-area: header1;
}
.item-3 {
  background: hsl(300, 80%, 50%);
  grid-area: right-middle;
}
.item-4 {
  background: hsl(200, 80%, 30%);
  grid-area: footer;
}
.item-5 {
  background: hsl(200, 80%, 40%);
  grid-area: left-middle;
}
```

![areas.png](https://qiita-image-store.s3.amazonaws.com/0/178856/ba5397c7-f9e4-a54b-0b0d-7a54b61b1e76.png)

## gridの幅からセルが飛び出してしまった

3*3だが画面幅まで揃えたいのときみたいにセルが飛び出してしまった

```css
.container {
  background: #eee;
  display: grid;
  grid-template: 80px 80px 80px / 80px 80px 80px;
  }
.item-1 {
  background: hsl(300, 80%, 30%);
  grid-row: 3 / 1;
}
.item-2 {
  background: hsl(300, 80%, 40%);
  grid-column: 3 / 1;
}
```

- 1の横に空白が生まれた
- 4～9が3×3グリッドから飛び出してしまった

![auto-flow1.png](https://qiita-image-store.s3.amazonaws.com/0/178856/c0040c49-662a-641c-a46b-5f007d12f39c.png)

```css
.container {
  background: #eee;
  display: grid;
  grid-template: 80px 80px 80px / 80px 80px 80px;
  grid-auto-flow: dense;/*grid-auto-flowプロパティで空いた隙間を自動で埋める*/
  }
.item-1 {
  background: hsl(300, 80%, 30%);
  grid-row: 3 / 1;
}
.item-2 {
  background: hsl(300, 80%, 40%);
  grid-column: 3 / 1;
}
```

![auto-flow2.png](https://qiita-image-store.s3.amazonaws.com/0/178856/b4f321e2-c728-f892-87f5-6ab48320621c.png)

```css
.container {
  background: #eee;
  display: grid;
  grid-template: 80px 80px 80px / 80px 80px 80px;
  grid-auto-flow: dense;
  grid-auto-rows: 80px;/*grid-auto-rowsもしくはgrid-auto-columnsプロパティではみ出したセルを設定する*/
*/
  }
.item-1 {
  background: hsl(300, 80%, 30%);
  grid-row: 3 / 1;
}
.item-2 {
  background: hsl(300, 80%, 40%);
  grid-column: 3 / 1;
}
```

![auto-flow3.png](https://qiita-image-store.s3.amazonaws.com/0/178856/28821eef-279b-b685-7139-f8b74970325f.png)

## レイアウトの配置

```css
.container {
  background: #eee;
  width: 300px;
  height: 500px;
  display: grid;
  grid-template: 80px 80px 80px / 80px 80px 80px;
  justify-content: space-between;
  align-content: center;
  }
```

justify-contentで横の配置、align-contentで縦の配置。text-alignと似ています。

![content.png](https://qiita-image-store.s3.amazonaws.com/0/178856/c03a1bf7-59e5-a17f-ad5d-f514b6d03a2d.png)