【CSS】em?rem?pxしか知らないよ…となった未経験エンジニアの備忘録

# はじめに
<!-- 発端や概要を記載 -->
こんにちは、エンジニア2年目の嶋田です。
まずは、この記事を開いていただきありがとうございます！
CSSを扱う際、ピクセル（px）以外の単位も使われていますが、その違いや使い分けがわからないことで戸惑った経験はありませんか？

実際、私自身も初めて先輩が書いたCSSを見てpxしかわからず、どの単位をどのように使えば良いのか混乱したことがありました。
そこで今回は、CSSでよく使われる単位（em、rem、% など）についてまとめてみたいと思います。

# 目次
- [主な長さの単位一覧](#主な長さの単位一覧)
- [単位の定義](#単位の定義)
- [絶対値、相対値の違い](#絶対値相対値の違い)
- [絶対的な長さの単位【px】](#絶対的な長さの単位px)
    - [pxの使用例](#pxの使用例)
- [相対的な長さの単位](#相対的な長さの単位)
    - [【%】プロパティによって基準が違う](#プロパティによって基準が違う)
        - [%の使用例](#%の使用例)
    - [【emとrem】フォントサイズ基準](#emとremフォントサイズ基準)
        - [emの使用例](#emの使用例)
        - [remの使用例](#remの使用例)
    - [【vw、vh、vmin、vmax】ビューポート基準](#vw、vh、vmin、vmaxビューポート基準)
        - [vwとvhの使用例](#vwとvhの使用例)
        - [vminとvmaxの使用例](#vminとvmaxの使用例)
- [関連するCSSプロパティとの組み合わせ](#関連するcssプロパティとの組み合わせ)
- [レスポンシブデザインでの活用](#レスポンシブデザインでの活用)
- [px・%換算ツール](#px%換算ツール)
- [最後に](#最後に)


# 主な長さの単位一覧

| 単位 | 種類 | 意味                       |
|------|------|--------------------------|
| px   | 絶対値 | 1pxは1ドット              |
| %    | 相対値 | ※プロパティによって基準が異なる |
| em   | 相対値 | その要素のフォントサイズの○倍  |
| rem  | 相対値 | ルート要素のフォントサイズの○倍 |
| vw   | 相対値 | ビューポートの幅の○%          |
| vh   | 相対値 | ビューポートの高さの○%        |
| vmin | 相対値 | ビューポートの小さい側の○%     |
| vmax | 相対値 | ビューポートの大きい側の○%   |

# 単位の定義

## px（絶対値）
ピクセル（px）は、デバイスの1画素を表す絶対値の単位です。画面上で固定サイズを指定する際に使用されます。大きさを表す単位ではないので、 `1px = ○ミリ`とは決まっていません。

## %（相対値）
パーセンテージ（%）は、親要素の特定のプロパティに基づいて相対的なサイズを指定する相対値の単位です。プロパティによって基準が異なる点に注意が必要です。

## em（相対値）
emは、要素自体のフォントサイズに対する倍率を示す相対値の単位です。例えば、フォントサイズが16pxの要素で1emを使用すると、16pxと同じサイズになります。

## rem（相対値）
remは、ルート要素（通常はHTML要素）のフォントサイズに対する倍率を示す相対値の単位です。他の要素のフォントサイズに影響を受けないので、グローバルなサイズ指定に便利です。

## vw（相対値）
vwは、ビューポートの幅の割合を示す相対値の単位です。画面幅に対しての相対的なサイズ指定に使用されます。

## vh（相対値）
vhは、ビューポートの高さの割合を示す相対値の単位です。画面高さに対しての相対的なサイズ指定に使用されます。

## vmin（相対値）
vminは、ビューポートの短い側の幅（幅または高さ、小さい方）の割合を示す相対値の単位です。画面の縦横比を考慮したサイズ指定に使用されます。

## vmax（相対値）
vmaxは、ビューポートの長い側の幅（幅または高さ、大きい方）の割合を示す相対値の単位です。画面の縦横比を考慮したサイズ指定に使用されます。


# 絶対値、相対値の違い
絶対値は、他の要素に左右されず、常に同じ大きさで表示されるので要素のサイズや位置を正確に指定したい場合に使用すると良いです。
そして相対値は、元となる要素を基準に大きさが決まるため、元となる要素の大きさが変わると、相対値で指定した要素の大きさも変わります。よって、要素のサイズや位置を柔軟に変更したい場合に使用すると良いです。


## 絶対値
- 固定的な値
- 他の要素の単位や大きさに影響を受けない
- px、cm、mm、ptなど

## 相対値

- 可変的な値
- 他の要素の単位や大きさに影響を受ける
- em、rem、％、vwなど


# 絶対的な長さの単位【px】

px（ピクセル）は、デバイスの1画素を表す絶対的な単位です。Webページ上での要素のサイズや位置を固定的に指定するために使用されます。

## pxの使用例

### 要素のサイズ指定
```css
.element {
  width: 300px;
  height: 200px;
}
```
### テキストのフォントサイズ指定
```css
.text {
  font-size: 16px;
}
```

### 要素の位置指定
```css
.positioned-element {
  position: absolute;
  top: 50px;
  left: 20px;
}
```
### ボーダーの太さ指定
```css
.border-element {
  border: 2px solid black;
}
```
### マージンとパディング指定
```css
.spacing-element {
  margin: 10px;
  padding: 15px;
}
```
px単位は他の要素に影響を受けず、固定的な値を持つため、特定のサイズや位置を確実に指定したい場合に適しています。ただし、高解像度デバイスなどで表示が異なる場合があるため、レスポンシブデザインには注意が必要です！

## 相対的な長さの単位
### 【%】プロパティによって基準が違う

`%`（パーセント）は相対的な単位で、プロパティによって基準が異なります。要素の大きさや位置を親要素や他のプロパティに対する割合で指定するために使用されます。
### %の使用例
#### widthやheightプロパティの場合
```css
.container {
  width: 50%;
  height: 75%;
}
```
この場合、`.container`要素の幅は親要素の幅の50%、高さは親要素の高さの75%となります。

#### font-sizeプロパティの場合
```css
.title {
  font-size: 150%;
}
```
この場合、`.title`要素のフォントサイズは親要素のフォントサイズの150%となります。

#### marginやpaddingプロパティの場合
```css
.box {
  margin: 5% 10%;
  padding: 2% 3%;
}
```
この場合、`.box`要素のマージンは親要素の幅の5%、高さの10%分だけ空けられ、パディングは親要素の幅の2%、高さの3%に適用されます。

`%`単位は柔軟なレイアウトの構築に適しており、親要素のサイズに合わせて自動的に調整されるため、レスポンシブデザインに役立ちます。ただし、基準が異なるため、プロパティごとに使用される要素や効果を確認することが大切です。

## 【emとrem】フォントサイズ基準
emとremはどちらもフォントサイズを基準とした相対的な単位ですが、異なる要素を基準にして値が計算されます。

### emの使用例
emは、その要素自身のフォントサイズを基準として相対的な値を指定します。
```css
.parent {
  font-size: 16px;
}
.child {
  font-size: 1.2em; /* 親要素のフォントサイズの1.2倍 */
  margin: 0.5em;   /* 親要素のフォントサイズの0.5倍 */
}
```
この場合、`.child`要素のフォントサイズは親要素`.parent`のフォントサイズの1.2倍となります。
同様に、マージンも親要素のフォントサイズの0.5倍になります。

### remの使用例
remは、ルート要素（通常はhtml要素）のフォントサイズを基準として相対的な値を指定します。

```css
html {
  font-size: 16px;
}
.parent {
  font-size: 1.25rem; /* ルート要素のフォントサイズの1.25倍 */
  padding: 0.75rem;   /* ルート要素のフォントサイズの0.75倍 */
}
```
この場合、`.parent`要素のフォントサイズはルート要素htmlのフォントサイズの1.25倍となります。同様に、パディングもルート要素のフォントサイズの0.75倍になります。

emとremは共に相対的な単位であるため、親要素のフォントサイズが変わるとそれに合わせて要素のサイズも変わります。しかし、emは親要素を基準としているため、親子関係が深い場合にフォントサイズの継承が複雑になることがあります。一方、remは常にルート要素のフォントサイズを基準とするため、継承の影響を受けにくい特徴があります。

## 【vw、vh、vmin、vmax】ビューポート基準
vw、vh、vmin、およびvmaxは、ビューポートの幅と高さに対する相対的な単位です。これらの単位は、画面サイズに合わせて要素の大きさを調整するのに役立ちます。

- vw: ビューポートの幅の1%に相当します。つまり、画面の幅に対する割合で大きさを指定できます。
- vh: ビューポートの高さの1%に相当します。画面の高さに対する割合で大きさを指定できます。
- vmin: ビューポートの幅と高さのうち、小さい方の1%に相当します。画面サイズの小さい側に合わせて要素の大きさを調整できます。
- vmax: ビューポートの幅と高さのうち、大きい方の1%に相当します。画面サイズの大きい側に合わせて要素の大きさを調整できます。

### vwとvhの使用例
```css
.container {
  width: 50vw;
  height: 75vh;
}
```
この場合、`.container`要素の幅はビューポートの幅の50%、高さはビューポートの高さの75%となります。

### vminとvmaxの使用例
```css
.box {
  width: 40vmin;
  height: 60vmax;
}
```
この場合、`.box`要素の幅はビューポートの幅と高さのうち、小さい方の40%、高さは大きい方の60%となります。

これらの単位はレスポンシブデザインに特に有用であり、画面サイズに応じて要素の大きさを自動的に調整できるため、様々なデバイスに対応するウェブページを作成する際に重要です。

# 関連するCSSプロパティとの組み合わせ
異なる長さの単位を使用する際に、特定のCSSプロパティと組み合わせることで、より柔軟なデザインを実現することができます。以下にいくつかのプロパティとの組み合わせ例を紹介します。

## marginとpaddingと相対単位
マージンとパディングは、要素間のスペースや内部余白を設定する際によく使用されるプロパティです。これらのプロパティに相対的な単位（%、em、rem、vw、vhなど）を組み合わせることで、レスポンシブなスペーシングを実現できます。たとえば、以下のようなCSSコードが考えられます。

```css
.container {
  margin: 2em; /* 要素のフォントサイズに基づいたマージン */
  padding: 3vw; /* ビューポートの幅に基づいたパディング */
}
```

## フォントサイズと相対単位
フォントサイズを設定する際には、emやremを使用することで、テキストのサイズを相対的に制御することができます。例えば、次のようなスタイルが考えられます。

```css
.text {
  font-size: 1.2rem; /* ルート要素のフォントサイズに基づく相対的なフォントサイズ */
  line-height: 1.5em; /* テキスト行間の調整 */
}
```

## グリッドやフレックスボックスと相対単位
CSSのグリッドやフレックスボックスを使用してレイアウトを構築する際にも、相対的な単位が役立ちます。たとえば、以下のようなコードが考えられます。

```css
.grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(20%, 1fr)); /* グリッドの自動調整 */
}

.flex-container {
  display: flex;
  justify-content: space-between; /* 要素間のスペースを均等に配置 */
  align-items: center; /* 要素を垂直方向に中央揃え */
}
```

# レスポンシブデザインでの活用
レスポンシブデザインは、異なる画面サイズやデバイスに対応するための重要な手法です。長さの単位をうまく活用することで、コンテンツが異なるビューポートに適切に適応するデザインを実現できます。

## メディアクエリと相対単位
レスポンシブデザインを実現するためにメディアクエリを使用する際にも、相対的な単位が役立ちます。ビューポートの幅や高さに基づいてスタイルを調整することができます。以下は、メディアクエリ内で相対単位を使用する例です。

```css
@media screen and (max-width: 768px) {
  .mobile-text {
    font-size: 1.2rem; /* メディアクエリ内でフォントサイズを調整 */
    padding: 5vw; /* メディアクエリ内でビューポートの幅に基づくパディングを設定 */
  }
}
```
これらの例は、異なる長さの単位を異なるプロパティと組み合わせることで、柔軟でレスポンシブなデザインを実現する際に活用できるものです。プロジェクトの要件やデザインに合わせて、適切な組み合わせを選ぶことが重要です。


## レスポンシブなグリッドレイアウト
```css
.container {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); /* グリッドの自動調整 */
  gap: 2rem; /* グリッド間のスペーシング */
}
```
グリッドレイアウトをレスポンシブにするために、%単位ではなく固定値を基準にしながらも、最小最大値と間隔を指定してデザインが調整されるようにしています。

## レスポンシブなテキストスタイル
```css
.text {
  font-size: 2rem; /* フォントサイズの基本値 */
  @media screen and (max-width: 480px) {
    font-size: 1.5rem; /* モバイル用にフォントサイズを調整 */
  }
}
```
メディアクエリを使って、異なる画面幅に合わせてテキストのフォントサイズを調整する例です。

これらの例は、長さの単位とレスポンシブデザインの原則を組み合わせることで、さまざまなデバイスや画面サイズに対応するデザインを実現する手法を示しています。

# px・%換算ツール
rem, em, %などを使うところで、「ここは実質16pxにしたいけど何%??」みたいになることがあるかと思います。
その時にはぜひ以下を利用してみてください。
基準、つまり100%に相当するpx値を指定したら、あとは数値を入力するだけでpx値と%値を相互に換算してくれます。

<p class="codepen" data-height="300" data-default-tab="result" data-slug-hash="MWzNEeM" data-user="tusegela-the-sasster" 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/tusegela-the-sasster/pen/MWzNEeM">
  conversion tools</a> by shimada (<a href="https://codepen.io/tusegela-the-sasster">@tusegela-the-sasster</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


# 最後に

CSSの長さの単位について詳しく解説しました。ピクセル（px）から相対単位（%、em、rem、vw、vh）まで、それぞれの特徴や使いどころを理解することで、柔軟なデザインを実現する際に役立つと思います。
私自身も未経験のエンジニアとして、CSSの長さの単位について躓いたので備忘録として記録しました。ピクセル（px）から相対単位（%、em、rem、vw、vh）まで、初めて触れる方も含めて、理解が深まっていたら嬉しいです。
未経験からスタートしていますが、少しずつ知識を積み重ねていくことで、いつか成果を出すことができると信じています。これからも頑張ります！