Tailwind CSS 색상: v4 OKLCH 팔레트, 커스텀 색상과 단계
Tailwind CSS v4에는 50부터 950까지 11단계로 이루어진 색상 스케일 26개가 있습니다. 모두 286색이며 --color-blue-500 같은 CSS 변수로 OKLCH 값이 정의되어 있습니다. 직접 색을 추가하려면 @theme { --color-brand-500: oklch(...) }를 쓰면 됩니다. 같은 단계 번호라도 명도는 같지 않습니다. 흰색 위에서 4.5:1을 통과하는 가장 밝은 파랑은 blue-600이지만, 노랑은 700이 필요합니다.
5분 분량
Tailwind 색상 팔레트의 구조
Tailwind v4.3의 기본 팔레트에는 이름이 붙은 스케일이 26개 있습니다. 유채색이 17개로 red, orange, amber, yellow, lime, green, emerald, teal, cyan, sky, blue, indigo, violet, purple, fuchsia, pink, rose입니다. 무채색 계열은 9개로, v3부터 있던 slate, gray, zinc, neutral, stone과 v4에서 추가된 mauve, olive, mist, taupe입니다. 여기에 black과 white가 더해집니다.
모든 스케일은 같은 11단계를 가집니다. 50, 100, 200부터 900까지, 그리고 950입니다. 50은 거의 흰색이고 950은 거의 검정입니다. 클래스는 유틸리티, 색상, 단계를 이어 붙인 형태입니다. bg-blue-500, text-rose-700, border-zinc-200처럼 씁니다.
단계 번호는 스케일 안에서의 위치일 뿐 명도 값이 아닙니다. 500 단계의 OKLCH 명도는 gray의 55.1%부터 yellow의 79.5%까지 차이가 납니다. 그래서 yellow-500과 blue-500은 텍스트 색으로 쓸 때 전혀 다르게 동작합니다.
| 클래스 | OKLCH 값 | HEX 대체값 | 흰색 위 대비 |
|---|---|---|---|
| yellow-500 | oklch(79.5% 0.184 86.047) | #efb100 | 1.92:1 |
| amber-500 | oklch(76.9% 0.188 70.08) | #fd9a00 | 2.14:1 |
| green-500 | oklch(72.3% 0.219 149.579) | #00c950 | 2.22:1 |
| cyan-500 | oklch(71.5% 0.143 215.221) | #00b8db | 2.37:1 |
| orange-500 | oklch(70.5% 0.213 47.604) | #ff6900 | 2.89:1 |
| red-500 | oklch(63.7% 0.237 25.331) | #fb2c36 | 3.81:1 |
| blue-500 | oklch(62.3% 0.214 259.815) | #2b7fff | 3.76:1 |
| indigo-500 | oklch(58.5% 0.233 277.117) | #615fff | 4.58:1 |
| gray-500 | oklch(55.1% 0.027 264.364) | #6a7282 | 4.84:1 |
Tailwind blue: 모든 단계의 OKLCH, HEX, 대비
Tailwind v4가 정의한 blue 스케일 전체입니다. HEX 열은 명도와 색조를 유지한 채 크로마를 낮춰 찾은 가장 가까운 sRGB 색입니다. 대비는 그 HEX 값으로 측정한 WCAG 2 대비율입니다.
본문 텍스트 기준 4.5:1을 흰색 위에서 처음 통과하는 단계는 blue-600입니다. blue-500은 검정 위에서는 5.58:1로 통과하지만 흰색 위에서는 3.76:1로 실패합니다. 양쪽 모두에서 4.5:1을 넘는 blue 단계는 없으므로 라이트 테마와 다크 테마에는 서로 다른 단계가 필요합니다.
| 클래스 | OKLCH 값 | HEX 대체값 | 흰색 위 | 검정 위 |
|---|---|---|---|---|
| blue-50 | oklch(97% 0.014 254.604) | #eff6ff | 1.09:1 | 19.30:1 |
| blue-100 | oklch(93.2% 0.032 255.585) | #dbeafe | 1.22:1 | 17.21:1 |
| blue-200 | oklch(88.2% 0.059 254.128) | #bedbff | 1.42:1 | 14.77:1 |
| blue-300 | oklch(80.9% 0.105 251.813) | #8ec5ff | 1.81:1 | 11.58:1 |
| blue-400 | oklch(70.7% 0.165 254.624) | #51a2ff | 2.64:1 | 7.96:1 |
| blue-500 | oklch(62.3% 0.214 259.815) | #2b7fff | 3.76:1 | 5.58:1 |
| blue-600 | oklch(54.6% 0.245 262.881) | #155dfc | 5.25:1 | 4.00:1 |
| blue-700 | oklch(48.8% 0.243 264.376) | #1447e6 | 6.83:1 | 3.07:1 |
| blue-800 | oklch(42.4% 0.199 265.638) | #193cb8 | 8.82:1 | 2.38:1 |
| blue-900 | oklch(37.9% 0.146 265.522) | #1c398e | 10.37:1 | 2.03:1 |
| blue-950 | oklch(28.2% 0.091 267.935) | #162456 | 14.78:1 | 1.42:1 |
흰색 배경에서 WCAG AA를 통과하는 Tailwind 단계
통과하는 가장 밝은 단계는 색조에 따라 다릅니다. orange, amber, yellow, lime과 green, teal, cyan, sky 계열은 500에서도 아직 밝아서 본문 텍스트에는 700이 필요합니다. red, blue, violet, purple, fuchsia, pink, rose는 600에서, indigo는 이미 500에서 통과합니다. 예외는 yellow입니다. yellow-600조차 2.93:1로 큰 텍스트 기준(3:1)도 넘지 못합니다.
단계 번호보다 명도가 결과를 더 잘 예측합니다. 286색 전체에서 OKLCH 명도가 58% 미만인 단계는 모두 흰색 위에서 4.5:1을 통과하고, 59.2%를 넘는 단계는 모두 실패합니다. 클래스 값의 L만 보면 테스트하기 전에 답을 알 수 있습니다.
| 색상 | 4.5:1 최소 단계 | HEX | 대비율 | 3:1 최소 단계 |
|---|---|---|---|---|
| red | 600 | #e7000b | 4.77:1 | 500 |
| orange | 700 | #ca3500 | 5.22:1 | 600 |
| amber | 700 | #bb4d00 | 5.03:1 | 600 |
| yellow | 700 | #a65f00 | 4.93:1 | 700 |
| lime | 700 | #497d00 | 4.98:1 | 600 |
| green | 700 | #008236 | 4.95:1 | 600 |
| emerald | 700 | #007a55 | 5.36:1 | 600 |
| teal | 700 | #00786f | 5.36:1 | 600 |
| cyan | 700 | #007595 | 5.28:1 | 600 |
| sky | 700 | #0069a8 | 5.86:1 | 600 |
| blue | 600 | #155dfc | 5.25:1 | 500 |
| indigo | 500 | #615fff | 4.58:1 | 400 |
| violet | 600 | #7f22fe | 5.89:1 | 500 |
| purple | 600 | #9810fa | 5.54:1 | 500 |
| fuchsia | 600 | #c800de | 4.66:1 | 500 |
| pink | 600 | #e60076 | 4.54:1 | 500 |
| rose | 600 | #ec003f | 4.53:1 | 500 |
| gray | 500 | #6a7282 | 4.84:1 | 500 |
| olive | 600 | #5b5b4b | 6.90:1 | 500 |
무채색 계열은 olive를 제외하고 모두 500에서 통과합니다. olive-500은 명도 58%에 노란 기가 도는 색조라서 4.25:1에 그칩니다. 따라서 gray-500 텍스트와 olive-500 텍스트는 서로 바꿔 쓸 수 없습니다.
Tailwind v3와 v4 색상 비교
v3에서는 tailwind.config.js의 theme.extend.colors에 HEX 값으로 색을 정의했습니다. v4는 설정을 CSS로 옮겼습니다. 색상은 @theme 안의 테마 변수로 OKLCH 값을 쓰고 CSS 변수로 노출되므로, 일반 CSS나 인라인 스타일에서도 var(--color-blue-500)을 쓸 수 있습니다.
팔레트는 새로 그린 것이 아니라 다시 조정한 것입니다. OKLCH로 변환해 보면 v3 blue-500(#3b82f6)은 v4 blue-500과 명도와 색조가 정확히 같습니다. 크로마만 0.188에서 0.214로 올라갔습니다. blue 스케일의 나머지도 같은 패턴이며, blue-400만 0.7포인트 더 어두워졌습니다. 대비는 거의 그대로인데 색은 더 선명해 보입니다.
늘어난 크로마는 sRGB 바깥까지 닿습니다. v4의 286색 중 94색이 sRGB 밖, Display P3 안에 있으며 모두 유채색입니다. orange는 11단계 중 9단계가, blue는 200부터 500까지 4단계가 밖에 있습니다. P3 화면에서는 원래 색이 그대로 보이고, sRGB 화면에서는 브라우저가 가까운 색으로 표시합니다. v4는 Safari 16.4, Chrome 111, Firefox 128 이상을 대상으로 하며, 이 브라우저들은 모두 oklch()를 지원합니다.
| 클래스 | v3 HEX | v4 HEX 대체값 | 크로마 v3 → v4 | 흰색 위 대비 v3 → v4 |
|---|---|---|---|---|
| blue-400 | #60a5fa | #51a2ff | 0.143 → 0.165 | 2.54 → 2.64 |
| blue-500 | #3b82f6 | #2b7fff | 0.188 → 0.214 | 3.68 → 3.76 |
| blue-600 | #2563eb | #155dfc | 0.215 → 0.245 | 5.17 → 5.25 |
| blue-700 | #1d4ed8 | #1447e6 | 0.217 → 0.243 | 6.70 → 6.83 |
CSS
@theme {
--color-blue-500: oklch(62.3% 0.214 259.815);
}
.card {
border-color: var(--color-blue-500);
}Tailwind v4에서 커스텀 색상을 추가하는 방법
@theme 안에 --color- 네임스페이스로 변수를 선언하세요. --color- 뒤의 부분이 클래스 이름이 됩니다. --color-brand를 선언하면 bg-brand, text-brand, border-brand, ring-brand를 비롯한 모든 색상 유틸리티와 CSS의 var(--color-brand)를 쓸 수 있습니다. HEX, rgb(), hsl(), oklch() 모두 사용할 수 있습니다.
기본 팔레트를 확장하지 않고 교체하려면 먼저 --color-*: initial로 네임스페이스를 초기화한 뒤 원하는 색만 정의하세요. 유틸리티는 실제로 사용한 클래스만 생성되므로 대부분의 프로젝트는 기본값을 그대로 둡니다.
CSS
@import 'tailwindcss';
@theme {
--color-brand: #e4572e;
--color-ink: oklch(21% 0.02 260);
}강조 색이 하나뿐이라면 --color-brand 하나로 충분합니다. 호버 상태, 옅은 배경, 다크 모드가 필요해지는 순간 번호가 붙은 단계로 전체 스케일을 정의하세요.
50~950 커스텀 스케일 전체를 만드는 방법
아래 스케일은 #e4572e에서 생성했습니다. 이 색의 명도 63.7%가 500 단계와 일치하므로 브랜드 색은 정확히 500에 놓입니다. 나머지 단계는 Tailwind의 명도 곡선을 따르고, 색조는 그대로 유지하며, 크로마는 500과 600에서 가장 높고 양 끝으로 갈수록 줄어듭니다. 모든 단계가 sRGB 안에 들어가므로 HEX 값도 정확합니다.
Tailwind 자체의 따뜻한 색조와 마찬가지로, 이 스케일도 흰색 위 본문 텍스트에는 600이 필요합니다. brand-500은 3.68:1로, 큰 텍스트와 아이콘에만 충분합니다.
| 클래스 | HEX | 흰색 위 |
|---|---|---|
| brand-50 | #fcf3f0 | 1.09:1 |
| brand-100 | #fae4de | 1.22:1 |
| brand-200 | #f8cec3 | 1.44:1 |
| brand-300 | #f3ae9a | 1.85:1 |
| brand-400 | #ed7d5e | 2.73:1 |
| brand-500 | #e4572e | 3.68:1 |
| brand-600 | #ce3a00 | 4.97:1 |
| brand-700 | #ae3000 | 6.52:1 |
| brand-800 | #912600 | 8.46:1 |
| brand-900 | #77260e | 10.15:1 |
| brand-950 | #441508 | 15.48:1 |
CSS
@theme {
--color-brand-50: oklch(97% 0.01103 36.478);
--color-brand-100: oklch(93.477% 0.02574 36.478);
--color-brand-200: oklch(88.485% 0.04964 36.478);
--color-brand-300: oklch(81.145% 0.08641 36.478);
--color-brand-400: oklch(71.064% 0.14524 36.478);
--color-brand-500: oklch(63.723% 0.18385 36.478);
--color-brand-600: oklch(56.583% 0.19167 36.478);
--color-brand-700: oklch(49.952% 0.16921 36.478);
--color-brand-800: oklch(43.729% 0.14814 36.478);
--color-brand-900: oklch(38.935% 0.11766 36.478);
--color-brand-950: oklch(27% 0.07538 36.478);
}붙여 넣을 때는 정밀도를 그대로 유지하세요. 명도를 0.1% 단위로, 크로마를 소수점 셋째 자리로 반올림하면 brand-600이 sRGB 밖으로 살짝 벗어납니다. 문제가 되지는 않지만 HEX 값과 정확히 일치하지 않게 됩니다.
bg-blue-500/50 같은 불투명도 수식어의 동작 원리
색상 뒤에 슬래시를 붙이면 알파 값이 정해집니다. bg-blue-500/50은 불투명도 50%의 blue-500입니다. v3는 이를 rgb(59 130 246 / 0.5)로 컴파일했기 때문에 Tailwind가 채널로 나눌 수 있는 색에서만 동작했습니다. CSS 변수로 정의한 커스텀 색상에는 rgb(var(--brand) / <alpha-value>)라는 특별한 형식이 필요했습니다.
v4는 수식어를 Oklab 기준의 color-mix()로 컴파일해 색을 transparent와 섞습니다. 그래서 테마 변수, bg-[#e4572e]/50 같은 임의 값, 직접 만든 CSS 변수까지 어떤 색에서든 동작합니다.
불투명도는 대비를 바꿉니다. 흰색 위에서 blue-500/50은 #95bfff로, blue-500/10은 #eaf2ff로 표시됩니다. blue-600 텍스트는 5.25:1로 읽히지만 text-blue-600/60은 2.62:1로 떨어져 큰 텍스트 기준도 통과하지 못합니다.
CSS
.bg-blue-500\/50 {
background-color: color-mix(in oklab, var(--color-blue-500) 50%, transparent);
}HEX 코드에 가장 가까운 Tailwind 클래스 찾기
HEX 값을 286개 단계 전체와 Oklab 지각 거리(ΔEOK)로 비교하세요. 약 0.02 미만이면 나란히 놓아도 차이가 잘 보이지 않으므로 Tailwind 클래스로 대신해도 됩니다. 약 0.04를 넘으면 커스텀 색상을 추가하는 편이 낫습니다.
표는 실제 매칭 결과입니다. 예전 v3 HEX 값은 같은 v4 클래스로 돌아가지만, #ff5733 같은 흔한 브랜드 주황은 orange-600과 red-400 사이에 걸칩니다. PickShade의 Tailwind 페이지는 어떤 색이든 이렇게 찾아서 가장 가까운 클래스 세 개를 보여 줍니다.
| 내 색상 | 가장 가까운 v4 클래스 | 클래스 대체값 | ΔEOK |
|---|---|---|---|
| #635bff | indigo-500 | #615fff | 0.008 |
| #1da1f2 | sky-500 | #00a6f4 | 0.020 |
| #10b981 | emerald-500 | #00bc7d | 0.021 |
| #3b82f6 | blue-500 | #2b7fff | 0.026 |
| #e4572e | orange-600 | #f54900 | 0.042 |
| #ff5733 | orange-600 | #f54900 | 0.046 |
자주 묻는 질문
Tailwind CSS에는 색상이 몇 개 있나요?
Tailwind CSS v4.3에는 50부터 950까지 11단계로 이루어진 색상 스케일이 26개 있어, black과 white를 빼고 286색입니다. 17개 스케일은 유채색이고 9개는 무채색 계열입니다. 무채색 계열은 slate, gray, zinc, neutral, stone, mauve, olive, mist, taupe입니다.
Tailwind blue-500의 HEX 코드는 무엇인가요?
Tailwind v4에서 blue-500은 oklch(62.3% 0.214 259.815)로, sRGB를 살짝 벗어납니다. 가장 가까운 HEX 값은 #2b7fff입니다. Tailwind v3의 blue-500은 #3b82f6이었으며, 명도와 색조는 같고 크로마만 더 낮았습니다.
Tailwind v4에서 커스텀 색상은 어떻게 추가하나요?
CSS의 @theme 안에 --color- 네임스페이스로 변수를 추가하세요. 예: @theme { --color-brand-500: oklch(63.7% 0.184 36.48); }. 그러면 Tailwind가 bg-brand-500, text-brand-500을 비롯한 모든 색상 유틸리티를 생성하고, 값은 var(--color-brand-500)으로도 쓸 수 있습니다.
흰색 배경에서 접근성 기준을 통과하는 Tailwind 색상은?
흰색 위 본문 텍스트에 4.5:1이 필요하다면 red, blue, violet, purple, fuchsia, pink, rose는 600, orange, amber, yellow, lime, green, emerald, teal, cyan, sky는 700, indigo와 대부분의 무채색 계열은 500을 쓰세요. 무채색 계열 중 olive만 예외로 600이 필요합니다.
Tailwind v4 색상이 v3보다 채도가 높아 보이는 이유는?
Tailwind v4는 색상을 OKLCH로 정의하면서 크로마를 높였습니다. 예를 들어 blue 스케일에서는 명도와 색조가 v3와 거의 같게 유지된 채 중간 단계의 크로마가 0.02~0.03 올라갔습니다. 286색 중 94색이 이제 sRGB 밖에 있어 더 넓은 Display P3 색역을 쓰므로, 최신 iPhone이나 Mac 같은 P3 화면에서 더 선명하게 보입니다.
Tailwind v4의 @theme에서 HEX 색상을 써도 되나요?
네. 테마 변수에는 HEX, rgb(), hsl(), oklch()를 포함한 모든 CSS 색상을 쓸 수 있습니다. v4는 불투명도 수식어를 color-mix()로 만들기 때문에 어떤 형식에서든 동작합니다.