색
OKLCH 색 공간
OKLCH
OKLCH 색 공간은 사람 눈에 실제로 보이는 밝기를 기준으로 색을 다루는 최신 색 모델로, L·C·H 세 값으로 색을 표현합니다.
정의
OKLCH는 사람 눈에 실제로 보이는 밝기를 기준으로 색을 다루는 최신 색 모델입니다. 이름의 세 글자는 색을 이루는 세 가지 값을 뜻하는데, L은 명도(밝기), C는 채도(색의 선명함), H는 색상(빨강, 파랑 같은 색의 종류)입니다. 세 값으로 색을 표현한다는 점에서 널리 쓰이는 HSL과 구조가 비슷해 익히기 어렵지 않습니다. 결정적인 차이는 명도 L이 지각적으로 균일하다는 데 있습니다. 즉 L값이 같으면 색상이 달라도 사람 눈에 실제로 비슷한 밝기로 보인다는 뜻입니다. 최신 브라우저에서 oklch() 함수로 곧바로 쓸 수 있습니다.
왜 중요한가
HSL에는 오래된 골칫거리가 하나 있습니다. 밝기 값을 똑같이 맞춰도 노랑이 파랑보다 훨씬 밝아 보인다는 점입니다. 그래서 HSL로 색 단계를 만들면 숫자상으로는 고르게 나눴는데도 눈으로 보면 어떤 색은 튀고 어떤 색은 묻혀, 결과를 예측하기가 어렵습니다. OKLCH는 명도가 지각적으로 균일하기 때문에 L값만 고정하면 색상이 달라도 실제로 비슷하게 밝습니다. 덕분에 버튼의 여러 상태 색이나 색의 밝기 단계, 다크 모드 팔레트처럼 여러 색을 일관된 밝기로 맞춰야 하는 작업에서 훨씬 예측 가능하고 규칙적인 결과를 얻을 수 있습니다. 색을 감이 아니라 규칙으로 다루고 싶은 사람에게 특히 든든한 도구입니다.
흔한 실수
- OKLCH를 HSL과 똑같다고 여겨 값을 그대로 옮기는 것입니다. 두 모델은 값의 범위와 의미가 서로 달라, HSL 값을 그대로 넣으면 전혀 엉뚱한 색이 나옵니다. 이름이 비슷하다고 방심하지 말고, 새로운 색 모델이라 여기며 처음부터 다시 잡아야 합니다.
- 채도 C를 지나치게 높게 주는 것입니다. 색상과 밝기에 따라 화면이 표현할 수 있는 채도의 한계가 다른데, 이를 넘기면 브라우저가 색을 임의로 잘라내 의도와 다른 색이 나올 수 있습니다.
- 낯설다는 이유로 OKLCH를 아예 쓰지 않고 미루는 것입니다. 값의 의미만 한번 익히면 색 단계를 만드는 일이 오히려 쉬워지니, 작은 팔레트부터 시험 삼아 적용해 보는 편이 좋습니다.
실무 팁
- 색의 밝기 단계나 다크 모드 팔레트를 만들 때 L값을 규칙적으로 나누세요. 명도가 지각적으로 균일하므로, L만 일정하게 조절하면 색상이 달라도 실제로 비슷하게 밝은 단계가 나와 예측 가능한 팔레트를 얻습니다.
- 최신 CSS 문법이므로 oklch()를 쓸 때는 구형 브라우저를 위한 대비책을 함께 두세요. @supports로 지원 여부를 확인하거나 기존 색 값을 먼저 선언해 두면, 지원하지 않는 환경에서도 화면이 깨지지 않습니다.
- 강조 색을 한 벌 정해 두고 L과 C만 조금씩 바꿔 여러 상태 색을 파생하세요. 색상 H는 고정한 채 밝기와 채도만 조절하면, 버튼의 기본과 호버, 눌림 상태처럼 서로 이어지는 색을 통일감 있게 손쉽게 만들 수 있습니다.
AI에게 시키기
아래에 붙여넣을 CSS의 HSL·hex 색을 OKLCH로 바꿀 건데, HSL 숫자를 oklch()에 그대로 옮기지 말고 각 색을 실제 지각 색으로 정확히 변환해줘. oklch()는 L 0~1(또는 %)·C 0~0.4·H 0~360도로 값의 범위와 의미가 HSL과 완전히 다르니 처음부터 다시 계산해줘. 채도 C가 너무 높아 화면 표현 범위(gamut)를 넘겨 브라우저가 임의로 잘라내는 색은 없는지 확인하고, 잘리는 값은 낮춰줘. 구형 브라우저를 위해 기존 색을 먼저 선언하고 @supports (color: oklch(0 0 0))로 oklch를 덮는 폴백까지 넣은 뒤, 원래 색→OKLCH 매핑표로 정리해줘.
[브랜드 색상 — 예: 파랑·초록·주황 3색]을 기준으로, 색마다 50부터 900까지 10단계 밝기 스케일을 oklch()로 만들어줘. OKLCH는 명도 L이 지각적으로 균일하니까, 같은 단계는 색상 H가 달라도 L값을 똑같이 맞춰서 눈에 비슷하게 밝게 보이도록 해줘 — 예를 들면 50단계는 L 0.97, 900단계는 L 0.25처럼 L을 규칙적으로 나눠줘. 채도 C는 gamut를 넘어 잘리지 않는 선에서 단계별로 잡고, 다크 모드용으로 L 순서를 뒤집은 세트도 함께 --색-단계 형태의 CSS 변수로 뽑아줘.
[강조 색 — 예: oklch(0.62 0.18 250) 또는 #3b82f6]을 기본 버튼 색으로 놓고, 여기서 호버·눌림(active)·비활성 상태 색을 파생해줘. 색상 H는 그대로 고정한 채 L과 C만 조금씩 움직여서 — 호버는 L을 약 0.05 낮춰 살짝 어둡게, 눌림은 거기서 더 어둡게, 비활성은 C를 크게 낮춰 흐리게 — 서로 이어지는 통일감 있는 상태 색으로 만들어줘. 각 색은 oklch()로 표기하고, 위에 올라갈 텍스트와의 배경 대비도 확인해서 --btn-* 변수 세트로 정리해줘.