たくさんあるCSSの中央揃えの方法をまとめた

## はじめに
CSSでスタイリングするときに必ずと行っていいほど登場するのが中央揃えです。

上下、左右、もしくはその両方を実現するために、いろいろな方法があります。

今回はその方法について網羅的にまとめました。

## 左右中央揃え

### Flexboxを使う方法
#### 概要
`display: flex;`
`justify-content: center;`
の2つの設定値で実現できます。

ほとんどすべての要素に適用可能です。
（ブロック要素、インライン要素、テキスト、画像など）

#### 実装例
```css:index.css
.container {
  display: flex;
  height: 150px;
  background-color: #f0fca6;
  justify-content: center;
}
.item {
  padding: 20px;
  margin: 10px;
  height: 50px;
  background-color: #3498db;
  color: white;
}
```

```html:index.html（bodyタグ内のみ抜粋）
  <body>
    <div class="container">
      <div class="item">これは左右中央揃えされています</div>
    </div>
  </body>
```
##### 実装のポイント
左右中央揃えにしたいコンテンツの親要素に対してFlexboxのスタイルを適用します。

#### 実際のレイアウト
親要素内で子要素が左右中央揃えになっていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251137/46b4cd0d-86db-17ab-c30c-459d447a15a6.png)

### Grid Layoutを使用する方法
#### 概要
`display: grid;`
`justify-items: center;`
の2つの設定値で実現できます。

ほとんどすべての要素に適用可能です。
（ブロック要素、インライン要素、テキスト、画像など）

#### 実装例
```css:index.css
.container {
  display: grid;
  height: 150px;
  background-color: #f0fca6;
  justify-items: center;
}
.item {
  padding: 20px;
  margin: 10px;
  height: 50px;
  background-color: #3498db;
  color: white;
}
```

```html:index.html（bodyタグ内のみ抜粋）
  <body>
    <div class="container">
      <div class="item">これは左右中央揃えされています</div>
    </div>
  </body>
```
##### 実装のポイント
左右中央揃えにしたいコンテンツの親要素に対してGrid Layoutのスタイルを適用します。

#### 見た目
親要素内で子要素が左右中央揃えになっていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251137/a7359947-bf19-1d8a-203b-1eb909686ecf.png)


### 位置を計算する方法
#### 概要
要素の位置を絶対値から計算することで、左右中央揃えにします。
ほとんどすべての要素に適用可能ですが、単一の要素にしか使えません。

#### 実装例
```css:index.css
.container {
  position: relative;
  height: 150px;
  background-color: #f0fca6;
  justify-items: center;
}
.item {
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  padding: 20px;
  margin-top: 10px;
  height: 50px;
  background-color: #3498db;
  color: white;
}
```

```html:index.html（bodyタグ内のみ抜粋）
  <body>
    <div class="container">
      <div class="item">これは左右中央揃えされています</div>
    </div>
  </body>
```
##### 実装のポイント
左右中央そろえにしたいコンテンツの親要素に対して`position: relative;`を指定します。
これにより、子要素の配置の基準点を作ります。

子要素に対しては3つのスタイルを適用します。
`position: absolute;`で要素の配置を自由にできるようにします。
`left: 50%;`で子要素の左端が、親要素の中心へくるようにします。
`transform: translateX(-50%)`で子要素自身の幅の半分だけ、左側に移動させます。

これにより、親要素に対して左右中央揃えにすることができます。

#### 見た目
親要素内で子要素が左右中央揃えになっていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251137/29aa2a5f-5d83-0db6-31b3-d41975717f43.png)

### marginを使用する方法
#### 概要
`margin:auto;`を設定することで、左右からの余白を自動計算し、中央揃えにします。
ブロック要素にしか適用できません。

#### 実装例
```css:index.css
.container {
  height: 150px;
  background-color: #f0fca6;
}
.item {
  margin-top: 10px;
  margin-left: auto;
  margin-right: auto;
  padding: 20px;
  width: 280px;
  height: 50px;
  background-color: #3498db;
  color: white;
}
```

```html:index.html（bodyタグ内のみ抜粋）
  <body>
    <div class="container">
      <div class="item">これは左右中央揃えされています</div>
    </div>
  </body>
```
##### 実装のポイント
`margin-left: auto;`
`margin-right: auto;`
で左右のマージンを自動計算としていることです。

`margin`は上下、左右をまとめて指定することができるので、
`margin: 10px auto;`
のような指定もできます。

#### 見た目
親要素内で子要素が左右中央揃えになっていることがわかります
注目すべき点は、ブロック要素のみが左右中央になっているだけで、`div`タグ内のテキストには適用されていないことです。

これは、marginが`div`タグの外側に対して設定されているので、中のテキストはその影響を受けないためです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251137/53e3bfc6-239a-35e1-ad3e-e5d376b538f6.png)

### text-alignを使用する方法
#### 概要
`text-align: center`を使って、内部のインラインコンテンツを左右中央揃えします。
ブロック要素には適用できません。

#### 実装例
```css:index.css
```

```html:index.html（bodyタグ内のみ抜粋）
```
##### 実装のポイント
左右中央揃えにしたい親コンテンツに`text-align: center;`を指定します。
また、`div`はブロック要素なので本来適用できませんが、`display: inline-block;`を指定することで、インラインブロックに変更し、適用対象としています。

#### 見た目
親要素内で子要素が左右中央揃えになっていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251137/8babe35f-a817-5f79-98b0-3500ac4f09fd.png)

左右中央揃えを設定する方法は以上です。

## 上下中央揃え
### Flexboxを使う方法
#### 概要
`display: flex;`
`align-items: center;`
の2つの設定値で実現できます。

ほとんどすべての要素に適用可能です。
（ブロック要素、インライン要素、テキスト、画像など）

#### 実装例
```css:index.css
.container {
  display: flex;
  height: 300px;
  background-color: #f0fca6;
  align-items: center;
}
.item {
  padding: 20px;
  margin: 10px;
  height: 50px;
  background-color: #3498db;
  color: white;
}
```

```html:index.html（bodyタグ内のみ抜粋）
  <body>
    <div class="container">
      <div class="item">これは上下中央揃えされています</div>
    </div>
  </body>
```
##### 実装のポイント
上下中央揃えにしたいコンテンツの親要素に対してFlexboxのスタイルを適用します。

#### 実際のレイアウト
親要素内で子要素が上下中央揃えになっていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251137/41179c28-195c-e09e-87e0-c89c5fe99fca.png)

### Grid Layoutを使用する方法
#### 概要
`display: grid;`
`align-items: center;`
の2つの設定値で実現できます。

ほとんどすべての要素に適用可能です。
（ブロック要素、インライン要素、テキスト、画像など）

#### 実装例
```css:index.css
.container {
  display: grid;
  height: 300px;
  background-color: #f0fca6;
  align-items: center;
}
.item {
  padding: 20px;
  margin: 10px;
  height: 50px;
  width: 280px;
  background-color: #3498db;
  color: white;
}
```

```html:index.html（bodyタグ内のみ抜粋）
  <body>
    <div class="container">
      <div class="item">これは上下中央揃えされています</div>
    </div>
  </body>
```
##### 実装のポイント
上下中央揃えにしたいコンテンツの親要素に対してGrid Layoutのスタイルを適用します。

#### 見た目
親要素内で子要素が上下中央揃えになっていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251137/06d3e4fe-b100-d57f-da5d-4f5a2eb89c90.png)



### 位置を計算する方法
#### 概要
要素の位置を絶対値から計算することで、上下中央揃えにします。
ほとんどすべての要素に適用可能ですが、単一の要素にしか使えません。

#### 実装例
```css:index.css
.container {
  position: relative;
  height: 300px;
  background-color: #f0fca6;
  justify-items: center;
}
.item {
  position: absolute;
  top: 50%;
  transform: translatey(-50%);
  padding: 20px;
  height: 50px;
  background-color: #3498db;
  color: white;
}
```

```html:index.html（bodyタグ内のみ抜粋）
  <body>
    <div class="container">
      <div class="item">これは上下中央揃えされています</div>
    </div>
  </body>
```
##### 実装のポイント
上下中央そろえにしたいコンテンツの親要素に対して`position: relative;`を指定します。
これにより、子要素の配置の基準点を作ります。

子要素に対しては3つのスタイルを適用します。
`position: absolute;`で要素の配置を自由にできるようにします。
`top: 50%;`で子要素の上端が、親要素の中心へくるようにします。
`transform: translateY(-50%)`で子要素自身の高さの半分だけ、上側に移動させます。

これにより、親要素に対して上下中央揃えにすることができます。

#### 見た目
親要素内で子要素が上下中央揃えになっていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251137/a4f5015e-0432-a23e-f715-8ef7d9d587dc.png)


### line-heightを使用する方法
#### 概要
行の高さを、親要素の高さと同じにすることでテキストを上下中央揃えにします。
単一行のテキストにしか適用できません。

#### 実装例
```css:index.css
.container {
  height: 300px;
  background-color: #f0f0f0;
}
.item {
  line-height: 300px; /* コンテナの高さと同じ値 */
  background-color: #1abc9c;
  color: white;
}
```

```html:index.html（bodyタグ内のみ抜粋）
  <body>
    <div class="container">
      <div class="item">これは上下中央揃えされています</div>
    </div>
  </body>
```
##### 実装のポイント
親要素の高さと`line-height`の高さを一致させます。

#### 見た目
テキストが上下中央揃えになっていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251137/675f0b46-7a05-47d8-bb82-9be81e58d5e0.png)

## まとめ
左右中央揃え、上下中央揃えの方法についてまとめました。
2つを組み合わせることで、上下左右の中央揃えも可能です。

個人的にはFlexboxでスタイルを適用するのが一番わかりやすく、汎用性が高いと思っています。

それぞれの要件に合わせて柔軟に使い分けられるようにしたいですね。