CSS の値と単位
=========

* 前のページ
* Overview: Building blocks
* 次のページ

CSS で使用されるすべてのプロパティには、特定の値または組み合わせのみが許可されており、MDN の各プロパティに関するページでは有効な値を理解するのに役立ちます。このレッスンでは、もっとも一般的な値と単位について見ていきます。

| 前提条件: | 基本的なコンピューターリテラシー、基本的なソフトウェアがインストールされていること、ファイルの扱い、HTML の基本（HTML 入門）および CSS の動作概念（CSS の第一歩）に関する基本的な知識を得ている。 |
| --- | --- |
| 目的: | CSS プロパティで使用されるさまざまな種類の値と単位について学ぶ。 |

CSS での値とは？
----------

CSS の仕様や MDN のプロパティページでは、`<color>` や `<length>` のような角括弧で囲まれた値を見つけることができます。`<color>` の値がその特定のプロパティとして妥当なとき、ここではそのプロパティの妥当な色を表していることを意味しています。具体的な値は `<color>` のリファレンスページを参照してください。

**メモ:** *データタイプ* を参照する CSS の値を確認しましょう。これは、基本的に交換可能です — データタイプとして参照する、CSS であなたが見るものは装飾のための値を示しています。

**メモ:** CSS の値は<>括弧で示すことが多く、CSS のプロパティによって違います(例えば`color` プロパティや <color> データタイプがあります)。CSS のデータタイプ型と HTML の要素は違いますので、混乱しないでください。両方とも<>括弧を使います　— しかしそれらを使用するコンテキストは全く異なります。

次の例では、キーワードを使用して章立ての色を設定し、かつ背景色を `rgb()` 関数を使って指定します。:


```css
h1 {
  color: black;
  background-color: rgb(197, 93, 161);
}
```


CSS の値は指定可能なサブ値の集合を定義します。これは、`<color>` が妥当な箇所では、異なる種類の色の値、キーワード、16 進数、`rgb()` 関数などで設定できるかどうか考える必要はありません。あなたのブラウザーがサポートしていると仮定できる、*あらゆる* 利用可能な `<color>` の値が指定できます。MDN のページはそれぞれのブラウザーがサポートしている値の情報を提供します。例えば、`<color>` のページには、ブラウザーの互換性のセクションがあり、サポートされているそれぞれの種類を見られます。

ここでは見ることが多いいくつかのタイプの値や単位を確認しましょう。また例のさまざまな値を変えて試しましょう。

数値・長さ・割合
--------

CSS では数値データ型をいくつかみるでしょう。次のものは数値に分類されています。:

| データタイプ | 説明 |
| --- | --- |
| `<integer>` | `<integer>` (整数)は、`1024` や `-55` のようなすべての整数です。 |
| `<number>` | `<number>` (数)は 10 進数です。小数点のあるものとないものがあります。例えば、`0.255`、`128` や `-1.2` です。 |
| `<dimension>` | `<dimension>` (寸法)は `<number>` に付属するものです。例えば、`45deg`, `5s`, それに `10px` です。`<dimension>` には `<length>` (長さ), `<angle>` (角度), `<time>` (時間), さらに `<resolution>` (解像度)型があります。. |
| `<percentage>` | `<percentage>` (パーセント)は他の値との割合を表します。例えば、`50%`. この値は常に他の量との相対比です。例えば、ある要素の長さは、その親要素の長さが関連しています。 |

### Lengths(長さ)

数値型でもっともよく遭遇するのは、`<length>`です。例えば、`10px` (ピクセル) や `30em` です。CSS で使用される長さの種類は二つに分けられます。relative(相対)と absolute(絶対)です。この違いを理解することは非常に重大です。

#### 絶対長の単位

次の単位はすべて **absolute** length units(絶対的な長さの単位) です。この単位は、他の長さとの関係で決まりません。一般的にこの単位は常に同じサイズと考えられます。

| Unit | 名前 | 換算 |
| --- | --- | --- |
| `cm` | Centimeters センチメートル | 1cm = 96px/2.54 |
| `mm` | Millimeters ミリメートル | 1mm = 1/10 cm |
| `Q` | Quarter-millimeters 1/4 ミリメートル | 1Q = 1/40 1cm |
| `in` | Inches インチ | 1in = 2.54cm = 96px |
| `pc` | Picas パイカ | 1pc = 1in の 1/6 |
| `pt` | Points ポイント | 1pt = 1in の 1/72 |
| `px` | Pixels ピクセル | 1px = 1in の 1/96 |

これらの値は印刷には便利ですが、画面出力には向いていません。私たちは、スクリーン上の長さに、例えば `cm` (センチメートル)を使いません。よく使用するのは `px` (pixels/ピクセル)になります。

#### 相対長の単位

Relative length units (相対的な長さの単位) は、何かとの比較によってサイズが決まります。それは、例えば、親要素のフォントサイズかもしれませんし、ビューポート(画面幅)かもしれません。この相対的な長さ単位はが便利なのは、それを作成するときにいくつかの点に注意して、そのページ内のテキストのサイズや他の要素の相対的なサイズで作成したときです。次の表にウェブ開発で便利な単位を紹介します。

| 単位 | 関係先 |
| --- | --- |
| `em` | `font-size` のようなタイポグラフィについての特性の場合は親のフォントサイズ、`width` のような他の特性の場合は要素自体のフォントサイズ。 |
| `ex` | その要素のフォントの文字 "x" の高さ。 |
| `ch` | その要素のフォントの文字 "0" の advance measure（幅）。 |
| `rem` | ルート要素のフォントサイズ。 |
| `lh` | その要素の行の高さ。 |
| `rlh` | ルート要素の行の高さ。ルート要素の `font-size` または `line-height` プロパティに使用する場合、プロパティの初期値を参照する。 |
| `vw` | ビューポート幅の 1%。 |
| `vh` | ビューポート高さの 1%。 |
| `vmin` | ビューポート幅と高さの小さい方の 1%。 |
| `vmax` | ビューポート幅と高さの大きい方の 1%。 |
| `vb` | ルート要素のブロック方向に、最初に含むブロックの大きさの 1%。 |
| `vi` | ルート要素のインライン方向に、最初に含まれるブロックの大きさの 1%。 |
| `svw, svh` | それぞれ、small viewportの幅と高さの 1%。 |
| `lvw, lvh` | それぞれ、large viewportの幅と高さの 1%。 |
| `dvw, dvh` | それぞれ、dynamic viewportの幅と高さの 1%。 |

#### 試してみる

次の例で、絶対的な長さの単位と相対的な長さの単位の振る舞いの違いを確認しましょう。最初のボックスには `width` がピクセル単位で指定されています。 絶対単位なので、この幅は他の何が変わっても同じままです。

二番目のボックスは相対的な長さの単位の、ビューポート幅に関連した `vw` を使用しています。この値は、ビューポート幅と関連しており、10vw は ビューポート幅の 10% にあたります。もしブラウザー幅を変化させた場合、このボックスのサイズは変化します。しかし、このページは `<iframe>` に埋め込んであるため、次の例は動作しません。この動作を確認するには、このリンクをブラウザーの別タブで開いて、例を確認してください。

三番目のボックスは `em` 単位を使います。この単位はフォントサイズに関連しています。`1em` にあたるフォントサイズ設定は `<div>`で指定してあります。これは`.wrapper` クラスがあります。 この値を 1.5em に変更すると、すべての要素のフォントサイズが増加しますが、最後の項目のみ width がフォントサイズに相対的であるため、最後の項目のみが広くなります。

上の手順を行った後で、これらの値を変更してどのようにふるまうかを確認してください。

#### em と rem

`em` と `rem` は開発者がボックスやテキストまですべてのサイズを変更するときによく遭遇する相対的な長さの単位です。これらがどのように動作するか、どのように違いがあるかを理解しましょう。特にスタイルテキスト や CSS レイアウトのようなより複雑なテーマを扱うようになったときに価値があります。以下の例は、デモを提供しています。

この HTML はネストしたリストの組です。全部で 3 つのリストがあり、どちらも同じ HTML です。唯一異なるのは、最初のものは *ems* クラスを持っており、二つ目のものは *rems* クラスを持っていることです。

始めるにあたって、`<html>` 要素のフォントサイズを 16px に指定しました。

**要約すると、em 単位は活字で言えば「私の親要素のフォントサイズ」を意味します。**`ems` の `class` を持つ `<ul>` 内の `<li>` 要素は、親要素からサイズを受け取ります。そのため、入れ子の各レベルは、それぞれのフォントサイズが `1.3em` (親のフォントサイズの 1.3 倍)に設定されているため、徐々に大きくなっていきます。

**要約すると、この rem 単位は活字でいえば、「ルート要素のフォントサイズ」を意味します。**(rem は"root em"を意味します) この `rems` の `class` を持つ `<ul>` の内部の `<li>` 要素はルート要素(`<html>`)からサイズ情報を取得します。 これは、ネストの各レベルが大きくなり続けないことを意味します。

ただし、CSS で `<html>` の `font-size` を変更すると、その他のすべて（ `rem` サイズと `em` サイズの両方のテキスト）が相対的に変更されることがわかります。

### Percentages(パーセント)

多くの場合、percentage (パーセント)は length(長さ)と同じ方法で使用します。percentages のあるものは、ある他の値との相対的な値を設定します。例えば、あなたがある要素の `font-size` に percentage を設定した場合、その親要素の `font-size` のパーセントを意味します。もしある `width` の値に percentage を使用した場合、その親要素の `width` のパーセントに設定されます。

次の例では二つのパーセントでサイズ指定したボックスと、ピクセルでサイズ指定したボックスがあり、これらはそれぞれ同じクラス名を持っています。これは、それぞれ 200px と 40% の幅に設定されています。

ここで異なるのは、二番目のボックスは 400 ピクセル幅のラッパーの内側にあることです。200px で指定したボックスは、一番目と二番目が同じ幅になっています。しかし、二番目の 40%指定したボックスは違います。二番目のボックスは 400 ピクセルの 40% の幅になります。最初のものよりかなり狭くなっています。

**ラップするボックスの幅またはパーセントの値を変更してその影響を確認してください。**

次の例はフォントサイズをパーセントで指定しています。それぞれの `<li>` は 80% の `font-size` です。そのため、ネストしたリストはその親のサイズを継承するため、徐々にフォントサイズが小さくなっています。

注意: 多くの値には length(長さ) と percentage(パーセント)の両方を受け付けますが、中には length しか受け付けないものもあります。どのような値が受け付けられるかを確認するには、MDN プロパティリファレンスページを参照してください。許可される値が `<length-percentage>` の場合は length と percentage の両方を使用できます。しかし許可される値が `<length>` の場合、percentage は使用できません。

### Numbers(数)

一部の値は、単位のない数値を受け入れます。 単位のない数値を受け入れるプロパティの例は、要素の不透明度（透明度）を制御する `opacity` プロパティです。 このプロパティは、`0`（完全に透明）〜 `1`（完全に不透明）の数値を受け入れます。

**この下の例を見てください。`opacity` を `0` から `1` までの間の数に変えて、この箱とそのコンテンツがどのよう表示されるかを確認してください。**

**メモ:** CSS で値として数を使用する場合、その値を引用符で囲んではなりません。

色
-

CSS で色を指定する方法はたくさんありますが、その中には最近実装されたものもあります。テキストの色を指定する場合でも、背景の色を指定する場合でも、CSS ではどこでも同じ色の値を使うことができます。

最近のコンピューターで利用できる標準的な色のシステムは 24 ビットです。これは赤、緑、青のチャンネルでそれぞれ 256 の値を持てるため、およそ 1670 万色 (256 x 256 x 256 = 16,777,216) の色を指定できることになります。CSS で色を指定するさまざまな方法を見てみましょう。

**メモ:** このチュートリアルでは、普通のブラウザーがサポートしている、標準的な色の指定方法を見ていきます。他にも方法がありますが、それらはサポートされていないこともあり、標準的な方法ではありません。

### カラーキーワード

この学習の章や MDN でもよく例を見る方法にカラーキーワードがあります。これは色を指定する方法で非常に単純で理解しやすいものです。カラーキーワードは、その色の名前そのものを入力するだけです。このカラーキーワードのリストは `<color>` の値のページで確認できます。

**下の練習で別のカラーキーワードを試して、それがどのように作用するのか確認してください。**

### 16 進数 RGB

次のカラーの値の種類は、あたながよく遭遇する 16 進数を使うものです。それぞれの 16 進数の値には、ハッシュ記号(#) に続いて、6 個の 16 進数の数が続きます。この数には、0 から f までの 16 個の文字を使用します。(ここで f は 15 に相当) — つまり `0123456789abcdef` を使用します。この値の二文字はそれぞれ赤、緑、青のカラーチャンネルの値を表しています。そのため、16 x 16 = 256 つまり、それぞれのチャンネルに 256 通りの値を指定できます。

これらの値は少し複雑で、わかりにくいものです。しかし、16 進数はキーワードより多くの用途で使用されます。あなたのカラースキームで表す、好きな色を 16 進数で表現できるのです。

**もう一度、値を変更させてどのように色が変化するか確認しましょう。**

### RGB と RGBA

第三の方法として、RGB を説明します。RGB の値は関数 `rgb()` に渡して使います。この関数は、3 つのパラメータを受け取り、それぞれ、赤、緑、青のチャンネルの色の値として扱います。ちょうど 16 進数での表記とよく似ています。RGB は 2 つの 16 進数で表すのと違い 0 から 255 の 10 進数の数で指定します。こちらの方が少しわかりやすいです。

最後の表記を書き直して、RGB で表現してみましょう。

また、RGBA カラー方式もあります。これは、RGB カラー方式とまったく同じ方法で、RGB で表すすべての値を使用できます。しかし、RGBA は 4 つのパラメータをとり、4 番目のパラメータは色のアルファチャンネル、つまり色の不透明度(または透明度)を表します。この 4 番目のパラメータの値が `0` のとき完全な透明を表し、`1` のとき完全な不透明を表します。その間の値を指定してさまざまなレベルの透明度を指定できます。

**メモ:** 色でアルファチャンネルを設定することと、より前に学んだ、`opacity` プロパティで設定することの違いに注意しましょう。opacity プロパティで設定した場合、その要素と要素内のすべてが透明になります。一方、RGBA カラーを指定した場合、透明になるのはそのカラーだけです。

下記の例では、色付きの箱に含まれる背景画像を追加しました。そして箱にいろいろな透過値をセットしました — アルファチャンネルが小さくなるときに背景がどう表示されるか注意してみてください。

**この例では、アルファチャンネル値を変更してみて、色の出力にどう影響するのかを見ています。**

**メモ:** ある時点で、最新のブラウザーが更新され、rgba() と rgb()、そして hsl() と hsla() (後述) がお互いの純粋なエイリアスとなり、全く同じ動作をするようになりました。このため `rgba()` と `rgb()` の両方はアルファチャンネル値のある/ない色を受け入れています。上記の例の `rgba()` 関数を `rgb()` に変更して色が動作するのを見てください! どのスタイルを使うのかはあなた次第ですが、不透明と透明の色定義に別の関数を使うのは (とても) 少しブラウザーサポートが良くなって、コード内のどこで透明色を使っているかの目印になります。

### HSL と HSLA

RGB よりサポートがちょっと少ないのが HSL 色モデルです (IE の古いバージョンではサポートされません)、これはデザイナーの関心から実装されました。赤、緑、青の代わりに、`hsl()` 関数は 色相(hue), 彩度(saturation), 輝度(lightness) の値を取り、これは約 1670 万色を、別の方法で分別するのに使われます。

* **色相(Hue)**: 色のベースとなるシェード。これは 0 から 360 の値を取り、色相環の角度を表します。
* **彩度(Saturation)**: 色がどれだけ飽和しているか? これは 0–100% の値を取り、0 は色がなく (グレーのシェードに見える)、100% はフルカラーの飽和となります。
* **輝度(Lightness)**: 色がどれだけ明るいのか? これは 0–100% の値を取り、0 は明度がなく (完全な黒に見える)、100% はフルの明度です (完全な白となる)。

RGB の例を HSL の色に更新すると次のようになります:

RGB に RGBA があるように、HSL には同様な HSLA があり、アルファチャンネルの指定が同様にできます。デモとして RGBA の例を HSLA 色を使うようにしたものは次の通りです。

プロジェクトでどの色の値を使っても良いです。たいていのプロジェクトではカラーパレットを決めてから、この色（と決定した色指定の方法）を、プロジェクト全体を通して使います。色モデルを混用することもできますが、一貫させるために通常はプロジェクト全体で同じものを使うのがベストです!

画像
--

`<image>` データタイプは画像が妥当な値となる場合に使われます。これは `url()` 関数で指定される実際の画像ファイルか、グラデーションです。

下記の例では画像とグラデーションを CSS `background-image` プロパティに使っています。

**メモ:** `<image>` がとり得る他の値もありますが、それは新しくてブラウザーサポートが貧弱です。それについて知りたい場合、MDN の `<image>` データタイプのページを確認してください。

位置
--

`<position>` データタイプは 2 次元座標を表しており、背景画像のような項目 (`background-position` にて)の位置を決めるのに使われます。これは `top`, `left`, `bottom`, `right`, `center` のようなキーワードを取って、ボックスの上や左の隅からオフセットさせる長さの値とともに、2 次元のボックスの特定の境界にアイテムを揃えます。

典型的な位置の値は 2 つの値を持ち — 最初は水平位置を、2 つ目は垂直位置をセットします。1 つの軸だけの値を指定する場合、もう 1 つはデフォルトで `center` となります。

次の例では、背景画像をキーワードを使ってコンテナの右端の上から 40px の位置に配置しています。

**この値でいろいろ遊んでみて、画像がどう移動するか見てください。**

文字列と識別子
-------

上記の例を通じて、キーワードが値として使われる場所を見てきました (例えば、`<color>` キーワードの例として `red`, `black`, `rebeccapurple`, `goldenrod`)。このキーワードをより正確に述べると、CSS が理解できる特別な値の *識別子* です。このためそれは引用符で囲まれておらず、文字列として扱われません。

CSS で文字列が使われる場所もあります、例えば、生成されたコンテンツを指定するときです。この場合、値は文字列を示すようクォートで囲まれます。下記の例ではクォートで囲まれていない color キーワードと生成されたコンテンツ文字列を一緒に使っています。

関数
--

最後に見る値は関数として知られる値です。プログラミングでは、関数とは、繰り返されるタスクを実行するのに何度も呼ばれる、開発者とコンピューター両方の手間を省いてくれる、再利用できるコードの一部分です。関数は通常 JavaScript, Python, C++のような言語と関連付けられますが、CSS にもプロパティ値として存在しています。私たちはすでに色の節で `rgb()`、 `hsl()` などの関数を見ています。ファイルから画像を返すのに使われた値 — `url()` — も関数です。

従来のプログラミング言語にあるような動作をする値は CSS の `calc()` 関数です。この関数を使うと CSS 内で簡単な計算を行うことができます。特にプロジェクトの CSS を書く際に定義できない値を計算したい場合や、実行時にブラウザーに計算させる必要がある場合に便利です。

例えば、下記では `calc()` を使って `20% + 100px` の幅を出しています。20% は親コンテナである `.wrapper` の幅から計算され、その幅が変わると変更されます。親の 20% がいくらになるのか分からないので、この計算を事前にすることはできません。そのため代わりにブラウザーに計算してもらうよう `calc()` を使います。

スキルテスト
------

この記事では多くをカバーしましたが、最も大事な情報を覚えていますか？次に移動する前に、この情報を保持しているか検証するテストがあります — Test your skills: Values and unit (en-US) を見てください。

まとめ
---

ここまで最もよく見かける値と単位を一通り見てきました。CSS 値と単位 のリファレンスページで、さまざまなタイプをすべて見ることができます。多くはこのレッスンを進んでいくと出てくるでしょう。

覚えておくべき重要なことは、各プロパティには許可される値の定義されたリストがあり、各値にはサブ値が何であるかを説明する定義があるということです。詳細は MDN で調べることができます。

例えば、`<image>` でもカラーグラデーションを作成できることを理解しておくと便利ですが、たぶん当たり前の知識ではないでしょう!

* 前のページ
* Overview: Building blocks
* 次のページ