hsl()
Baseline
Widely available
*
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
* Some parts of this feature may have varying levels of support.
メモ:
hsla() 関数記法は hsl() の別名です。両社はまったく同じです。hsl() を使用することが推奨されています。
hsl() 関数記法は、sRGB 色空間において、色相、彩度、明度の成分によって色を表現します。オプションのアルファ成分は、その色の透明度を表します。
試してみましょう
background: hsl(50 80% 40%);
background: hsl(150deg 30% 60%);
background: hsl(0.3turn 60% 45% / 0.7);
background: hsl(0 80% 50% / 25%);
<section id="default-example">
<div class="transition-all" id="example-element"></div>
</section>
#example-element {
min-width: 100%;
min-height: 100%;
padding: 10%;
}
hsl() での補色は、色相の値に 180 度を加算または減算することで定義することができます。これは色相環上の同じ直径に配置されるためです。例えば、ある色の色相角が 10deg であれば、補色は 190deg になります。
構文
/* 絶対的な値 */
hsl(120deg 75% 25%)
hsl(120 75 25) /* deg と % の単位は省略可 */
hsl(120deg 75% 25% / 60%)
hsl(none 75% 25%)
/* 相対値 */
hsl(from green h s l / 0.5)
hsl(from #123456 h s calc(l + 20))
hsl(from rgb(200 0 0) calc(h + 30) s calc(l + 30))
/* 古い 'hsla()' の別名 */
hsla(120deg 75% 25% / 60%)
/* 古い書式 */
hsl(120, 75%, 25%)
hsl(120deg, 75%, 25%, 0.8)
メモ:
hsl()/hsla() は、hsl(120, 75%, 25%) や hsla(120deg, 75%, 25%, 0.8) のように、すべての値をカンマで区切る古い形式でも記述可能です。カンマ区切りの古い構文では none 値は使用不可、色相値の deg はオプション、彩度と明度の値には % 単位が要求されます。
値
下記は、絶対色と相対色の両方に対してすることができる値の説明です。
絶対的な値の構文
hsl(H S L[ / A])
引数は以下の通りです。
H-
<number>、<angle>またはキーワードnoneであり、色相角を表します。この型の詳細は<hue>のリファレンスを参照してください。 S-
<percentage>またはキーワードnoneであり、彩度を表します。100%は色の濃さが最大で、0%は完全に色がありません(グレー)。 L-
<percentage>またはキーワードnoneであり、輝度を表します。100%は白で、0%は黒で、50%は「通常」です。 A省略可-
アルファチャネル値を表す
<alpha-value>で、数値0は0%(完全に透明)、1は100%(完全に不透明)に対応します。さらにキーワードnoneを使用して明示的にアルファチャネルを指定しないことも可能です。Aチャネル値が明示的に指定されていない場合、デフォルトは 100% です。Aチャネル値を含める場合は、値の前にスラッシュ (/) が付きます。
メモ:
none の効果については色成分の欠落を参照してください。
メモ:
絶対的な hsl() 色は、rgb() 値にシリアル化されます。シリアル化時に、赤、緑、青の各要素の値が丸められることがあります。
相対値の構文
hsl(from <color> H S L[ / A])
引数は以下の通りです。
from <color>-
相対色を定義する場合は、キーワード
fromが常に含まれ、次に起点色を表す<color>が続きます。これは相対色のベースとなる起点の色です。起点色には、別の相対色を含む 任意 の有効な<color>構文を使用できます。 H-
<number>、<angle>、またはキーワードnone(この場合は0degと同等)で、出力色の<hue>角を表します。 S-
<percentage>、またはキーワードnone(この場合は0%と同等)です。これは出力色の彩度を表します。ここで100%は色の濃さが最大で、0%は完全に色がありません(グレー)。 L-
<percentage>、またはキーワードnone(この場合は0%と同等)です。これは出力色の明度を表します。ここで100%は白で、0%は黒で、50%は「通常」です。 A省略可-
アルファチャネル値を表す
<alpha-value>で、数値0は0%(完全に透明)、1は100%(完全に不透明)に対応します。さらにキーワードnoneを使用して明示的にアルファチャネルを指定しないことも可能です。Aチャネル値が明示的に指定されていない場合、デフォルトは起点色のアルファチャネルです。Aチャネル値を含める場合は、値の前にスラッシュ (/) が付きます。
メモ:
完全な可視スペクトルを表現するために、相対的な hsl() 色関数の出力は color(srgb) にシリアライズされます。つまり、HTMLElement.style プロパティまたは CSSStyleDeclaration.getPropertyValue() メソッドを介して出力色をクエリーすると、出力色が color(srgb ...) 値として返されます。
相対色出力チャネル成分の定義
hsl() 関数内で相対色構文を使用する場合、ブラウザーは起点色を等価の HSL 色に変換します(すでにそのように指定されていない場合)。色は3つの異なる色チャネル値 - h(色相)、s(彩度)、l(明度)- およびアルファチャネル値 (alpha) として定義されます。これらのチャネル値は、出力色チャネル値を定義する際に関数内で使用できます。
hの値は0以上360以下の<number>に解決し、起点色の<hue>角度値を表します。sとlの値はそれぞれ0以上100以下の<number>に解決し、100は100%と同等です。alpha値は0以上1以下の<number>に解決します。
相対色を定義する際、出力色のさまざまなチャネルをいくつかの異なる方法で表現できます。以下では、これらを説明するためにいくつかの例を見ていきます。
以下の最初の 2 つの例では相対色構文を使用していますが、最初のものは起点色と同じ色を出力し、2 番目のものは起点色にまったく基づいていない色を出力します。これらは実際には相対色を作成していません!実際のコードベースでこれらを使用することはほとんどなく、代わりに絶対色値を使用することになるでしょう。これらの例は相対的な hsl() 構文について学ぶための出発点として含まれています。
まず、rgb(255 0 0)(hsl(0 100% 50%) と同等)の起点色から始めましょう。次の関数は起点色と同じ色を出力します。この関数は、起点色の h、s、l チャネル値(0、100%、50%)を出力チャネル値として使用します。
hsl(from rgb(255 0 0) h s l)
この関数の出力は、hsl(0 100% 50%) と同等の sRGB color()、すなわち color(srgb 1 0 0) です。
次の関数は、出力色のチャネル値に絶対的な値を使用しているので、起点色に基づかないまったく異なる色を出力します。
hsl(from rgb(255 0 0) 240 60% 70%)
上記の場合、出力色は hsl(240 60% 70%) と同等の sRGB color()、すなわち color(srgb 0.52 0.52 0.88) です。
次の関数は、起点色に基づいて相対色を作成します。
hsl(from rgb(255 0 0) h 30% 60%)
この例では、次のことが行われます。
- 起点色(
rgb(255 0 0))を同等のhsl()に変換します(hsl(0 100% 50%))。 - 出力色の
Rチャネル値を起点色のhsl()相当のHチャネル値(255)に設定します。 - 出力色の
SおよびLチャネル値を、起点色に基づかない新しい値、すなわちそれぞれ30%および60%に設定します。
最終的な出力色は hsl(0 30% 60%)、すなわち sRGB 色空間の color(srgb 0.72 0.48 0.48) に相当します。
メモ: 前述したように、出力色が起点色と異なる色モデルを使用している場合、起点色はバックグラウンドで出力色と同じモデルに変換され、互換性のある方法で表現されます(つまり、同じチャネルを使用します)。
これまでに見てきた例は、起点および出力において、アルファチャネルが明示的に指定されていません。出力色のアルファチャネルが指定されていない場合、起点色のアルファチャネルと同じ値になります。起点色のアルファチャネルが指定されていない場合(かつそれが相対色でない場合)、デフォルト値は 1 です。したがって、上記の例の起点色および出力色のアルファチャネル値は 1 です。
起点および出力のアルファチャネル値を指定する例を見てみましょう。最初の例では、出力アルファチャネル値を起点アルファチャネル値と同じ値に設定し、2 番目の例では、起点アルファチャネル値とは関係ない異なる出力アルファチャネル値を設定します。
hsl(from rgb(255 0 0 / 0.8) h s l / alpha)
/* 計算された出力色: color(srgb 1 0 0 / 0.8) */
hsl(from rgb(255 0 0 / 0.8) h s l / 0.5)
/* 計算された出力色: color(srgb 1 0 0 / 0.5) */
次の例では、rgb() の起点色は再び hsl() 表現 - hsl(0 100% 50% / 0.8) に変換されます。H、S、L、および A 値に calc() 計算が適用されます。最終的な出力色は hsl(60 80% 30% / 0.7)、すなわち sRGB 色空間の color(srgb 0.72 0.72 0.08 / 0.7) と同等です。
hsl(from rgb(255 0 0 / 0.8) calc(h + 60) calc(s - 20) calc(l - 10) / calc(alpha - 0.1))
メモ:
起点色のチャネルは <number> 値に解決されるため、通常チャネルが <percentage>、<angle>、または他の値型を受け入れる場合でも、計算で使用する際には数値を加える必要があります。例えば <percentage> を <number> に加えることはできません。
形式文法
<hsl()> =
<legacy-hsl-syntax> |
<modern-hsl-syntax>
<legacy-hsl-syntax> =
hsl( <hue> , <percentage> , <percentage> , <alpha-value>? )
<modern-hsl-syntax> =
hsl( [ from <color> ]? [ <hue> | none ] [ <percentage> | <number> | none ] [ <percentage> | <number> | none ] [ / [ <alpha-value> | none ] ]? )
<hue> =
<number> |
<angle>
<alpha-value> =
<number> |
<percentage>
例
>hsl() を conic-gradient() と組み合わせて使う
hsl() 関数と conic-gradient() はどちらも角度を扱うので、相性がよいものです。
CSS
div {
width: 100px;
height: 100px;
background: conic-gradient(
hsl(360 100% 50%),
hsl(315 100% 50%),
hsl(270 100% 50%),
hsl(225 100% 50%),
hsl(180 100% 50%),
hsl(135 100% 50%),
hsl(90 100% 50%),
hsl(45 100% 50%),
hsl(0 100% 50%)
);
clip-path: circle(closest-side);
}
結果
hsl() による相対色の使用
この例では、3 つの <div> 要素を異なる背景色でスタイル設定します。中央のものには変更されていない --base-color が与えられ、左と右のものにはもとの --base-color をそれぞれ明るく、暗くした値が与えられます。
これらの変化させた値は相対色を使用して定義されます - --base-color カスタムプロパティは hsl() 関数に渡され、出力色は calc() 関数を通じて明度チャンネルが変更され、目的の効果を実現します。一方、色相と彩度は変更されません。明るくした色は明度チャンネルに 20% が追加され、暗くした色は明度チャンネルから 20% が差し引かれます。
CSS
:root {
--base-color: orange;
}
#one {
background-color: hsl(from var(--base-color) h s calc(l + 20));
}
#two {
background-color: var(--base-color);
}
#three {
background-color: hsl(from var(--base-color) h s calc(l - 20));
}
/* @supports を使用して、明度の計算において % 単位を指定する必要がある古い構文への対応を追加します */
@supports (color: hsl(from red h s calc(l - 20%))) {
#one {
background-color: hsl(from var(--base-color) h s calc(l + 20%));
}
#three {
background-color: hsl(from var(--base-color) h s calc(l - 20%));
}
}
結果
出力結果は次の通りです。
古い構文: カンマ区切りの値
歴史的な理由から、hsl() 関数はすべての値がカンマにより区切られた形式を受け付けます。
HTML
<div class="space-separated"></div>
<div class="comma-separated"></div>
CSS
div {
width: 100px;
height: 50px;
margin: 1rem;
}
div.space-separated {
background-color: hsl(0 100% 50% / 50%);
}
div.comma-separated {
background-color: hsl(0, 100%, 50%, 50%);
}
結果
古い構文と新しい構文
この例は、hsla() 構文が hsl() の別名であることを示しています。両者は、現行の構文と古い(カンマ区切り)構文の両方に対応しています。
HTML
<div class="modern">HSL</div>
<div class="legacy">HSL</div>
<div class="modernWithAlpha">HSL</div>
<div class="modernHSLA">HSLA</div>
<div class="legacyHSLA">HSLA</div>
CSS
div {
width: 100px;
min-height: 50px;
font-family: sans-serif;
display: flex;
align-items: center;
justify-content: center;
}
body {
display: flex;
gap: 20px;
}
div.modern {
background-color: hsl(90 80% 50%);
}
div.legacy {
background-color: hsl(90, 80%, 50%);
}
div.modernWithAlpha {
background-color: hsl(90 80% 50% / 50%);
}
div.modernHSLA {
background-color: hsla(90 80% 50% / 50%);
}
div.legacyHSLA {
background-color: hsla(90, 80%, 50%, 0.5);
}
結果
仕様書
| Specification |
|---|
| CSS Color Module Level 5> # relative-HSL> |
| CSS Color Module Level 4> # the-hsl-notation> |
ブラウザーの互換性
関連情報
<hue>データ型lch()およびhwb()色関数color-mix()における色相の補間- すべての色表記の一覧
- 色形式変換ツール
- 相対色の使用
- CSS 色モジュール
- Color picker tool (Lea Verou)