CSS 색상 모듈 레벨 5

W3C 작업 초안,

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2026/WD-css-color-5-20260113/
최신 게시 버전:
https://www.w3.org/TR/css-color-5/
편집자 초안:
https://drafts.csswg.org/css-color-5/
이전 버전:
역사:
https://www.w3.org/standards/history/css-color-5/
피드백:
CSSWG 이슈 리포지토리
편집자:
Chris Lilley (W3C)
Una Kravets (Google)
Lea Verou (초청 전문가)
전 편집자:
Adam Argyle (Google)
이 사양에 대한 편집 제안:
GitHub 편집기
델타 사양:
테스트 스위트:
https://wpt.fyi/results/css/css-color/

요약

이 모듈은 CSS Color [css-color-4]를 확장하여 색상 수정 함수, 사용자 정의 색상 공간(ICC 프로파일), contrast-color(), light-dark() 및 device-cmyk()를 추가합니다.

CSS는 구조화된 문서(예: HTML 및 XML)의 렌더링을 화면, 종이 등에서 설명하는 언어입니다.

이 문서의 상태

이 섹션은 이 문서가 발행된 시점의 상태를 설명합니다. 현재 W3C 출판물 목록과 이 기술 보고서의 최신 버전은 W3C 표준 및 초안 색인에서 확인할 수 있습니다.

이 문서는 CSS 작업 그룹에서 작업 초안으로 발행하였으며, 권고안 트랙을 사용하였습니다. 작업 초안으로 발행되었다고 해서 W3C 및 회원들이 이를 승인한 것은 아닙니다.

이 문서는 초안 문서이며 언제든지 업데이트, 교체 또는 폐기될 수 있습니다. 진행 중인 작업으로서 이 문서를 인용하는 것은 부적절합니다.

피드백은 GitHub에서 이슈를 등록(권장)하여 보내주세요. 제목에 명세 코드 “css-color”를 포함하여 다음과 같이 작성해 주세요: “[css-color] …코멘트 요약…”. 모든 이슈 및 코멘트는 아카이브됩니다. 또는 피드백을 (아카이브됨) 공개 메일링 리스트 www-style@w3.org로 보낼 수도 있습니다.

이 문서는 2025년 8월 18일 W3C 프로세스 문서에 따라 관리됩니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 제작되었습니다. W3C는 그룹의 산출물과 관련하여 제출된 공개 특허 목록을 유지합니다. 해당 페이지에는 특허 공개 방법도 안내되어 있습니다. 특허의 필수 청구항이 있다고 믿는 개인은, W3C 특허 정책 제6조에 따라 정보를 공개해야 합니다.

1. 소개

이 섹션은 규범적이지 않습니다.

이 모듈은 새로운 함수 contrast-color(), color-mix()light-dark()를 추가하고, 기존 함수에 상대 색상 구문을 확장합니다.

또한 color() 함수를 확장하여 미리 정의된 색상 공간뿐만 아니라 ICC 프로파일로 정의된 사용자 정의 색상 공간 (보정된 CMYK 포함)을 CSS에서 사용할 수 있도록 합니다.

또한 device-cmyk를 추가하여 보정되지 않은 CMYK 색상을 표현합니다.

2. <color> 구문

CSS에서 색상은 <color> 유형으로 표현됩니다:

<color> = <color-base> | currentColor | <system-color> | 
      <contrast-color()> | <device-cmyk()>  | <light-dark()>

<color-base> = <hex-color> | <color-function> | <named-color> | <color-mix()> | transparent
<color-function> = <rgb()> | <rgba()> |
              <hsl()> | <hsla()> | <hwb()> |
              <lab()> | <lch()> | <oklab()> | <oklch()> |
              <alpha()> |
              <color()>

절대 색상<color>의 계산된 값으로, 절대적이고 색채계적인 해석을 가지는 색상입니다. 이는 다음과 같은 값이 아닙니다:

또한 <color-mix()> 또는 상대 색상 구문 내에서 이러한 값이 사용되지 않습니다.

sRGB로 변환되는 색상은:

레거시 색상 문법을 지원하는 함수는:

<hsl()>, <hsla()>, <hwb()>, <lch()>, 및 <oklch()> 색상 함수원통형 극 좌표 색상 표현을 사용하며 <hue> 각도를 사용합니다; 그 외 색상 함수직교 사각 좌표 색상 표현을 사용합니다.

3. 색상 혼합: color-mix() 함수

웹 개발자, 디자인 도구 및 디자인 시스템 개발자는 구성 요소 색상 관계를 확장하는 데 도움을 주기 위해 색상 함수를 자주 사용합니다. 여러 플랫폼 및 다양한 사용자 환경 설정을 지원하는 디자인 시스템이 증가하고 있으며, UI의 다크 모드 기능이 강화되는 상황에서, 색상을 수동으로 설정하지 않고 대신 색상 스킴이 계산되는 단일 소스를 갖는 것이 더욱 유용해지고 있습니다.

LC 색상 선택기
미국의 색상 분포도 지도

위는 CIE LCH 공간에서 작동하는 색상 선택기입니다. 여기서 두 개의 색상이 사용되어 채도-밝기 평면(고정된 색조)에서 색상 스케일을 정의하고 있습니다. 아래는 색상 스케일이 사용된 색상 분포도 지도입니다.

현재 Sass, HSL 값에 대한 calc(), 또는 PostCSS가 이를 수행하는 데 사용됩니다. 그러나 전처리기는 동적으로 조정된 색상에는 작동할 수 없습니다. 현재 모든 솔루션은 sRGB 색영역 및 HSL의 지각적 제한에 국한됩니다. (색상 원형에서 색상이 응축되고, 노란색과 파란색처럼 시각적으로 서로 다른 밝기를 가지는 두 색상이 동일한 HSL 밝기를 가질 수 있습니다.)

이 요구를 충족하기 위해 color-mix() 함수는 하나 이상의 <color> 명세의 목록을 받아서, 지정된 <color-space>와 지정된 비율로 이들을 혼합한 결과를 반환합니다.

color-mix() = color-mix( <color-interpolation-method>? , [ <color> && <percentage [0,100]>? ]#)
테스트

3.1. 혼합을 위한 색상 공간

색상 보간 방법이 지정되지 않은 경우 Oklab을 기본값으로 사용합니다. 그렇지 않으면 지정된 색상 공간을 혼합에 사용합니다.

3.2. 백분율 정규화

백분율은 0%에서 100% 사이여야 합니다. 음수 백분율은 명시적으로 허용되지 않습니다. 백분율은 혼합 백분율 정규화를 통해 정규화됩니다.

테스트
이러한 문법 형태는 모두 동일합니다:
color-mix(in lch, purple 50%, plum 50%)
color-mix(in lch, purple 50%, plum)
color-mix(in lch, purple, plum 50%)
color-mix(in lch, purple, plum)
color-mix(in lch, plum, purple)
color-mix(in lch, purple 80%, plum 80%)

모두 퍼플과 플럼을 현행 표준의 lch에서 50-50 비율로 혼합한 결과를 만듭니다: lch(51.51% 52.21 325.8) 즉, rgb(68.51% 36.01% 68.29%)입니다.

하지만, 다음 형태는 동일하지 않으며 알파 값이 1보다 작습니다:

color-mix(in lch, purple 30%, plum 30%)

이 경우 lch(51.51% 52.21 325.8 / 0.6) 즉, rgb(68.51% 36.01% 68.29% / 0.6)로 출력됩니다.

3.3. color-mix 결과 계산

color-mix() 계산 방법:
  1. 함수에 전달된 혼합 항목 목록에서 혼합 백분율 정규화를 수행하고, "강제 정규화" 플래그를 true로 설정하여 itemsleftover를 결과로 지정합니다.

  2. 만약 leftover가 100%라면, 투명 블랙을 지정된 보간 <color-space>로 변환하여 반환합니다.

  3. alpha mult1 - leftover 값을 할당합니다. leftover는 0에서 1 사이의 숫자로 해석합니다.

  4. items의 길이가 1이면, 해당 항목의 색상을 지정된 보간 <color-space>로 변환하여 color에 할당합니다.

    그렇지 않으면:

    1. item stackitems의 역순으로 만든 스택으로 설정합니다. (따라서 첫 번째 항목이 스택의 맨 위에 위치합니다.)

    2. item stack의 길이가 2 이상일 때까지 반복:

      1. 스택에서 두 번 pop하여, 결과를 순서대로 ab에 할당합니다. ab의 백분율 합을 combined percentage로 합니다.

      2. ab의 색상을 CSS Color 4 §  12. Color Interpolation의 설명에 따라 보간합니다. 진행률(퍼센트)은 (b의 백분율) / combined percentage로 합니다. 만약 지정된 색상 공간이 원통형 극 좌표 색상 공간이라면, <hue-interpolation-method> 값에 따라 색상 보간의 hue가 결정됩니다. 자세한 내용은 CSS Color 4 § 12.4 Hue Interpolation을 참고하세요. <hue-interpolation-method>가 지정되지 않았으면 shorter를 기본값으로 합니다.

      3. 결과 색상과 combined percentage를 사용해 새 혼합 항목을 만들고, 스택에 push합니다.

    3. item stack의 남은 하나의 항목의 색상을 color에 할당합니다.

  5. color의 알파 값을 alpha mult로 곱합니다.

  6. color를 반환합니다.

참고: 원통형 극 좌표 색상 공간에서는 혼합 순서가 결과에 영향을 미치는데, hue 원에서 "짧은" 또는 "긴" 방향이 이전에 수행된 혼합에 따라 달라질 수 있기 때문입니다. 이 알고리즘은 리스트에 지정된 순서대로 각 색을 혼합하며, 이전 결과와 다음 항목을 계속해서 섞어 나갑니다. 직교 사각 좌표 색상 공간에서는 순서가 무관하며, 과정을 단순화할 수 있습니다.

테스트
이 예시는 페루 40%와 페일골든로드 60%를 혼합한 결과를 만듭니다.
color-mix(in lch, peru 40%, palegoldenrod)

혼합은 lch 색상 공간에서 이루어집니다. 다음은 중립 L 축을 따라 내려다본 모습입니다:

두 색상의 혼합과 혼합 결과. CIE L 축을 따라 ab 평면을 내려다보고 있습니다. 두 축은 ab로 표시되며, 중심에서 교차합니다. 그래프의 중심이 원점입니다.

페루와 페일골든로드의 CIE LCH 혼합. 페루는 양의 a 축 기준으로 63.677도 색상각을 가지고, 페일골든로드는 98.834도 색상각을 가집니다. 페루의 채도(중앙 중립 축에서의 거리)는 54.011이고, 페일골든로드의 채도는 31.406입니다. 모든 혼합 결과는 곡선을 따라 나타나며, 40%/60% 혼합이 표시됩니다.

계산 과정은 다음과 같습니다:

이 예시는 teal과 olive를 혼합한 결과를 만듭니다. lch 색상 공간에서, 각 lch 구성요소는 teal 값의 65%, olive 값의 35%로 계산됩니다.

참고: 색상과 채도를 보간하면 중간 색상도 끝점 색상만큼 채도가 유지됩니다.

color-mix(in lch, teal 65%, olive);

두 색상의 혼합과 혼합 결과. CIE L 축을 따라 ab 평면을 내려다보고 있습니다. 두 축은 ab로 표시되며, 중심에서 교차합니다.

teal과 olive의 혼합. teal의 색상각은 양의 a 축 기준으로 196.4524도, olive는 99.5746도입니다. teal의 채도는 31.6903, olive의 채도는 56.8124입니다. 혼합 결과는 점선 곡선을 따라 나타나며, 65%/35% 혼합이 표시됩니다.

계산 과정은 다음과 같습니다:

이 예시에서는 두 퍼센트 값이 모두 0이므로, 합도 0입니다:
color-mix(in oklch, teal 0%, olive 0%);

따라서 결과는 oklch 색 공간에서의 투명 블랙입니다:
oklch(0% 0 none / 0)

3.4. 색상 공간 혼합이 color-mix에 미치는 영향

혼합 색상 공간의 선택은 최종 결과에 큰 영향을 줄 수 있습니다.

이 예시는 흰색과 검은색을 50%로 혼합한 예시이며, 세 가지 색상 공간에서 비교합니다.
color-mix(in lch, white, black);
color-mix(in xyz, white, black);
color-mix(in srgb, white, black);

계산 과정은 다음과 같습니다:

LCH 혼합은 L 값이 50%로 완벽한 중간 회색을 주며, 예상대로입니다. (Lab에서 혼합해도 동일하며, LCH와 Lab의 밝기 축은 동일합니다.)

XYZ 혼합 결과는 너무 밝으며, XYZ는 선형-광(linear-light)이지만, 지각적으로 균일하지 않습니다. sRGB 혼합은 약간 밝은 결과를 주며, sRGB는 지각적으로 균일하지도, 선형-광도 아닙니다.

이 예시는 빨간색과 하늘색을 혼합한 예시로, xyz 색상 공간에서 빨간색이 75.23%, 하늘색이 24.77% 비율로 혼합됩니다.
color-mix(in xyz, rgb(82.02% 30.21% 35.02%) 75.23%, rgb(5.64% 55.94% 85.31%));

계산 과정은 다음과 같습니다:

이 예시는 흰색과 파란색을 50%로 혼합한 예시이며, 세 가지 색상 공간에서 비교합니다.

color-mix(in lch, white, blue);
color-mix(in oklch, white, blue);
color-mix(in srgb, white, blue);

계산 과정은 다음과 같습니다:

이 예시는 두 색상을 혼합한 예시로, hsl 색상 공간에서, 혼합 대상 색상 중 하나가 sRGB 가뮤트 밖에 있습니다.
color-mix(in hsl, color(display-p3 0 1 0) 80%, yellow);

계산 과정은 다음과 같습니다:

device-cmyk()color-mix()에서 사용할 수 있지만, 결과는 구현이 계산된 값을 얻는 방법에 따라 달라집니다.
color-mix(in lab, device-cmyk(0.091777 0.043303 0.312816 0.000000) 100%, yellow);

첫 번째 색상이 100%이므로, 두 번째 색상은 0%가 되어 혼합 결과에 아무런 영향을 미치지 않습니다. 따라서 결과는 CIE Lab에서 첫 번째 색상의 계산된 값이 됩니다.

결과를 시각화하기 위해, 디바이스 CMYK 값이 실제로 SWOP 2006 coated로 인쇄된다고 가정해 봅니다.

구현이 ICC 프로파일을 사용하여 lab() 색상을 얻고, 이 예시에서 FOGRA39 Coated 프로파일을 사용한다고 가정해 봅니다:

이제 다른 구현이 순진한 색 변환 알고리즘을 사용하여 sRGB 결과를 준다고 가정해 봅니다.

3.5. 비단일 알파가 color-mix에 미치는 영향

지금까지의 color-mix() 예시는 모두 완전히 불투명한 색상을 사용했습니다. 예시를 단순화하기 위해 프리멀티플리케이션과 언프리멀티플리케이션 과정은 생략되었습니다. 이 단계들은 1로 곱하고 1로 나누는 것뿐이므로 결과에는 변화가 없기 때문입니다.

일반적인 경우에는 색상에 비단일 알파 값이 존재할 수 있으므로, 프리멀티플라이, 보간, 언프리멀티플라이 과정이 반드시 포함되어야 합니다.

이 예시는 25% 반투명 빨간색과 75% 반투명 초록색입니다. sRGB에서 혼합됩니다. 올바른 (프리멀티플라이 적용) 및 잘못된(비적용) 계산 방법을 모두 보여줍니다.
color-mix(in srgb, rgb(100% 0% 0% / 0.7) 25%, rgb(0% 100% 0% / 0.2));

계산 과정은 다음과 같습니다:

잘못된 계산은 다음과 같습니다:

이 차이는 매우 큽니다; 올바른 결과와 잘못된 결과의 ΔE2000은 30.7입니다!

백분율 정규화가 알파 곱셈자를 생성하는 경우, 계산은 마지막 단계만 추가로 다릅니다.

이 예시는 앞의 예와 비슷하며, 25% 반투명 빨간색과 75% 반투명 초록색입니다. sRGB에서 혼합됩니다.

하지만 이 경우, 백분율이 첫 번째 색상은 20%, 두 번째 색상은 60%로 지정되어 있습니다. 이들의 합은 80%이므로 알파 곱셈자는 0.8입니다.

혼합 백분율은 100/80을 곱해 다시 정규화됩니다:
20% * 100/80 = 25%
60% * 100/80 = 75%
따라서 최종 혼합 비율은 앞의 예와 동일해집니다.

color-mix(in srgb, rgb(100% 0% 0% / 0.7) 20%, rgb(0% 100% 0% / 0.2) 60%);

계산 과정은 다음과 같습니다:

참고: 보간된 알파에 알파 곱셈값을 곱한 후 그것으로 프리멀티플리케이션을 되돌리는 데 사용하면 안 됩니다. 혼합 백분율이 100%로 스케일링되지 않았다면 올바른 방식이지만, 스케일링되었으므로 이렇게 하면 혼합 색상에 두 번 조정이 가해집니다.

4. 상대 색상

4.1. 상대 색상의 처리 모델

이 명세의 이전 단계에서는 색상 함수가 오직 절대적인 방식으로만 색상을 지정할 수 있었으며, 모든 색상 구성 요소를 직접 지정해야 했습니다.

새로운 상대 색상 문법은 최신 색상 문법을 확장하여 기존 색상을 색상 함수로 수정할 수 있도록 해줍니다. 기준 색상이 지정되면, 각 색상 구성 요소(그리고 지정된 경우 알파 값)는 직접 지정하거나, 기준 색상에서 가져올 수 있으며 (필요하다면 수식 함수로 수정할 수도 있습니다).

기준 색상과 상대 색상은 동일한 색상 함수를 사용할 필요가 없습니다.

필수 변환: 모든 연산은 상대 색상 함수의 색상 공간에서 수행됩니다. 기준 색상원래 지정된 색상 공간이 다른 색상 함수를 사용했다면, 먼저 선택한 색상 함수로 변환된 후, 각 구성 요소에 의미 있는 값이 부여되고, 구성 요소 키워드는 기준 색상이 아니라 상대 색상의 색상 공간을 참조합니다.

상대 색상에서 알파 값이 생략된 경우, 이는 기준 색상의 알파를 기본값으로 사용합니다(절대 문법에서는 100%가 기본값인 것과 대조적임).

상대 색상 문법을 사용할 때는 색상 구성 요소 값이 직전 지정이든 색상 공간 변환에서 오든, 참조 범위로 클램프되지 않고 그대로 유지됩니다. 만약 대상 색상 공간이 이를 표현할 수 있다면 색공간 범위를 벗어난 값도 유지됩니다.

하지만 상대 색상 문법을 사용하는 경우, 알파 구성 요소 값은 직접 지정하든 색상 공간 변환에서 오든 클램프됩니다.

누락된 구성 요소는 CSS Color 4 § 12.2 Interpolating with Missing Components와 동일한 방식으로 처리됩니다: 기준 색상 공간과 상대 색상 함수의 색상 공간 모두에서 유사 구성 요소를 확인한 뒤 이들 값이 이월됩니다.

대부분의 상대 색상 문법 사용은 각 인자 위치에서 구성 요소 키워드를 쓰지만, 실제로는 어떤 위치든 사용 가능합니다.

구성 요소를 일반 위치 외에서 사용할 경우 주의해야 합니다; 백분율이 숫자로 해석될 때는, 해당 숫자가 다른 위치에서 사용되더라도 "자동 스케일링"이 적용되지 않습니다.

device-cmyk()에 대한 상대 문법은 존재하지 않습니다.

4.2. 상대 색상 문법

각 함수의 상대 색상 지원을 위한 문법 변경 세부 사항은 아래에 정리되어 있지만, 모두 공통 구조를 따릅니다:

구성요소 키워드<숫자> 또는 none을 반환합니다; 만약 원래 <백분율> 또는 <각도>로 지정됐다면, 그 <백분율><숫자>로, <각도>는 도(degree) 단위의 <숫자>로 변환됩니다 (이는 표준 단위입니다) [0, 360] 범위 내입니다.

테스트
예를 들어, 색상이 <백분율>로 지정된 경우, 동일한 색상 공간의 RCS는 변환된 <숫자> 형태를 사용합니다:
html { --bluegreen:  oklab(54.3% -22.5% -5%); }
.overlay {
  background:  oklab(from var(--bluegreen) calc(1.0 - l) calc(a * 0.8) b);
}

이 예시에서 지정된 백분율은 숫자로 변환되어, oklab(0.543 -0.09 -0.02)가 됩니다. 결과 RCS 색상은 l = 1 - 0.543 = 0.457, a = -0.09 * 0.8 = -0.072, b는 변하지 않음: oklab(0.457 -0.072 -0.02).

예를 들어, 원본 색상에 각도 <각도>가 도(degree)로 지정된 경우, 동일한 색상 공간의 RCS는 변환된 <숫자> 형태를 사용합니다:
html { --base:  oklch(52.6% 0.115 44.6deg) }
.summary {
  background:  oklch(from var(--base) l c  calc(h + 90));
}

이 예시에서 결과 RCS 색상은 oklch(0.526 0.115 134.6)입니다.

만약 원본 색상의 각도 <각도>가 다른 단위(라디안 또는 턴 등)로 지정됐다면, 변환된 <숫자>는 도(degree) 값입니다.

구성요소 키워드수학 함수에 사용하면, 원본 색상을 더 고급스럽게 조작할 수 있습니다.
html { --color: green; }
.foo {
  --darker-accent: lch(from var(--color) calc(l / 2) c h);
}

이 예시에서 원본 색상의 밝기(l)를 반으로 줄여 어둡게 만들지만, 다른 색상 특성은 변경하지 않습니다.

또한 원본 색상은 색상 키워드(sRGB)이지만, lch() 함수에서 사용되므로 자동으로 LCH 색상으로 해석됩니다.

예를 들어, 테마 색상이 불투명하게 지정됐지만 특정 경우에 부분 투명하게 사용해야 할 때:
html { --bg-color:  blue; }
.overlay {
  background:  rgb(from var(--bg-color) r g b / 80%);
}

이 예시에서 원본 색상의 r, g, b 구성요소는 변경되지 않고, 키워드로 지정되어 원본 색상에서 값을 가져옵니다. 반면 투명도(opacity)는 80%로 설정되어 부분 투명하게 만들며, 원본 색상의 투명도 값과 관계없이 적용됩니다.

예를 들어, sRGB 가뮤트 밖의 Display P3 색상도, 클리핑되지 않고 표현할 수 있습니다.
--vivid-yellow:  color(display-p3 1 1 0); 
--paler-yellow:  color(from var(--vivid-yellow) srgb r g calc(b + 0.5));

여기서 --vivid-yellow는 sRGB로 변환되면 rgb(100% 100% -34.63%)가 되며, blue 구성요소의 음수 값도 클램프되지 않습니다. RCS 계산 결과는 rgb(100% 100% 15.37%)가 됩니다.

예를 들어, 원본 색상의 알파 값이 0.7일 때, 두 배로 하려고 하면 결과의 알파 값은 1이 되며 1.4가 아닙니다.
--tan:  oklch(78% 0.06 75 / 0.7);
--deeper-tan:  oklch(from var(--tan) l c h / calc(alpha * 2));
예를 들어, 색상을 간단히 그레이스케일로 변환하려면:
--blue-into-gray: rgb(from var(--color)
                    calc(r * .3 + g * .59 + b * .11)
                    calc(r * .3 + g * .59 + b * .11)
                    calc(r * .3 + g * .59 + b * .11));

이렇게 하면, redrgb(76.5 76.5 76.5), limergb(150.45 150.45 150.45), bluergb(150.45 150.45 150.45)가 됩니다. darkolivegreen 같이 조금 더 중간 톤 색상은 RGB 값이 rgb(85 107 47)인데, rgb(93.8 93.8 93.8)이 됩니다.

(간단히 변환한 것이므로, 일단 이 계산은 감마 인코딩된 공간에서 이루어지며 선형광이 아니고, 가중치도 sRGB가 아닌 NTSC에서 유래한 값임에 유의.)

(이 문법을 설명하기 위한 예시일 뿐, 색상을 그레이스케일로 바꾸는 더 쉽고 정확한 방법은 oklch() 함수를 사용하는 것입니다. 이 색상 공간은 인간 지각에 더 정확하므로: oklch(from var(--color) l 0 h)는 밝기를 유지하고 채도(chroma)는 0으로 만들어 색상의 "색감"을 제거합니다.)

예를 들어,

color: color(from color(srgb 0 0 0 / 60%) srgb alpha 0.6 0.6 / 0.9);

알파 구성요소는 <숫자>로 변환되어 0.6이 되고, 결과 컬러는 color(srgb 0.6 0.6 0.6 / 0.9) 입니다.

하지만 두 번째 예시에서도 알파는 0.6으로 변환되지만, rgb() 문법의 색상 구성요소 값 범위가 0~255이므로 매우 다른 색상이 됩니다:

color: rgb(from rgb(0 0 0 / 60%) alpha 153 153 / 0.9);

이 경우 rgb(0.6 153 153 / 0.9)이 되고, 153 153 153 / 0.9가 아닙니다.

이 예시에서 무채색 원본 색상에 색상(hue)이 없습니다; 상대 색상에도 hue가 없으며, 그 색상을 사용하는 그라데이션에 영향을 줍니다.
html { --bg:  hsl(none 3% 50%); }
.foo {
  --darker-bg:  oklch(from var(--bg) calc(l * 0.8) c h);
}
.bar {
  background: linear-gradient(in Oklab to right,   var(--darker-bg),   #4C3);
}

--bg 값이 OkLCh로 변환되면 oklch(0.592 0.009 17.42)가 되지만, 유사한 hue 구성요소는 계승되어 oklch(0.592 0.009 none)이 됩니다. 이 값들은 상대 함수에서 사용되어 더 어두운 색상 oklch(0.474 0.009 none)이 됩니다.

그라데이션의 연한 녹색은 oklch(0.743 0.222 141.6)이고, 보간하면 다른 색상도 그 hue를 가지게 되어 oklch(0.474 0.009 141.6)이 됩니다.

따라서 그라데이션은 일정한 녹색 hue를 갖습니다.

만약 구현체가 이러한 계승을 하지 않는다면, --darker-bg의 hue는 0이 되어, 그라데이션 시작 부분에 바람직하지 않은 붉은빛이 나타납니다.

올바른(위) 및 잘못된(아래, reddish) 그라데이션.

하지만, 누락된 값에 대해 계산을 하면 none은 0으로 처리됩니다.

4.3. 상대 sRGB 색상

sRGB 색상의 의미는 CSS Color 4 § 5 sRGB Colors에서 정의됩니다.

최신 색상 문법rgb()rgba() 함수의 문법은 다음과 같이 확장됩니다:

<modern-rgb-syntax> = rgb( [ from <color> ]?
        [ <number> | <percentage> | none]{3}
        [ / [<alpha-value> | none] ]?  )
<modern-rgba-syntax> = rgba( [ from <color> ]?
        [ <number> | <percentage> | none]{3}
        [ / [<alpha-value> | none] ]?  )

상대 색상 문법 내 rgb() 또는 rgba() 함수에서는 사용 가능한 구성 요소 키워드는 다음과 같습니다:

테스트
sRGB 색상 공간에서 색상 구성요소를 조작하려면:
rgb(from  indianred 255 g b)

이 코드는 indianred의 sRGB 값(205 92 92)을 가져와, 빨강 구성요소를 255로 대체하여 rgb(255 92 92)를 만듭니다.

상대 sRGB 색상 문법은 오직 레거시 RGB 문법이 아닌 형태에만 적용됩니다.

예를 들어, rgba 레거시 색상 문법을 콤마로 사용하려는 시도는 올바르지 않습니다.
rgba(from  darkblue 16, 32, b, 0.5 )
대신 다음과 같이 사용합니다:
rgb(from  darkblue 16 32 b / 0.5 )

이 코드는 darkblue의 sRGB 값(0 0 139)을 가져와, 빨강, 초록, 알파 구성요소를 대체하여 rgb(16 32 139 / 0.5)를 만듭니다.

4.4. 상대 HSL 색상

HSL 색상의 의미는 CSS Color 4 § 7 HSL Colors: hsl() 및 hsla() 함수에서 정의됩니다.

최신 색상 문법hsl()hsla() 함수의 문법은 다음과 같이 확장됩니다:

<modern-hsl-syntax> = hsl([from <color>]?
          [<hue> | none]
          [<percentage> | <number> | none]
          [<percentage> | <number> | none]
          [ / [<alpha-value> | none] ]? )
<modern-hsla-syntax> = hsla([from <color>]?
        [<hue> | none]
        [<percentage> | <number> | none]
        [<percentage> | <number> | none]
        [ / [<alpha-value> | none] ]? )

상대 색상 문법 내 hsl() 또는 hsla() 함수에서는 사용 가능한 구성 요소 키워드는 다음과 같습니다:

테스트
이 코드는 색상각에 180도를 더해 보색을 만듭니다.
--accent:  lightseagreen;
--complement:   hsl(from var(--accent) calc(h + 180) s l);

lightseagreen은 hsl(177deg 70% 41%)이므로, --complement는 hsl(357deg 70% 41%)이 됩니다.

상대 HSL 색상 문법은 레거시 HSL 문법이 아닌 형태에만 적용됩니다.

4.5. 상대 HWB 색상

HWB 색상의 의미는 CSS Color 4 § 8 HWB Colors: hwb() 함수에서 정의됩니다.

hwb() 함수의 문법은 다음과 같이 확장됩니다:

hwb() = hwb([from <color>]?
        [<hue> | none]
        [<percentage> | <number> | none]
        [<percentage> | <number> | none]
        [ / [<alpha-value> | none] ]? )

상대 색상 문법 내 hwb() 함수에서 사용할 수 있는 구성 요소 키워드는 다음과 같습니다:

테스트

4.6. 상대 Lab 색상

Lab 색상의 의미는 CSS Color 4 § 9.1 CIE Lab and LCH에서 정의됩니다.

lab() 함수의 문법은 다음과 같이 확장됩니다:

lab() = lab([from <color>]?
        [<percentage> | <number> | none]
        [<percentage> | <number> | none]
        [<percentage> | <number> | none]
        [ / [<alpha-value> | none] ]? )

상대 색상 문법 내 lab() 함수에서 사용할 수 있는 구성 요소 키워드는 다음과 같습니다:

기본 색상의 투명도를 조절하는 여러 방법:

모든 조정은 손실 없이(가뮤트 클리핑 없음) 이루어지는데, lab()은 모든 가시 색상을 포함하기 때문입니다. 이는 sRGB 기반 함수(rgb(), hsl(), hwb() 등)의 알파 조정에는 해당되지 않습니다. 이러한 함수는 HSL이나 HWB 계산을 위해 sRGB로 변환해야 하며, 알파 투명도 조정 외에도 변환이 필요합니다.

색상의 채도를 완전히 제거하여 회색으로 만들고, 밝기는 그대로 유지:
--mycolor:  orchid;
// orchid는 lab(62.753 52.460 -34.103)
--mygray:  lab(from var(--mycolor) l 0 0)
// mygray는 lab(62.753 0 0)이며, rgb(59.515% 59.515% 59.515%)

4.7. 상대 Oklab 색상

Oklab 색상의 의미는 CSS Color 4 § 9.2 Oklab 및 OKLCh에서 정의됩니다.

oklab() 함수의 문법은 다음과 같이 확장됩니다:

oklab() = oklab([from <color>]?
          [<percentage> | <number> | none]
          [<percentage> | <number> | none]
          [<percentage> | <number> | none]
          [ / [<alpha-value> | none] ]? )

상대 색상 문법 내 oklab() 함수에서 사용할 수 있는 구성 요소 키워드는 다음과 같습니다:

4.8. 상대 LCH 색상

LCH 색상의 의미는 CSS Color 4 § 9.1 CIE Lab and LCH에서 정의됩니다.

lch() 함수의 문법은 다음과 같이 확장됩니다:

lch() = lch([from <color>]?
        [<percentage> | <number> | none]
        [<percentage> | <number> | none]
        [<hue> | none]
        [ / [<alpha-value> | none] ]? )

상대 색상 문법 내 lch() 함수에서 사용할 수 있는 구성 요소 키워드는 다음과 같습니다:

테스트
lch(from peru calc(l * 0.8) c h) peru보다 20% 더 어두운 색상을 생성하며, 채도와 색상은 그대로 유지됩니다. 결과는 lch(49.80256 54.0114 63.6769) 입니다.
이 예시는 색상각에 180도를 더하여 보색을 만듭니다.
--accent:  lightseagreen;
--complement:   lch(from var(--accent) l c calc(h + 180));

lightseagreen은 lch(65.4937 39.4484 190.1013)이고, --complement는 lch(65.4937 39.4484 370.1013) 입니다.

색상을 완전히 무채색으로 바꿔서 동일한 명도를 유지하는 예시:
--mycolor:  orchid;
// orchid는 lch(62.753 62.571 326.973)
--mygray:  lch(from var(--mycolor) l 0 h)
// mygray는 lch(62.753 0 326.973)이고, rgb(59.515% 59.515% 59.515%) 와 같습니다.

이제 (색상은 유지됨) 다시 채도를 올리면

--mymuted:  lch(from var(--mygray) l 30 h);
// mymuted는 lch(62.753 30 326.973)이고, rgb(72.710% 53.293% 71.224%) 와 같습니다.

하지만 HSL과는 달리, 조작 결과가 항상 가시색 영역에 들어간다는 보장은 없습니다.

이 예시는 동일한 명도와 채도를 가진 새로운 색상을 만드려고 하지만, 색상각이 120도 변경된 삼색조(triad)입니다. 원본 색상은 RGB 색역 안에 있지만, LCH에서 색상각을 회전하면 색역 밖의 색상이 생성됩니다.
--mycolor:  lch(60% 90 320);
lch(from var(--mycolor) l c calc(h - 120));

이 결과는 매우 높은 채도의 청록색 lch(60% 90 200)이며, color(srgb -0.6 0.698 0.772)로 sRGB에서 색역을 벗어난 값(빨간색 음수)입니다. 실제로 display-p3에서도 색역을 벗어납니다: color(display-p3 -0.46 0.68 0.758) 그리고 rec2020에서도 마찬가지: color(rec2020 -0.14 0.623 0.729).

sRGB 색역 내에서 가장 가까운 색상은 lch(60.71% 37.56 201.1)이며, rgb(0% 64.2% 66.3%)입니다. 채도 차이는 매우 큽니다(37.5, 원래 90).

CIE CH 평면에서 상대 색상 조작을 보여주는 다이어그램입니다. ab 축이 표시되어 있으며, 중앙에서 교차합니다. 중앙 명도 축을 내려다보고 있습니다. sRGB 색공간의 최대 색역은 불규칙하고 볼록한 다각형으로 표시됩니다.

이 다이어그램은 CIE ab 평면에서 sRGB 색역을 보여줍니다. 작은 원은 주요 및 보조 색상을 나타냅니다. 원본 색상(큰 원)은 sRGB에서 색역 안에 있지만; 색상각이 -120° 회전되면 색역 밖(회색 채움과 빨간 테두리)으로 표시됩니다. 색역 맵핑된 결과는 채도가 훨씬 낮습니다.

동일한 작업을 HSL에서 수행하면 색역 내 결과가 나오지만, 다른 면에서 만족스럽지 않습니다:

--mycolor:  lch(60% 90 320);
hsl(from var(--mycolor) calc(h - 120) s l);

HSL에서 --mycolor는 hsl(289.18 93.136% 65.531%)이며, 120도를 빼면 hsl(169.18 93.136% 65.531%)가 됩니다. 이 결과를 다시 LCH로 변환하면 lch(89.0345% 49.3503 178.714) 입니다. HSL에서 색상 회전으로 명도는 60%에서 89%로 크게 증가했고, 채도는 90에서 49로 감소했으며, 색상각은 실제로 120이 아니라 141도 변화했습니다.

4.9. 상대 OkLCh 색상

OkLCh 색상의 의미는 CSS Color 4 § 9.2 Oklab 및 OKLCh에서 정의되어 있습니다.

oklch() 함수의 문법이 다음과 같이 확장됩니다:

oklch() = oklch([from <color>]?
          [<percentage> | <number> | none]
          [<percentage> | <number> | none]
          [<hue> | none]
          [ / [<alpha-value> | none] ]? )

상대 색상 구문 oklch() 함수 내에서, 허용되는 구성요소 키워드는 다음과 같습니다:

테스트

OkLCh는 지각적으로 균일하고 색도를 보존하며, 각 축이 색상의 쉽게 이해되는 속성에 해당하므로, 색상 조작에 적합한 선택입니다.

이 예제에서, 목표는 다시 동일한 밝기와 색도를 가진 새로운 색상을 생성하는 것입니다. 그러나 삼원색(색상각은 120도 차이)이 됩니다. 이 예제에서는 OkLCh에서 조작을 수행합니다. 원본 색상은 RGB 색역 내에 있지만, OkLCh에서 색상각을 회전하면 색역을 벗어난(out of gamut) 색상이 생성됩니다.
--mycolor:  lch(60% 90 320);
oklch(from var(--mycolor) l c calc(h - 120));

--mycolor는 oklch(0.69012 0.25077 319.893)입니다. 색상각에서 120을 빼면 매우 높은 색도의 청록색, oklch(0.69012 0.25077 199.893)가 생성되며 이는 sRGB 색역을 벗어난 것이고, color(srgb -0.6018 0.7621 0.8448) 음수의 적색 성분이 그 증거입니다. 색도를 줄이면 색역 내로 들어오게 되며, oklch(0.69012 0.1173 199.893)가 됩니다. OkLCh 색도는 0.251에서 0.117로 감소합니다.

4.10. 상대 알파 색상

상대 알파 색상은 원본 색상을 참조하며, 알파 채널만 변경합니다. 알파 채널의 의미는 CSS Color 4 § 4.2 색상에서 투명도 표현: <alpha-value> 문법에서 정의되어 있습니다.

alpha() 함수(이 단계에서 새로 도입됨)의 문법은 다음과 같습니다:

alpha() = alpha([from <color>]
          [ / [<alpha-value> | none] ]? )

상대 색상 구문 alpha() 함수 내에서, 허용되는 구성요소 키워드는 다음과 같습니다:

원본 색상의 색상 구성 요소는 변경되지 않으며, 알파 구성 요소만 수정 또는 대체됩니다. 이 함수의 결과는 원본 색상의 색상 공간에 유지됩니다.

예를 들어, 여기서는 결과가 원본 색상과 같으나, 알파가 80%로 변경됩니다
--mycolor:  oklch(60% 0.25 315 / 0.3);
 alpha(from var(--mycolor) / 80%);
예를 들어, 여기서는 결과가 원본 색상과 같으나, 알파가 원본 색상의 절반으로 변경됩니다
--mycolor:  oklch(60% 0.25 315 / 0.8);
 alpha(from var(--mycolor) / calc(alpha * 0.5));

5. 미리 정의된 및 사용자 정의 색상 공간 지정: color() 함수

color() 함수는 특정 색상 공간에서 색상을 지정할 수 있게 해줍니다 (다른 색상 함수들이 대부분 암시적으로 sRGB 색상 공간을 사용하는 것과 달리).

이 레벨에서는 color() 함수가 CSS Color 4 §  10. 미리 정의된 색상 공간에서 지정된 사전 정의 공간뿐만 아니라, 사용자 정의 색상 공간도 허용하도록 확장됩니다.

또한 절대 색상뿐만 아니라 상대 색상도 허용하도록 확장됩니다.

문법은 이제 다음과 같습니다:

color() = color( [from <color>]? <colorspace-params> [ / [ <alpha-value> | none ] ]? )
<colorspace-params> = [<custom-params> | <predefined-rgb-params> | <xyz-params>]
<custom-params> = <dashed-ident> [ <number> | <percentage> | none ]+
<predefined-rgb-params> = <predefined-rgb> [ <number> | <percentage> | none ]{3}
<predefined-rgb> = srgb | srgb-linear | display-p3 | a98-rgb | prophoto-rgb | rec2020
<xyz-params> = <xyz-space> [ <number> | <percentage> | none ]{3}

color 함수는 명시적으로 지정된 색상 공간에서 색상을 지정하는 매개변수를 받습니다.

아래 설명된 대로 잘못된 색상 또는 유효한 색상을 나타냅니다.

잘못된 색상이 아닌 모든 색상은 유효한 색상입니다.

유효한 색상이어도 출력 장치(화면, 프로젝터, 프린터)에서 생성 가능한 색상 범위 밖일 수 있습니다. 이 경우 해당 색상 공간에 대해 색역 밖(out of gamut)이라고 합니다.

색역 밖의 색상은 구성 요소 값이 0 또는 0%보다 작거나, 1 또는 100%보다 클 수 있습니다. 이는 잘못된 색상이 아니며, 대신 표시를 위해 색역 맵핑이 상대 컬러리메트릭 방식으로 수행되어, 계산값 단계에서 0/0%~1/100% 범위로 맞춰집니다.

유효한 색상은 출력 장치(화면 또는 프린터)의 색역 안에 있거나, 색역 밖에 있습니다.

5.1. 상대 color() 함수 색상

상대 색상 구문 color() 함수에서 <custom-params>를 사용하는 경우, 허용되는 구성요소 키워드의 개수와 이름은 다음과 같습니다:

상대 색상 구문 color() 함수에서 <predefined-rgb-params>를 사용하는 경우, 허용되는 구성요소 키워드는 다음과 같습니다:

상대 색상 구문 color() 함수에서 <xyz-params>를 사용하는 경우, 허용되는 구성요소 키워드는 다음과 같습니다:

상대 색상 구문 color() 함수에서 <predefined-rgb-params> 또는 <xyz-params> 중 하나를 사용하는 경우, 추가로 허용되는 구성요소 키워드는 다음과 같습니다:

매개변수는 다음 형식을 가집니다:

테스트
예시: CIE XYZ D65 색상 공간의 상대 색상 구문을 사용해 기준 색상의 채도는 동일하게, 명도(luminance)는 정확히 절반인 색상을 생성합니다:
--base:  color(display-p3 0.7 0.5 0.1);
--dark:  color(from var(--base) xyz-d65 calc(x/2) calc(y/2) calc(z/2));

원본 색상은 color(xyz-d65 0.281 0.253 0.044)이고, 상대 색상은 color(xyz-d65 0.14 0.126 0.022)입니다.

5.2. 사용자 정의 색상 공간

CSS는 색상을 색상 프로필 참조로 지정할 수 있도록 허용합니다. 예를 들어 교정된 CMYK 프린터, 또는 RGB 색상 공간, 혹은 다른 종류의 색상/흑백 출력 장치(특성화된)를 사용할 수 있습니다.

이 예시는 네 가지 교정된 색상을 지정합니다: 두 개는 사용자 정의 공간 (SWOP-coated CMYK 인쇄기, 그리고 광색역 7잉크 프린터), 나머지 두 개는 미리 정의된 공간 (ProPhoto RGB, display-p3 RGB 공간)입니다. 모든 경우, 숫자 매개변수는 0.0~1.0 범위입니다 (예: 0~255가 아님).
color: color(--swopc 0.0134 0.8078 0.7451 0.3019);
color: color(--indigo 0.0941 0.6274 0.3372 0.1647 0 0.0706 0.1216);
color: color(prophoto-rgb 0.9137 0.5882 0.4784);
color: color(display-p3 0.3804 0.9921 0.1412);

미리 정의된 색상 공간 CSS Color 4 §  10. 미리 정의된 색상 공간을 사용하지 않는 색상은 <dashed-ident>를 사용하여 구분하며, 스타일시트 어딘가에 @color-profile at-rule이 필요합니다. 이름을 프로필 데이터와 연결합니다.

테스트
@color-profile --swopc {
  src: url('http://example.org/swop-coated.icc');}
@color-profile --indigo {
  src: url('http://example.org/indigo-seven.icc');}

5.3. 색상 프로필 지정: @color-profile at-rule

@color-profile 규칙은 나중에 color() 함수에서 색상을 지정할 때 사용할 수 있는 색상 프로필을 정의하고 이름을 지정합니다.

정의 방식은 다음과 같습니다:

@color-profile = @color-profile [<dashed-ident> | device-cmyk] { <declaration-list> }
테스트

<dashed-ident>색상 프로필의 이름을 지정하며, CSS 스타일시트에서 이 이름으로 사용할 수 있습니다. 또는 device-cmyk 키워드는 이 색상 프로필이 유효하다면 device-cmyk로 지정된 색상을 해석할 때 사용됨을 의미합니다.

@color-profile 규칙은 이 명세에서 정의된 설명자를 허용합니다.

이름: src
대상: @color-profile
값: <url>
초기값: 해당없음

src 설명자는 색상 프로필 정보를 가져올 URL을 지정합니다.

동일한 이름의 @color-profile 규칙이 여러 개 정의된 경우, 문서 내에서 마지막에 오는 규칙이 우선하며, 이전 규칙들은 모두 무시됩니다.

가져온 ICC 프로파일이 유효하려면

프로파일이 유효하지 않으면, 이 프로파일을 참조하는 모든 CSS 색상은 유효하지 않은 색상이 됩니다.

외부 색상 프로파일을 가져오려면, @color-profile 규칙 rule이 주어졌을 때, 스타일 리소스를 가져오기 규칙에 따라 rule의 URL을 사용해 ruleOrDeclaration은 rule로, destination은 "color-profile", CORS 모드는 "cors"로 설정하며, processResponse는 response |/res|와 null, 실패 또는 바이트 스트림 byteStream을 인자로 받아 실행합니다: 만약 byteStream이 바이트 스트림이라면, |byteStream|에서 파싱된 색상 프로파일을 적용합니다.

참고: ICC 프로파일의 인터넷 미디어 타입("MIME type") 은 application/vnd.iccprofile입니다.

이름: rendering-intent
대상: @color-profile
값: relative-colorimetric | absolute-colorimetric | perceptual | saturation
초깃값: relative-colorimetric

색상 프로파일에는 "렌더링 의도(rendering intents)"가 포함되며, 이는 색상 프로파일이 정의된 색역보다 작은 색역으로 색상을 감마핑하는 방식을 정의합니다. 일반적으로 프로파일에는 하나의 의도만 있지만, 둘 이상인 경우 rendering-intent 디스크립터로 사용할 의도를 선택합니다.

네 가지 렌더링 의도 유형은 [ICC]입니다:

relative-colorimetric
미디어 상대 컬러리메트릭은 목적 매체의 색역에 포함되는 소스 색상을 각 미디어의 화이트 포인트에 대해 상대적으로 변경하지 않아야 합니다. 목적 매체 색역을 벗어난 소스 색상은 다양한 방법을 사용해 색역 경계에 맵핑됩니다.

미디어 상대 컬러리메트릭 렌더링 의도는 소스 매체 블랙포인트를 목적 매체 블랙포인트로 맵핑하는 블랙 포인트 보정과 함께 자주 사용됩니다. 이 방법은 소스 화이트 포인트를 목적 화이트 포인트로 맵핑해야 하며, 블랙 포인트 보정이 쓰이면 소스 블랙 포인트도 목적 블랙 포인트로 맵핑해야 합니다. 적응 알고리즘을 사용해 화이트 포인트 변화에 맞게 조정해야 하며, 출발과 목적 색역 모두에 포함되는 색상의 상대적 관계를 유지해야 합니다. 목적 색역에 포함되지 않는 색상의 상대적 관계는 변경될 수 있습니다.

absolute-colorimetric
ICC-절대 컬러리메트릭은 목적 매체 색역 안에 들어가는 소스 색상을 채택된 화이트(완전히 반사하는 확산체)에 대해 상대적으로 변경하지 않아야 합니다. 색역을 벗어난 소스 색상은 다양한 방법을 통해 색역 경계에 맵핑됩니다. 이 방법은 색역 내에 있는 색상에 대해 가장 정확한 색상 매칭을 제공하지만, 목적 매체 화이트 포인트가 소스의 것보다 낮을 경우 하이라이트가 잘릴 수 있습니다. 그러므로 정확한 색상 매칭이 필요하고 하이라이트 손실이 중요하지 않은 경우에만 사용하는 것이 권장됩니다.

이 방법은 색상 변환 시 반드시 화이트 포인트 및 블랙 포인트 매칭을 비활성화해야 합니다. 일반적으로 이 옵션은 테스트 목적이 아니면 권장하지 않습니다.

perceptual
이 방법은 특히 소스와 목적지가 크게 다를 때(예: 화면 이미지를 반사 인쇄로 재현할 때) 이미지에 주로 사용됩니다. 소스 이미지의 색상을 목적 매체에 최적화해 재현하며, 이 과정은 독자적 방법을 사용합니다. 이 재최적화는 소스 및 목적 색역 모두에서 색상이 변경될 수 있지만, Perceptual 변환은 재현시 원본의 기본적 예술적 용도를 유지해야 합니다. 원본 이미지의 오류를 자동으로 보정하지 않습니다.

참고: v2 ICC 프로파일에는 명확한 Perceptual 기준 매체가 없으므로 상호운용성 문제가 발생할 수 있습니다. v2 ICC 프로파일을 사용하는 경우, Perceptual 렌더링 의도보다는 블랙 포인트 보정이 적용된 미디어 상대 컬러리메트릭 렌더링 의도를 사용하는 것이 더 안전합니다. 단, 사용될 특정 소스 및 목적 프로파일 결합이 원하는 결과를 주는지 미리 확인한 경우는 예외입니다.

이 방법은 맵핑된 타깃 장치 색역 내에서 픽셀 사이의 상대 색상값을 유지해야 합니다. 또한, 타깃 색역에 이미 포함된 픽셀도 색상 어긋남과 단절을 방지하고 장면의 전체적인 외관을 최대한 유지하기 위해 변환될 수 있습니다.

saturation
이 옵션은 원본의 상대 채도(색도)를 보존하고 솔리드 색상을 선명하게 유지하도록 고안되었습니다. 그러나 Perceptual 의도와 마찬가지로 상호운용성 문제가 있으며, v4 프로파일을 사용해도 솔리드 컬러 보존은 기준 매체 해결책에 적합하지 않으므로 문제가 해결되지 않습니다. 이 렌더링 의도는 사용할 소스와 목적 프로파일 조합이 원하는 결과를 낸다는 것을 확인한 경우가 아니라면 권장되지 않습니다. 이 옵션은 원본 픽셀의 상대 채도(색도) 값을 보존해야 합니다. 색역을 벗어난 색상은 같은 채도를 유지하며 색역 내로 조정되어야 합니다.
이름: components
대상: @color-profile
값: <ident>#
초깃값: n/a

색상 프로파일은 다양한 개수의 색상 구성요소를 가진 색상 공간을 정의할 수 있습니다. 예를 들어, 시안, 마젠타, 옐로우, 블랙(CMYK) 프로파일은 c, m, y, k라는 네 개 구성요소를 갖습니다. 반면, 4채널 가산형 스크린 프로파일은 r, g, y, b라는 네 개의 구성 요소를 가질 수도 있습니다.

이 디스크립터의 값은 <ident> 토큰의 쉼표로 구분된 목록입니다. 각 <ident>> 는 구성요소의 이름이며, 색상 프로파일에서 사용되는 순서를 따릅니다. 토큰의 개수는 구성요소 수를 정의합니다.

이 디스크립터는 시안, 마젠타, 옐로우, 블랙이라는 네 개의 구성요소가 있음을 선언합니다:
components: cyan, magenta, yellow, black

아래 디스크립터는 더 간결한 이름을 사용합니다:

components: c,m,y,k
이 디스크립터는 시안, 마젠타, 옐로우, 블랙, 오렌지, 그린, 바이올렛이라는 7개의 구성요소가 있음을 선언합니다:
components: cyan, magenta, yellow, black, orange, green, violet

구성요소가 ASCII 대소문자 구분 없이 none과 일치하는 경우, 해당 디스크립터는 유효하지 않습니다. 이는 누락 값 토큰과 충돌하기 때문입니다.

구성요소로 선택한 이름이 CSS Values 4 § 10.7.1 Numeric Constants: e, pi에 정의된 CSS 숫자 상수와 충돌하는 경우에도 해당 구성요소는 여전히 유효하지만, calc() 내에서는 숫자 상수가 해당 구성요소 명을 가리는(shadowing) 현상으로 인해 예기치 않은 결과가 발생할 수 있습니다.

이 디스크립터에서는 부적절하게 구성요소 이름을 pi로 지정하여, 상대 색상 문법에서 예기치 않은 결과를 가져옵니다.
@color-profile --unwise {
  src: url(https://example.com/unwise);
  components: mi, pi, ni;
}
--base: color(--unwise 35% 20% 8%);
--accent: color(from var(--base) mi calc(pi * 2) calc(ni / 2));

여기서 --accent의 구성요소 값은 35%, 3.14159265358979 * 2 = 6.28318530717959, 4%입니다.

5.4. CSS와 인쇄: 교정된 CMYK 및 기타 인쇄 색상 공간 사용

@color-profile at-rule은 RGB 색상 공간에만 국한되지 않습니다. 화면은 일반적으로 색상을 RGB로 직접 표시하지만, 프린터는 종종 색상을 CMYK로 표현합니다.

Cyan, Magenta, Yellow, Black(CMYK)로 보정된 4색 인쇄 또는 Cyan Magenta Yellow Black Orange Green Violet(CMYKOGV)와 같은 추가 잉크를 사용하는 고충실도 광색역 인쇄도 인쇄할 때 사용하는 잉크, 종이, 총 잉크 사용율 및 장비 조합에 해당하는 ICC 프로파일만 있으면 CSS에서 사용할 수 있습니다.

예를 들어 ISO 12647-2:2004 / Amd 1:2007 오프셋 인쇄를 FOGRA39 특성데이터와 115gsm 코팅지, 잉크 한계 300% 총 면적 커버리지 [FOGRA39]와 함께 사용하는 경우입니다.
@color-profile --fogra39 {
  src: url('https://example.org/Coated_Fogra39L_VIGC_300.icc');
}
.header {
  background-color:   color(--fogra39 0% 70% 20% 0%);
  }

여기서 color() 함수는 먼저 우리가 지정한 프로파일 이름을 명시한 후, 시안, 마젠타, 옐로우, 블랙의 비율(%)을 지정합니다.

이 프로파일에서는, 지정된 값이  lab(63.673303% 51.576902 5.811058)로 평가되고, 이는  rgb(93.124, 44.098% 57.491%)입니다.

주어진 CMYK 조합의 결과 색상을 알 수 있으므로, 인쇄 출력을 화면에 시각화(소프트프루프)할 수 있습니다.

또한, 색상을 알아야 하는 작업(안티 앨리어싱, 합성, 그라디언트 색상 사용 등)도 정상적으로 진행할 수 있습니다.

색상 칸의 격자. 열은 6개(A~F), 행은 4개(1~4)가 있습니다.

색상 정확도를 확보하기 위해 인쇄·사진 업계에서 사용하는 컬러 체크용 판입니다. 각 패치마다 측정된 Lab 평균값이 제공됩니다. 사각형은 Lab 값을 sRGB로 변환한 색상입니다. 거의 보이지 않는 동그라미는 Lab 값을 FOGRA51 [FOGRA51] ICC 프로파일로 CMYK로 변환 후 다시 그 프로파일로 역방향 변환한 Lab 값을 sRGB로 변환한 색상입니다.

동그라미가 좀 더 잘 보이는 영역(3행 1열)은 사용된 FOGRA51 CMYK 색역을 약간 벗어난 색상이 원인입니다.

아래 표는 각 패치에 대해 라운드트립 전후 Lab 값의 DeltaE 2000 차이를 보여줍니다. DeltaE 2000이 1 이상이면 눈으로 구분 가능합니다.

A B C D E F
1 0.06 0.07 0.03 0.04 0.06 0.17
2 0.03 0.75 0.05 0.06 0.03 0.02
3 1.9 0.04 0.06 0.05 0.02 0.05
4 0.03 0.08 0.03 0.03 0.04 0.80
이 예는 ISO 12647-2:2004 규격에 따른 오프셋 인쇄용으로 CGATS/SWOP TR005 2007 특성데이터와 5등급 용지, 잉크 한계 300% 총 면적 커버리지, 중간 회색 성분 교체(GCR)를 적용합니다.
@color-profile --swop5c {
  src: url('https://example.org/SWOP2006_Coated5v2.icc');
}
.header {
  background-color:   color(--swop5c 0% 70% 20% 0%);
}

이 프로파일에서도 동일한 CMYK 비율(이전 예와 동일)로  lab(64.965217% 52.119710 5.406966), 즉  rgb(94.903% 45.248% 59.104%)인 색상이 나옵니다.

지정한 CMYK 색상이 sRGB 색역 바깥에 있다는 것을 안다면, 미디어쿼리 등을 이용하여 대체 색상도 지정할 수 있습니다.

이 예시에서는 이전과 동일한 FOGRA39 셋업을 사용하지만, sRGB 색역을 벗어나는 밝은 녹색을 지정합니다. 그러나 display-p3 색역 안에는 들어갑니다. 따라서 광색역 디스플레이와 인쇄에서는 원색 그대로 사용되고, sRGB 화면에서는 약간 덜 강렬한 대체 색상이 사용됩니다.
@media (color-gamut: srgb) {
  .header {
    background-color:   rgb(8.154% 60.9704% 37.184%);
    }
}
@media print, (color-gamut: p3){
  .header {
    background-color:   color(--fogra39 90% 0% 90% 0%);
    }
}

이 CMYK 색상은 lab(56.596645% -58.995875 28.072154) 또는 lch(56.596645% 65.33421077211648 154.5533771086801)에 해당합니다. sRGB로 변환하면 rgb(-60.568% 62.558% 32.390%)가 되어, 적색 성분이 크게 음수인 것으로 보아 색역 바깥입니다.

색도를 줄여서 색역 내로 들어오게 하면  lch(56.596645% 51 154.5533771086801) 즉  rgb(8.154% 60.9704% 37.184%)가 되고 이는 수동으로 지정한 대체 색상입니다.

광색역 화면에서는 이 색상이 display-p3 색역 안에 있으므로 (display-p3(0.1658 0.6147 0.3533)입니다) 그대로 표시됩니다.

색상은 4개의 잉크(CMYK)에만 국한되지 않습니다. 예를 들어 광색역 7색 잉크세트도 사용할 수 있습니다.

이 예시는 CMYKOGV 7색 인쇄를 위해 FOGRA55 베타 데이터셋 [FOGRA55]을 사용합니다. 네 개의 잉크(블랙, 시안, 마젠타, 옐로우)는 FOGRA51 셋과 같고, 결과도 같습니다. 나머지 3가지 잉크는:

측정 기준은 M1로, 이는 종이 속 형광증백제가 고려되고 분광광도계에 UV 차단 필터가 없다는 뜻입니다.

@color-profile --fogra55beta {
  src: url('https://example.org/2020_13.003_FOGRA55beta_CL_Profile.icc');
}
.dark_skin {
  background-color: 
  color(--fogra55beta 0.183596 0.464444 0.461729 0.612490 0.156903 0.000000 0.000000);
}
.light_skin {
  background-color: 
  color(--fogra55beta 0.070804 0.334971 0.321802 0.215606 0.103107 0.000000 0.000000);
}
.blue_sky {
  background-color: 
  color(--fogra55beta 0.572088 0.229346 0.081708 0.282044 0.000000 0.000000 0.168260);
}
.foliage {
  background-color: 
  color(--fogra55beta 0.314566 0.145687 0.661941 0.582879 0.000000 0.234362 0.000000);
}
.blue_flower {
  background-color: 
  color(--fogra55beta 0.375515 0.259934 0.034849 0.107161 0.000000 0.000000 0.308200);
}
.bluish_green {
  background-color: 
  color(--fogra55beta 0.397575 0.010047 0.223682 0.031140 0.000000 0.317066 0.000000);
}

5.5. CMYK 색상을 Lab으로 변환하기

교정된 CMYK 색상 공간에서 Lab으로의 변환은 일반적으로 ICC 프로필에서 Lab 값을 조회하여 이루어집니다.

5.6. Lab 색상을 CMYK로 변환하기

인쇄를 위해서는 Lab 색상을 프린터의 색상 공간으로 변환해야 합니다.

이는 일반적으로 ICC 프로필에서 CMYK 값을 조회하여 이루어집니다.

6. 보정되지 않은 CMYK 색상: device-cmyk() 함수

프린터가 보정되지 않은 경우에도, 특정 잉크 조합의 출력 결과를 실험이나 출력 샘플 견본집을 통해 알고 있을 때, CMYK 색상을 장치 의존적으로 표현하는 것이 유용할 수 있습니다.

참고: 실제 결과 색상이 미지수이기 때문에, CSS 처리기는 근사값을 산출할 수 있습니다. 이 근사값은 실제 인쇄 결과와 크게 다를 수 있습니다.

device-cmyk() 함수는 작성자가 이런 방법으로 색상을 지정할 수 있게 해줍니다:

device-cmyk() = <legacy-device-cmyk-syntax> | <modern-device-cmyk-syntax>
<legacy-device-cmyk-syntax> = device-cmyk( <number>#{4} )
<modern-device-cmyk-syntax> = device-cmyk( <cmyk-component>{4} [ / [ <alpha-value> | none ] ]? )
<cmyk-component> = <number> | <percentage> | none

device-cmyk() 함수의 인자들은 시안, 마젠타, 옐로우, 블랙 순서로 0과 1 사이의 숫자나 최신 문법에서는 0%~100% 사이의 백분율로 구성 요소를 지정합니다. 이 두 사용법은 동치이며, 선형적으로 변환됩니다. 0 또는 0% 미만이거나 1 또는 100% 초과인 값도 유효하지 않은 것은 아니며, 계산값 산출 시 0/0% 또는 1/100%로 클램프(clamp)됩니다.

최신 문법에서는 다섯 번째 인자가 색상의 알파 값을 지정합니다. 이는 rgb() 함수의 네 번째 인자와 똑같이 해석됩니다. 생략하면 기본값은 100%입니다.

역사적 이유로, device-cmyk()레거시 색상 문법도 지원합니다.

일반적으로, 인쇄 기반 응용프로그램은 실제로 색상을 CMYK로 저장하고 그 형태로 프린터에 전송합니다. 그러나 이러한 색상은 색채측정적 해석을 가지지 않으며, 그러므로 그라디언트, 합성, 블렌딩 등에는 사용할 수 없습니다.

따라서 장치 CMYK 색상은 동등한 색상으로 변환되어야 합니다. 이것은 HSL이나 HWB를 RGB로 변환하는 것처럼 단순하지 않으며, 실제 변환은 출력 장치의 정확한 특성에 따라 달라집니다.

  1. 사용자, 작성자, 혹은 user-agent 스타일시트에 @color-profile 정의가 있고, src 디스크립터로 지정된 리소스를 불러올 수 있으며, 그 리소스가 유효한 CMYK ICC 프로파일이고, user agent가 ICC 프로파일을 처리할 수 있다면, device-cmyk() 함수의 계산값은 CMYK 색상의 Lab 값이어야 합니다.
  2. 그렇지 않으면, device-cmyk() 함수의 계산값은 다음의 단순화 알고리즘으로 변환한 CMYK 색상의 sRGB 값이어야 합니다.
예를 들어 @color-profile이 없는 경우, 다음 색상들은 단순 변환을 통해 동등해집니다.
color:  device-cmyk(0 81% 81% 30%);
color:  rgb(178 34 34);
color:  firebrick;
예제 스타일시트에 명시된 @color-profile을 사용할 경우, 색채측정적 변환을 통해 다음 색상들이 동등하게 됩니다.
color:  device-cmyk(0 81% 81% 30%);
color:  lab(45.060% 45.477 35.459)
color:  rgb(70.690% 26.851% 19.724%);

이 단순 변환은 잉크의 색채측정 정보, 도트 게인, RGB 공간의 색채측정 정보 등을 모르기 때문에 반드시 근사적입니다.

색상 칸의 격자. 열은 6개(A~F), 행은 4개(1~4)가 있습니다.

색상 정확도를 유지하기 위해 인쇄 및 사진 업계에서 사용하는 컬러 체크용 판입니다. 각 패치마다 측정된 Lab 평균값이 있습니다. 사각형은 Lab 값을 sRGB로 변환한 값입니다. 동그라미는 Lab 값을 ICC 프로파일로 CMYK로 변환한 뒤, 다시 단순 변환으로 sRGB로 변환한 값입니다.

아래 표는 각 패치별로, 원래 Lab과 CMYK 라운드트립 후 Lab 값의 DeltaE 2000 차이를 보여줍니다. DeltaE 2000이 1 이상이면 육안으로 식별 가능하고, 5 이상이면 완전히 다른 색상입니다.

A B C D E F
1 11.33 9.36 5.66 7.52 12.39 21.58
2 6.40 8.79 11.77 17.16 11.91 3.97
3 12.1 17.00 3.38 1.94 18.08 14.97
4 1.89 6.56 7.85 8.76 9.82 10.29

6.1. 교정되지 않은 CMYK와 sRGB 기반 색상 간의 단순 변환

CMYK를 RGBA로 단순 변환하는 방법:

RGBA를 CMYK로 단순 변환하는 방법:

7. 사용된 색상 모드에 반응하기: light-dark() 함수

시스템 색상은 현재 사용 중인 color-scheme 값에 반응할 수 있습니다. light-dark() 함수는 동일한 기능을 저자에게 제공합니다.

light-dark() = light-dark( <color>, <color> )

이 함수는 사용된 색상 모드light 또는 알 수 없는 상태면 첫 번째 색상의 계산값으로, 사용된 색상 모드dark이면 두 번째 색상의 계산값으로 평가됩니다.

테스트

8. 동적으로 충분한 대비의 텍스트 색상을 지정하기: contrast-color() 함수

색상이 동적으로 생성될 때, 이를 배경 색상으로 사용할 경우 충분한 대비를 제공하는 텍스트 색상을 지정하는 것은 종종 어려울 수 있습니다. contrast-color() 함수는 지정된 색상을 단색 배경으로 사용할 때 텍스트에 대해 충분한 색상 대비가 보장되는 색상을 자동으로 제공합니다.

참고: 가독성은 복잡한 주제이며, 충분한 색상 대비는 그 중 한 부분일 뿐입니다. 충분한 대비의 색상 쌍을 가진다고 해서 텍스트가 반드시 읽기 쉬운 것은 아니며, 이는 폰트, 텍스트 크기, 주변 색상 등 다양한 요인에 따라 달라집니다.

contrast-color() = contrast-color( <color> )

contrast-color()white 또는 black 중 텍스트에 대해 최대 색상 대비를 제공하는 색상으로 해석됩니다. 입력 색상이 단색 배경으로 사용될 때, whiteblack 모두 동일한 대비를 제공하면 white로 해석됩니다.

밝은 색 또는 어두운 색을 출력할지 결정하는 정확한 색상 대비 알고리즘은 이 수준에서는 UA(사용자 에이전트) 정의입니다.

참고: 향후 명세에서는 사용되는 대비 알고리즘, 용도, 반환되는 색상 등에 대해 더 많은 제어 기능이 추가될 예정입니다.

UA에는 WCAG 2.1 섹션 1.4.3 최소 대비 대비 비율 알고리즘만을 밝은색/어두운색 결정에 단순히 사용하지 말 것을 권장합니다. 이 알고리즘에는 여러 가지 알려진 문제점이 있습니다. 그러나 이 함수가 반환하는 색상은 WCAG 2.1 섹션 1.4.3 최소 대비 기준 AA 대형 텍스트에는 반드시 부합해야 합니다. 많은 저자들이 법적 요구사항을 충족해야 하기 때문입니다.

테스트

9. 색상 보간

9.1. 색상 보간을 위한 색상 공간

<color-interpolation-method>사용자 정의 색상 공간을 사용할 수 있도록 확장됩니다:

<color-space> = <rectangular-color-space> | <polar-color-space> | <custom-color-space>
<rectangular-color-space> = srgb | srgb-linear | display-p3 | display-p3-linear | a98-rgb | prophoto-rgb | rec2020 | lab | oklab | <xyz-space>
<polar-color-space> = hsl | hwb | lch | oklch
<custom-color-space> = <dashed-ident>
<hue-interpolation-method> = [ shorter | longer | increasing | decreasing ] hue
<color-interpolation-method> = in [ <rectangular-color-space> | <polar-color-space> <hue-interpolation-method>? | <custom-color-space> ]

<dashed-ident>는 유효한 @color-profile 규칙에서 선언되어 있어야 하며, 그렇지 않으면 <color-interpolation-method>는 유효하지 않습니다.

10. <color> 값 해석

10.1. color-mix() 값 해석

모든 <color> 매개변수가 해당 색상 공간의 색상으로 해석된다면, 계산값은 지정된 혼합 색상 공간에서 계산된 혼합 색상이 됩니다. 계산은 CSS Color 4 §  14. Resolving <color> Values에 따라 해석됩니다. 그렇지 않은 경우(currentColor가 함수에서 사용되었다면), 계산값은 각 <color> 매개변수를 CSS Color 4 §  14. Resolving <color> Values에 따라 해석한 color-mix() 함수가 되며, 이는 자식 요소로의 상속성을 보장합니다.

테스트

10.2. 상대 색상 구문 값 해석하기

모든 <color> 매개변수가 자신이 속한 색상 공간의 해당 색상으로 해석된다면, 계산값은 지정된 RCS 색상 공간에서 <color>의 절대값이 되며, CSS Color 4 §  14. Resolving <color> Values에 따라 해석됩니다.

테스트

그 외의 경우(함수에서 currentColor가 사용된 경우), 계산값은 상대 색상 구문 함수이며, 원본 <color> 매개변수는 CSS Color 4 §  14. <color> 값 해석하기에 따라 해석되어, 자식 요소로 상속이 유지됩니다.

테스트

10.3. device-cmyk 값 해석하기

계산값 및 사용값은 지정된 장치 특화 CMYK 색상이며, (구성 요소는 <number> 타입, <percentage> 타입 아님) 지정된 알파 구성 요소와 짝지어집니다 (<number> 타입, <percentage> 타입 아님; 지정하지 않으면 불투명이 기본값입니다).

사용값은 연산에 따라 달라질 수 있습니다; CMYK 지원 장치로 렌더링할 때는 CMYK 색상으로 렌더링될 수 있으며; 비-CMYK 색상과 혼합하거나 비-CMYK 장치로 렌더링할 때는, § 6 보정되지 않은 CMYK 색상: device-cmyk() 함수에 명시된 대로 변환되어야 합니다.

예시:
 device-cmyk(0% 70% 20% 0%)

명시값 및 사용값은

 device-cmyk(0 0.7 0.2 0)

구현체가 ICC 프로필을 이해하고 적절한 프로필이 설치되어 있다면, 사용값은

 lab(63.673% 51.577 5.811)

참고: 모든 색상과 마찬가지로, 사용값은 스크립트에서 접근할 수 없습니다.

11. 직렬화

이 절은 CSS Color 4 §  15. 색상 값 직렬화를 확장하여 color-mix(), device-cmyk(), 그리고 상대 색상 함수의 결과 직렬화를 추가합니다.

이 섹션에서 명세에 사용되는 문자열과 해당 문자 코드는 다음과 같습니다.

문자열 문자
" " U+0020 SPACE
"," U+002C COMMA
"-" U+002D HYPHEN-MINUS
"." U+002E FULL STOP
"/" U+002F SOLIDUS

문자열 "."은 지역과 상관없이 소수점 구분자로 사용되며, 천 단위 구분자는 사용하지 않습니다.

일반적으로, 결과의 alpha가 정확히 1이면, 직렬화 시 생략됩니다; 1(완전 불투명)이 암묵적 기본값입니다.

11.1. color-mix() 직렬화

color-mix() 함수의 선언값을 직렬화하면 문자열 "color-mix(in "이 나오고, 이어서 지정된 <color-space>가 모두 소문자로 작성되며, 그 다음에 ", "가, 첫 번째로 지정된 색상이 이어지고, 한 칸 띄우고 첫 번째 백분율의 직렬화(아래 참고) 그 다음 ", "가, 다음으로 두 번째 지정 색상, 두 번째 백분율의 직렬화가 나와, 마지막으로 ")"로 끝납니다.

color-mix() 함수 선언값의 첫 번째 백분율 직렬화는 다음과 같이 정의됩니다:

color-mix() 함수 선언값의 두 번째 백분율 직렬화는 다음과 같이 정의됩니다:

참고: calc() 값은 알 수 없는 값으로 간주되므로 절대 50%와 같지 않고, 무언가와 더해 100%가 되는 경우도 없습니다.

예를 들어,
color-mix(in oklab, teal, peru 40%)

의 선언값 직렬화는 "color-mix(in oklab, teal 60%, peru)"입니다.

아래 선언값

color-mix(in oklab, teal 50%, peru 50%)

의 직렬화는 "color-mix(in oklab, teal, peru)"입니다.

아래 선언값

color-mix(in oklab, teal 70%, peru 70%)

의 직렬화는 "color-mix(in oklab, teal 70%, peru 70%)"입니다. 이 값이 실제로는 최종적으로 50%씩 정규화되는 것은 퍼센트 정규화 이후에만 알 수 있기 때문입니다.

color-mix() 함수 결과의 직렬화는 혼합에 currentColor 키워드가 사용됐는지에 따라 달라집니다. 사용됐다면 결과는 선언값대로 직렬화됩니다. 이렇게 하면 color 프로퍼티가 다른 값을 갖는 자식 요소에도 정확한 혼합 비율이 적용될 수 있습니다. 그렇지 않으면 결과는 <color> 형식이며, CSS Color 4 §  15. 색상 값 직렬화 에 정의된 대로 직렬화됩니다. 사용되는 형식은 "in"으로 지정된 색상 공간에 따라 다릅니다:

혼합 색상 공간 표현 형식
srgb color(srgb r g b)
srgb-linear color(srgb-linear r g b)
display-p3 color(display-p3 r g b)
a98-rgb color(a98-rgb r g b)
prophoto-rgb color(prophoto-rgb r g b)
rec2020 color(rec2020 r g b)
hsl color(srgb r g b)
hwb color(srgb r g b)
xyz-d65 color(xyz-d65 x y z)
xyz-d50 color(xyz-d50 x y z)
xyz color(xyz-d65 x y z) ¹
lab lab(l a b)
lch lch(l c h)
oklab oklab(l a b)
oklch oklch(l c h)
¹
xyzxyz-d65의 별칭이기 때문입니다.
테스트

왕복(round-trip) 직렬화의 최소 정밀도는 CSS Color 4 §  15. <color> 값 직렬화에서 명시된 것과 동일합니다.

이 색상 혼합 결과는
color-mix(in lch, peru 40%, palegoldenrod)

"lch(79.7256 40.448 84.771)" 문자열로 직렬화됩니다. 아래 결과는

color-mix(in srgb, peru 40%, palegoldenrod)

"color(srgb 0.8816 0.7545 0.4988)" 문자열로 직렬화됩니다.

11.2. 원본 색상 직렬화

다른 색상 함수 내부에서 원본 색상으로 사용된 색상의 선언값을 직렬화할 때의 형식은 다음과 같습니다:

  1. rgb(), rgba(), hsl(), hsla()인 경우

참고: 현대 문법이든 레거시 문법이든 동일한 직렬화가 사용됩니다.

  1. hwb(), lab(), lch(), oklab(), oklch()인 경우

  1. color()의 경우

11.3. 상대 색상 함수 직렬화

상대 색상의 선언값 직렬화는 다음과 같습니다:

  1. rgb(), rgba(), hsl(), hsla()의 경우

  1. hwb(), lab(), lch(), oklab(), oklch()의 경우

  1. color()의 경우

예시: 다음 선언값의 직렬화는
OkLcH(from peru  l    c  h)

문자열 "oklch(from peru l c h)"입니다.

예시: 다음 선언값의 직렬화는
rgb(from red calc(r / 2) g calc(30%));

문자열 "rgb(from red calc(0.5 * r) g calc(30%))"이며, 계산값 직렬화는 "color(srgb 0.5 0 0.3)"입니다.

예시: 다음 선언값의 직렬화는
hsl(from hsl(none 10% 50%) h s l);

문자열 "hsl(from hsl(none 10% 50%) h s l)"이며, 계산값 직렬화는 "color(srgb 0.55 0.45 0.45)"입니다.

예시: 다음 선언값의 직렬화는
hsl(from hsl(127.9 302% 25.33%) h s l);

문자열 "hsl(from hsl(127.9 302% 25.33%) h s l)"이며, 계산값 직렬화는 "color(srgb -0.511666 1.018266 -0.310225)"입니다.

다음 HTML 사례(color 프로퍼티 주의):
<div id="example" 
  style="background-color: rgb(from currentcolor r g calc(b / 2)); 
  color: blue;">
</div>

여기서 background-color의 선언값 직렬화는 "rgb(from currentcolor r g calc(b / 2))"이고, 계산값 직렬화는 "color(srgb 0 0 0.5)"입니다.

상대 색상 함수 결과의 직렬화는 혼합 또는 참조에 currentColor원본 색상으로 사용된 경우에 따라 달라집니다. 이 경우 결과는 선언값 그대로 직렬화됩니다. 이렇게 하면 color 프로퍼티가 다른 값을 갖는 자식 요소에도 올바른 값이 사용됩니다. 그 외에는, 해석값(계산된 <color>)으로 직렬화되며, CSS Color 4 §  15. 색상 값 직렬화에서 정의됩니다.

표현 방법은 상대 색상의 색상 공간에 따라 달라집니다:

혼합 색상 공간 표현 형식
srgb color(srgb r g b)
srgb-linear color(srgb-linear r g b)
display-p3 color(display-p3 r g b)
a98-rgb color(a98-rgb r g b)
prophoto-rgb color(prophoto-rgb r g b)
rec2020 color(rec2020 r g b)
hsl color(srgb r g b)
hwb color(srgb r g b)
xyz-d65 color(xyz-d65 x y z)
xyz-d50 color(xyz-d50 x y z)
xyz color(xyz-d65 x y z)
lab lab(l a b)
lch lch(l c h)
oklab oklab(l a b)
oklch oklch(l c h)
테스트

왕복 직렬화의 최소 정밀도는 CSS Color 4 § 15.5 color() 함수의 값 직렬화에서 지정된 것과 동일합니다.

다음 색상 혼합 직렬화 예시:
lch(from peru calc(l * 0.8) calc(c * 0.7) calc(h + 180)) 

"lch(49.80224 37.80819 243.6803)" 문자열이 됩니다

11.4. 사용자 정의 색상 공간 직렬화

color() 컴포넌트 값의 보존 정밀도와 직렬화 값의 유효 숫자 개수는 이 명세에서 정의되어 있지 않으나, CMYK 색상 공간의 경우 최소한 8비트 정밀도로 왕복(round-trip)할 수 있을 만큼 충분해야 하며, 이는 뒤의 0이 생략되지 않는 한 최소 소수점 두 자리를 의미합니다.

다음 색상의 직렬화 값은

@color-profile --swop5c {src: url('https://example.org/SWOP2006_Coated5v2.icc');
}
.header {
background-color:    color(--swop5c  0% 70.0% 20.00% .0%);
}

"color(--swop5c 0 0.7 0.2 0)" 문자열입니다

11.5. device-cmyk 값 직렬화

device-cmyk() 값의 직렬화 형식은 계산값에서 파생되며, 함수 이름은 소문자로 표기한 device-cmyk() 형태를 사용합니다.

구성 요소 값은 10진수로 직렬화되며, <number>로 작성합니다. 각 구성 요소 값 사이에는 ASCII 공백 문자 " " 하나만 구분자로 사용해야 합니다.

어느 구성 요소 값에서든 소수점 이하에 0만 남으면 끝의 0 및 소수점도 생략해야 합니다.

다음 색상의 직렬화 값은

  device-cmyk(0 81% 81% 30%)

문자열 "device-cmyk(0 0.81 0.81 0.3)"입니다.

device-cmyk() 구성 요소 값의 보존 정밀도, 즉 직렬화에 포함될 유효숫자 자리수는 이 규격서에 정의되어 있지 않으나, 값이 8비트 정밀도로 왕복 가능해야 하며, 끝의 0이 생략되지 않았다면 최소 소수점 이하 두 자리까지 직렬화해야 합니다. 값은 +∞ 쪽으로 반올림해야 하며, 자르기(truncate)가 아닙니다.

알파값이 1이면 별도 표기하지 않습니다. 1이 아닌 알파값은 반드시 명시적으로 직렬화해야 하며, 문자열 " / " (ASCII 공백, 슬래시, 다시 공백) 으로 블랙("k") 색상 구성 요소 값과 알파값을 구분해야 합니다.

12. API

12.1. CSSColorProfileRule 인터페이스

CSSColorProfileRule 인터페이스는 @color-profile 규칙을 나타냅니다.

[Exposed=Window]
interface CSSColorProfileRule : CSSRule {
  readonly attribute CSSOMString name ;
  readonly attribute CSSOMString src ;
  readonly attribute CSSOMString renderingIntent ;
  readonly attribute CSSOMString components ;
};
name, 타입 CSSOMString, 읽기 전용
name 속성을 가져올 때 CSSOMString 객체를 반환해야 하며, 해당 규칙에 정의된 색상 프로필name 직렬화 값을 포함해야 합니다.
src, 타입 CSSOMString, 읽기 전용
renderingIntent, 타입 CSSOMString, 읽기 전용
components, 타입 CSSOMString, 읽기 전용
나머지 속성을 가져올 때는 해당 규칙에 정의된 연결된 설명자의 직렬화 값을 포함하는 CSSOMString 객체를 반환해야 합니다. 해당 규칙에 설명자가 지정되어 있지 않으면, 속성은 빈 문자열을 반환해야 합니다.

13. 기본 스타일 규칙

아래 스타일시트는 참고용이며, 규범적이지 않습니다. 이 스타일시트는 구현체가 HTML 패밀리 문서의 기본 스타일링으로 사용할 수 있습니다.

/* 데스크톱 사용자 에이전트의 하이퍼링크 기본 색상 */
:link { color: LinkText; }
:visited { color: VisitedText; }
:active { color: ActiveText; }

/* device-cmyk에 대한 합리적이고 보수적인 기본값 */
@color-profile device-cmyk {
  src: url('https://drafts.csswg.org/css-color-4/ICCprofiles/Coated_Fogra39L_VIGC_300.icc');
}

14. 색상 변환 샘플 코드

이 절은 규범적이지 않습니다.

device-cmyk의 단순 변환은 매우 간단합니다:

function naive(cmyk) {
  // CMYK 값 배열을 단순하게
  // sRGB로 변환
  let [cyan, magenta, yellow, black] = cmyk;
    let red = 1 - Math.min(1, cyan * (1 - black) + black);
    let green = 1 - Math.min(1, magenta * (1 - black) + black);
    let blue = 1 - Math.min(1, yellow * (1 - black) + black);
    return [red, green, blue];
}

15. 보안 관련 고지

이 명세는 CSS에 ICC 프로파일의 필요시에만 다운로드하는 기능을 추가합니다. 이 파일에는 실행 가능한 코드가 포함되어 있지 않으며, 따라서 보안 위험이 증가하지 않습니다.

16. 개인정보 보호 관련 고지

이 명세와 관련해 보고된 새로운 개인정보 보호 이슈는 없습니다.

17. 접근성 관련 고지

이 명세는 배경이 사용자 지정 색상(동적 색상 포함)인 텍스트를 위한 충분한 명암차를 보장할 수 있는 방법을 추가합니다.

18. 변경사항

18.1. 2025년 3월 18일 작업 초안 이후

18.2. 2024년 2월 29일 작업 초안 이후

18.3. 2022년 6월 28일 작업 초안 이후

18.4. 2022년 4월 28일 작업 초안 이후

18.5. 2021년 12월 15일 작업 초안 이후

18.6. 2021년 6월 1일 작업 초안 이후

18.7. 2020년 6월 10일 FPWD 이후

18.8. CSS Color 4에서의 변경사항

CSS Color 4와 비교해 주요 변화 중 하나는 CSS 색상이 더 이상 sRGB나 display-p3 같은 미리 정의된 RGB 공간에만 제한되지 않는다는 점입니다.

이를 지원하기 위해 여러 가지 새로운 기능이 추가되었습니다:

  1. color() 함수는 @color-profile 규칙으로 확장되어 보정된 CMYK를 포함한 장치 의존 색상을 지원합니다.
  2. 출력 장치별(프린터별) 보정되지 않은 색상용 device-cmyk() 함수 추가

또한 새로운 color-mix() 함수가 두 색상을 지정된 색상 공간에서 혼합하여 새 색상을 만들 수 있습니다.

적합성

문서 관례

준수 요구사항은 설명적 단언과 RFC 2119 용어의 조합으로 표현됩니다. “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL” 등의 핵심 단어는 본 명세의 규범 부분에서 RFC 2119에 정의된 대로 해석해야 합니다. 그러나 가독성 향상을 위해, 이 단어들은 대문자로 표기되지 않습니다.

이 명세의 모든 텍스트는 특별히 비규범임이 표시된 섹션, 예시, 주석을 제외하고는 규범적입니다. [RFC2119]

이 명세의 예시는 “예를 들어” 라는 문구로 시작하거나, class="example"처럼 규범 텍스트와 구분되어 표시됩니다, 예시:

이것은 정보 제공용 예시입니다.

정보 제공용 주석은 “참고”라는 단어로 시작하며 class="note"로 규범 텍스트와 구분되어 표시됩니다, 예시:

참고: 이것은 정보 제공용 주석입니다.

권고(advisement)는 규범 섹션을 특별히 강조하여 스타일링한 것이며, <strong class="advisement">로 규범 텍스트와 구분됩니다, 예시: UA는 반드시 접근 가능한 대안을 제공해야 합니다.

테스트

이 명세의 내용과 관련된 테스트는 이와 같이 “테스트” 블록에 문서화될 수 있습니다. 이러한 블록은 비규범적입니다.


적합성 클래스

이 명세에 대한 적합성는 세 가지 적합성 클래스로 정의됩니다:

스타일시트
CSS 스타일시트.
렌더러
UA는 스타일시트의 의미를 해석하고, 이를 사용하는 문서를 렌더링하는 에이전트입니다.
저작 도구
UA는 스타일시트를 작성하는 도구입니다.

스타일시트가 본 명세에 준수하려면, 이 모듈에서 정의된 문법을 사용하는 모든 선언이 CSS 일반 문법과 각 기능별 개별 문법에 따라 유효해야 합니다.

렌더러가 본 명세에 준수하려면, 스타일시트를 해당 명세에 따라 해석하는 것 외에, 이 명세에서 정의된 모든 기능을 올바르게 파싱하여 문서를 그에 맞게 렌더링해야 합니다. 단, 장치의 한계로 인해 UA가 문서를 올바로 렌더링하지 못하는 경우 UA가 비준수로 간주되지 않습니다. (예: UA가 흑백 모니터에서 색상을 렌더링할 필요는 없음)

저작 도구가 본 명세에 준수하려면, 스타일시트를 본 모듈의 CSS 일반 문법과 각 기능별 개별 문법에 맞춰 구문적으로 올바르게 작성하고, 스타일시트에 대한 모든 기타 준수 요구사항을 충족해야 합니다.

부분 구현

저자가 하위 호환 파싱 규칙을 활용하여 폴백 값을 지정할 수 있도록, CSS 렌더러는 반드시 사용할 수 없는 수준의 지원을 가진 at-rule, 속성, 속성값, 키워드 및 기타 문법 요소를 무효로 간주하고 적절히 무시해야 합니다. 특히, 사용자 에이전트는 단일 다중값 속성 선언에서 지원하지 않는 구성 요소 값만 무시하고 지원되는 값만 적용해서는 안 됩니다: 어떤 값이 무효(지원 불가)로 간주되면 CSS는 전체 선언을 무시하도록 요구합니다.

불안정 및 독점 기능 구현

향후 안정적인 CSS 기능과 충돌을 피하기 위해, CSSWG는 모범 사례를 따라 불안정한 기능 및 독점 확장을 구현할 것을 권장합니다.

비실험적 구현

명세가 Candidate Recommendation 단계에 도달하면, 비실험적 구현이 가능해지며, 구현자는 명세에 따라 올바르게 구현되었음을 입증할 수 있는 모든 CR 수준 기능을 접두어 없이 릴리스해야 합니다.

CSS의 구현 간 상호운용성을 확립하고 유지하기 위해, CSS 워킹 그룹은 비실험적 CSS 렌더러가 W3C에 구현 보고서(필요하다면 해당 테스트케이스 포함)를 제출한 후 CSS 기능의 접두어 없는 구현을 릴리스할 것을 요청합니다. W3C에 제출된 테스트케이스는 CSS 워킹 그룹의 검토와 수정 대상입니다.

테스트케이스 및 구현 보고서 제출에 대한 추가 정보는 CSS 워킹 그룹 웹사이트 https://www.w3.org/Style/CSS/Test/에서 확인할 수 있습니다. 질문은 public-css-testsuite@w3.org 메일링리스트로 문의하시기 바랍니다.

색인

이 명세에서 정의된 용어

참조로 정의된 용어

참고문헌

규범적 참고문헌

[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS 계단식 및 상속 5단계. 2022년 1월 13일. CR. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-COLOR-4]
Chris Lilley; Tab Atkins Jr.; Lea Verou. CSS 색상 모듈 4단계. 2025년 4월 24일. CRD. URL: https://www.w3.org/TR/css-color-4/
[CSS-COLOR-ADJUST-1]
Elika Etemad; et al. CSS 색상 조정 모듈 1단계. 2025년 12월 16일. CR. URL: https://www.w3.org/TR/css-color-adjust-1/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS 구문 모듈 3단계. 2021년 12월 24일. CRD. URL: https://www.w3.org/TR/css-syntax-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 값 및 단위 모듈 4단계. 2024년 3월 12일. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-VALUES-5]
Tab Atkins Jr.; Elika Etemad; Miriam Suzanne. CSS 값 및 단위 모듈 5단계. 2024년 11월 11일. WD. URL: https://www.w3.org/TR/css-values-5/
[CSSOM-1]
Daniel Glazman; Emilio Cobos Álvarez. CSS 객체 모델 (CSSOM). 2021년 8월 26일. WD. URL: https://www.w3.org/TR/cssom-1/
[FETCH]
Anne van Kesteren. 패치 표준. Living Standard. URL: https://fetch.spec.whatwg.org/
[ICC]
ICC.1:2022 (프로파일 버전 4.4.0.0). 2022년 5월. URL: http://www.color.org/specification/ICC.1-2022-05.pdf
[INFRA]
Anne van Kesteren; Domenic Denicola. 인프라 표준. Living Standard. URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner. RFC에서 요구 수준을 표시할 때 사용하는 주요 단어. 1997년 3월. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 표준. Living Standard. URL: https://webidl.spec.whatwg.org/

참고용 참고문헌

[FOGRA39]
ISO 12647-2:2004 / Amd 1, ISO 12647-2에 따른 오프셋 상업 및 특수 인쇄, 용지 유형 1 또는 2 (유광 또는 무광 코팅 오프셋, 115 g/m²), 스크린 주파수 60/cm. 2006. URL: https://www.color.org/chardata/FOGRA39.xalter
[FOGRA51]
ISO 12647-2:2013, 반음톤 컬러 분판, 교정지 및 인쇄물 생산을 위한 프로세스 제어, 파트 2: 오프셋 평판 인쇄, PS 1, 프리미엄 코팅, 115 g/m², 중간 기질 형광. 2015. URL: https://registry.color.org/cmyk-registry/fogra51
[FOGRA55]
CMYKOGV 기반 색역 교환 공간. 2021. URL: https://fogra.org/en/research/prepress-technology/multiprimary-printing-13003

속성 색인

정의된 속성이 없습니다.

@color-profile 설명자

이름 초기값
components <ident># n/a
rendering-intent relative-colorimetric | absolute-colorimetric | perceptual | saturation relative-colorimetric
src <url> n/a

IDL 색인

[Exposed=Window]
interface CSSColorProfileRule : CSSRule {
  readonly attribute CSSOMString name ;
  readonly attribute CSSOMString src ;
  readonly attribute CSSOMString renderingIntent ;
  readonly attribute CSSOMString components ;
};