ウェブエンジニア問題集
第8章

色と背景の指定方法 — hex・rgb・hsl・oklchとグラデーションの使い分け

8
この章の目次開く

CSSの色指定には複数の形式があり、それぞれに得意な場面があります。「デザインツールからコピペするだけ」でも動きますが、形式ごとの特徴を知っておくと、ダークモード対応やデザインシステムの構築で大きな差が出ます。

学習者学習者

色の指定って #fff とか rgb() とか hsl() とかいろいろ…結局どれを使えばいいの?

結論から言うと、デザインツールからの受け渡しにはHEX、コード上で色を調整したいときはHSL、モダンな色空間が必要ならOKLCHです。順番に見ていきましょう。

カラーシステムを使いこなしてスキルアップするイメージ


HEX(16進数)— 最もよく使う形式

color: #2563eb;        /* 6桁:不透明 */
color: #2563eb80;      /* 8桁:透明度50% */
color: #fff;           /* 3桁:省略形(#ffffff) */
css

HEXは赤(RR)緑(GG)青(BB)を16進数2桁ずつ、計6桁で表します。デザインツール(Figma、Adobe XDなど)が出力するデフォルト形式なので、コピペでそのまま使えるのが最大のメリットです。

デメリットは「見ただけで何色か想像しにくい」こと。#2563eb がどんな青か、慣れるまではぱっと分かりません。


RGB / RGBA — 透明度を使いたいとき

color: rgb(37, 99, 235);             /* 不透明 */
color: rgba(37, 99, 235, 0.5);       /* 透明度50%(旧記法) */
color: rgb(37 99 235 / 50%);         /* 透明度50%(新記法) */
css

赤(0〜255)、緑(0〜255)、青(0〜255)の3つの値で色を指定します。HEXと同じRGBカラーモデルですが、透明度(アルファ値)の指定が直感的です。


HSL — 人間の感覚に近い色指定

/* 色相(0-360°) 彩度(%) 明度(%) */
color: hsl(220, 80%, 53%);            /* 不透明 */
color: hsl(220 80% 53% / 50%);        /* 透明度50% */
css
パラメータ範囲意味
色相(Hue)0〜360°色相環の角度。0=赤、120=緑、240=青
彩度(Saturation)0〜100%鮮やかさ。0%=グレー、100%=最も鮮やか
明度(Lightness)0〜100%明るさ。0%=黒、50%=標準、100%=白

HSLの最大の強みは、色の調整がパラメータの意味そのままでできることです。

/* 元の色 */
color: hsl(220, 80%, 53%);
 
/* 少し暗くしたい → 明度を下げるだけ */
color: hsl(220, 80%, 40%);
 
/* 彩度を下げて落ち着いた色に → 彩度を下げるだけ */
color: hsl(220, 40%, 53%);
 
/* 同系色のバリエーション → 明度だけ変える */
--color-primary: hsl(220, 80%, 53%);
--color-primary-light: hsl(220, 80%, 70%);
--color-primary-dark: hsl(220, 80%, 35%);
css
先生先生

HSLは「このボタンをもう少し暗くしたい」「hover時に明るくしたい」といった調整が数値1つで済むのが強みだよ。HEXだと #2563eb を暗くするのに計算が必要になる。


OKLCH — 次世代の色空間

color: oklch(0.55 0.2 260);              /* Lightness Chroma Hue */
color: oklch(0.55 0.2 260 / 50%);        /* 透明度付き */
css

OKLCH(Oklab色空間のLCH表現)は、HSLの欠点を補う新しい色指定形式です。

学習者学習者

HSLで十分そうなのに、なぜ新しい形式が必要なの?

HSLには「明度50%の黄色と明度50%の青で、見た目の明るさが全然違う」という問題があります。人間の目は色相によって明るさの感じ方が違うのに、HSLはそれを考慮していません。OKLCHは知覚的に均一な色空間で、同じLightness値なら本当に同じ明るさに見えます。

/* HSL: 同じ明度50%なのに、黄色の方がずっと明るく見える */
color: hsl(60, 100%, 50%);   /* 黄色 — とても明るく見える */
color: hsl(240, 100%, 50%);  /* 青 — 暗く見える */
 
/* OKLCH: 同じLightness 0.7なら、本当に同程度の明るさに見える */
color: oklch(0.7 0.15 90);   /* 黄色系 */
color: oklch(0.7 0.15 260);  /* 青系 */
css

色指定形式の選び方まとめ

形式使い所メリットデメリット
HEXデザインツールからの受け渡しコピペで使える、最も普及見ただけで色が分からない
RGBプログラムで色を計算するときJavaScriptとの相性が良い調整が直感的でない
HSLCSSで色のバリエーションを作るとき明度・彩度の調整が簡単知覚的に不均一
OKLCHデザインシステム、知覚的一貫性が必要なとき知覚的に均一まだ新しい、ツール対応途上

currentColor — 親のcolorを再利用する

.icon-button {
  color: #2563eb;
  border: 1px solid currentColor;  /* colorと同じ#2563eb */
  fill: currentColor;              /* SVGのfillにも使える */
}
 
.icon-button:hover {
  color: #1d4ed8;
  /* border と fill も自動で変わる */
}
css

currentColor は「その要素の color プロパティの値」を参照するキーワードです。ボタンのテキスト色・ボーダー色・アイコン色を連動させたいときに便利です。


background-color と opacity

/* 背景色 */
.card {
  background-color: #f8fafc;
}
 
/* 要素全体の透明度(子要素も含めて透明になる) */
.overlay {
  opacity: 0.5;
}
 
/* 背景色だけ半透明にしたい場合 → 色の透明度を使う */
.overlay-bg {
  background-color: rgb(0 0 0 / 50%);
  /* テキストは不透明のまま */
}
css

グラデーション

linear-gradient(線形グラデーション)

/* 角度を指定 */
.hero {
  background-image: linear-gradient(135deg, #667eea, #764ba2);
}
 
/* 上から下(デフォルト) */
.fade {
  background-image: linear-gradient(#f0f9ff, #e0f2fe);
}
 
/* 3色以上 */
.rainbow {
  background-image: linear-gradient(90deg, #f87171, #fbbf24, #34d399);
}
css

radial-gradient(放射状グラデーション)

.spotlight {
  background-image: radial-gradient(circle at center, #fff, #f1f5f9);
}
css

グラデーション + テキスト(見出しのアクセント)

.gradient-text {
  background: linear-gradient(135deg, #667eea, #764ba2);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
}
css
グラデーションを活用したデザインのイメージ

背景画像

.hero {
  background-image: url('/images/hero.jpg');
  background-size: cover;       /* 領域をすべて覆う */
  background-position: center;  /* 中央基準 */
  background-repeat: no-repeat; /* 繰り返さない */
}
 
/* ショートハンド */
.hero {
  background: url('/images/hero.jpg') center / cover no-repeat;
}
css

背景画像の上にテキストを重ねるときは、半透明のオーバーレイを組み合わせると読みやすくなります。

.hero-overlay {
  background: 
    linear-gradient(rgb(0 0 0 / 50%), rgb(0 0 0 / 50%)),
    url('/images/hero.jpg') center / cover no-repeat;
  color: white;
}
css

ちゃんと使うためのポイント

  • デザインツールからの受け渡しはHEXが最もスムーズ
  • CSSで色のバリエーションを作るならHSL(明度・彩度を1つの数値で調整)
  • 知覚的な一貫性が必要なデザインシステムにはOKLCH
  • opacity は要素全体を透明にする。背景だけ半透明にしたいなら色の透明度(/ 50%)を使う
  • currentColor でテキスト色とボーダー・アイコン色を連動させると保守しやすい
  • グラデーションは linear-gradient のショートハンドを覚えるだけで表現の幅が広がる

次の章では、トランジションとアニメーションを学びます。

参考リンク

CSSクイズに挑戦するこの章で学んだCSSの知識を、4択クイズでアウトプットして定着させよう