HTML의 색상: 색상을 작성하는 모든 방법 및 대비를 확인하는 방법

HTML의 색상은 CSS 값이며 CSS는 이를 여러 철자로 허용합니다. 이 가이드에서는 각각의 알파 부분이 수행하는 작업과 색상의 텍스트를 읽을 수 있는지 측정하는 방법을 나란히 보여줍니다.

영문 원문 보기

HTML의 색상은 color 또는 background-color와 같은 속성에 CSS로 작성됩니다. 값은 이름(rebeccapurple), 16진수 코드(#663399) 또는 함수(rgb(), hsl() 또는 oklch())일 수 있습니다. 한 페이지에 자유롭게 혼합할 수 있습니다.

여기 보라색으로 쓰여진 6가지 방법이 있습니다. 브라우저가 색상을 어떻게 읽는지 보려면 상자에 색상을 입력하세요.

실행 예제직접 써 보고 코드를 복사하세요
링크로 공유하기
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>One colour, six spellings</title>
<style>
  body { margin: 0; padding: 16px; font-family: system-ui, sans-serif; background: #f6f7f9; color: #1d2330; }
  h2 { font-size: 15px; margin: 0 0 10px; }
  .grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 8px; }
  .chip { border-radius: 10px; overflow: hidden; background: #fff; box-shadow: 0 1px 4px rgba(0, 0, 0, .1); }
  .chip div { height: 44px; }
  .chip code { display: block; padding: 7px 9px; font-size: 13px; }
  .try { margin-top: 16px; display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
  input { font: 15px ui-monospace, Consolas, monospace; padding: 8px 10px; border: 1px solid #c9ced8; border-radius: 8px; width: 210px; }
  #swatch { width: 48px; height: 38px; border-radius: 8px; border: 1px solid #c9ced8; }
  #out { font-size: 13px; line-height: 1.5; margin-top: 8px; }
</style>
</head>
<body>
<h2>Six ways to write the same purple</h2>
<div class="grid">
  <div class="chip"><div style="background: rebeccapurple"></div><code>rebeccapurple</code></div>
  <div class="chip"><div style="background: #639"></div><code>#639</code></div>
  <div class="chip"><div style="background: #663399"></div><code>#663399</code></div>
  <div class="chip"><div style="background: rgb(102 51 153)"></div><code>rgb(102 51 153)</code></div>
  <div class="chip"><div style="background: hsl(270 50% 40%)"></div><code>hsl(270 50% 40%)</code></div>
  <div class="chip"><div style="background: oklch(44% 0.16 303.4)"></div><code>oklch(44% 0.16 303.4)</code></div>
</div>

<div class="try">
  <input id="val" value="tomato" aria-label="Any CSS colour" spellcheck="false">
  <div id="swatch"></div>
</div>
<div id="out"></div>

<script>
  const val = document.getElementById('val');
  const swatch = document.getElementById('swatch');
  const out = document.getElementById('out');

  function show() {
    const v = val.value.trim();
    // CSS.supports answers: would the browser accept this as a colour?
    if (!CSS.supports('color', v)) {
      out.textContent = 'Not a valid colour. The browser would drop this declaration.';
      swatch.style.background = 'none';
      return;
    }
    swatch.style.background = v;
    // getComputedStyle shows the value the browser actually uses
    out.textContent = 'The browser reads it as: ' + getComputedStyle(swatch).backgroundColor;
  }

  val.addEventListener('input', show);
  show();
</script>
</body>
</html>
6개의 철자, 1개의 색상. 아래 상자는 입력한 값을 확인합니다.

상자 아래 줄은 브라우저가 실제로 사용하는 값을 보고하는 getComputedStyle를 사용합니다. 이름, 16진수 코드 및 hsl()는 rgb()로 다시 나타납니다. oklch() 값은 oklch()에 유지됩니다.

색깔은 어디로 가는가

모든 색상 속성에는 동일한 값이 적용됩니다. HTML에서는 두 가지 위치가 일반적입니다. 한 요소의 style 속성 또는 <style> 블록의 규칙입니다.

<p style="color: #663399">Purple text</p>

<style>
  .note { background-color: hsl(270 50% 95%); border: 2px solid rebeccapurple; }
</style>

이 페이지는 가치 자체에 관한 것입니다. 속성에 대해서는 텍스트의 경우 HTML 글꼴 색상, 배경의 경우 CSS 배경색을 참조하세요.

이름 및 16진수 코드

red, tomato, dodgerblue와 같은 색상 이름은 CSS에서 정의한 고정 키워드입니다. 대소문자를 구분하지 않으므로 Red 및 RED도 작동합니다. 빠른 테스트에 편리하지만 고정된 색상 목록에만 이름이 있습니다.

16진수 코드는 #로 시작하며 00(0)부터 ff(255)까지 빨간색, 녹색, 파란색을 각각 두 개의 16진수로 제공합니다. 선택적인 네 번째 쌍은 색상이 얼마나 투명한지를 나타내는 알파를 설정합니다.

각 숫자 쌍은 하나의 채널입니다. 짧은 형식은 모든 숫자를 두 배로 늘립니다.
각 숫자 쌍은 하나의 채널입니다. 짧은 형식은 모든 숫자를 두 배로 늘립니다.
숫자 예 수단
3 #639 #663399, 불투명
4 #6398 #66339988, 알파 포함
6 #663399 빨간색 102, 녹색 51, 파란색 153
8 #66339980 50% 알파의 동일한 보라색

5자리 또는 7자리의 16진수 코드 또는 #가 없는 16진수 코드는 색상이 아니며 브라우저는 선언을 건너뜁니다.

rgb() 및 hsl()

rgb()는 0부터 255까지의 10진수로 작성된 16진수 코드와 동일한 3개 채널을 사용합니다. 현재 CSS는 이를 공백으로 구분합니다. 이전 쉼표 형식은 여전히 ​​작동하며 rgba()는 이제 rgb()의 또 다른 이름입니다.

color: rgb(102 51 153);
color: rgb(102, 51, 153);   /* older comma form, same colour */

hsl()는 색상, 채도, 밝기를 기준으로 색상을 설명합니다. 색조는 0에서 360(빨간색 0, 녹색 120, 파란색 240) 사이의 색상환 각도입니다. 채도는 0%(회색)부터 100%까지, 밝기는 0%(검은색)부터 100%(흰색)까지입니다.

color: hsl(270 50% 40%);    /* the same purple as #663399 */
color: hsl(270 50% 90%);    /* a pale version: only lightness changed */

따라서 hsl()는 육각형보다 손으로 조정하기가 더 쉽습니다. 더 밝거나 더 어두운 버전을 얻으려면 숫자 하나를 변경하세요.

oklch(): 신뢰할 수 있는 가벼움

hsl()에는 문제가 있습니다. 밝기는 빨간색, 녹색, 파란색에 대한 공식이지 색상이 얼마나 밝게 보이는지에 대한 척도가 아닙니다. 노란색과 파란색은 50%가 같으면 전혀 비슷해 보이지 않습니다.

두 행의 밝기 수치가 동일합니다. oklch() 행만 똑같이 밝게 보입니다.
두 행의 밝기 수치가 동일합니다. oklch() 행만 똑같이 밝게 보입니다.

oklch()는 밝기, 채도 및 색상을 측정합니다. 밝기는 0%에서 100%까지이며 색상이 얼마나 밝게 나타나는지 추적하도록 설계되었습니다. 채도는 회색의 경우 0부터 시작하여 색상이 선명할수록 증가합니다. 색조는 hsl()에서와 같이 각도입니다.

--brand: oklch(55% 0.18 260);
--brand-light: oklch(85% 0.08 260);

밝기는 모든 색조에 걸쳐 일관되게 유지되므로 L 값이 동일한 색상 세트는 비슷한 강도로 읽혀집니다. 하나의 변수에서 색상을 혼합하고 조정하려면 CSS color-mix()를 참조하세요.

투명도: 알파, 투명 및 불투명도

16진수 코드와 세 가지 색상 함수 모두 알파 값을 사용합니다. 0(보이지 않음)에서 1(단색) 또는 0%에서 100%까지입니다. 함수 형태에서는 슬래시 뒤에 옵니다.

background: #1e90ff80;               /* hex, 80 = 128 of 255 */
background: rgb(30 144 255 / 50%);
background: hsl(210 100% 56% / 0.5);
background: transparent;             /* same as rgb(0 0 0 / 0) */

색상의 알파는 해당 색상에만 영향을 미칩니다. opacity 속성은 포함된 전체 요소, 텍스트 및 하위 항목을 페이드합니다. 알파를 슬라이드하고 두 상자를 비교합니다.

실행 예제직접 써 보고 코드를 복사하세요
링크로 공유하기
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Transparent colours</title>
<style>
  body { margin: 0; padding: 16px; font-family: system-ui, sans-serif; color: #1d2330; background: #fff; }
  .controls { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; font-size: 14px; }
  input[type=range] { width: 170px; }
  /* a striped backdrop so see-through colour is visible */
  .stage {
    margin-top: 12px; padding: 14px; border-radius: 12px; display: grid;
    grid-template-columns: 1fr 1fr; gap: 12px;
    background: repeating-linear-gradient(45deg, #ffd166 0 14px, #06d6a0 14px 28px);
  }
  .box { padding: 16px 12px; border-radius: 10px; font-weight: 600; font-size: 14px; color: #111; }
  .box small { display: block; font-weight: 400; margin-top: 4px; }
  #codes { margin-top: 12px; font: 13px/1.7 ui-monospace, Consolas, monospace; }
</style>
</head>
<body>
<div class="controls">
  <label>Colour <input type="color" id="pick" value="#1e90ff"></label>
  <label>Alpha <input type="range" id="alpha" min="0" max="100" value="50"></label>
  <span id="pct"></span>
</div>

<div class="stage">
  <div class="box" id="a">Alpha in the colour<small>Text stays solid</small></div>
  <div class="box" id="b">opacity on the box<small>Text fades too</small></div>
</div>

<div id="codes"></div>

<script>
  const pick = document.getElementById('pick');
  const alpha = document.getElementById('alpha');

  function update() {
    const hex = pick.value;                 // always "#rrggbb"
    const a = alpha.value / 100;
    const r = parseInt(hex.slice(1, 3), 16);
    const g = parseInt(hex.slice(3, 5), 16);
    const b = parseInt(hex.slice(5, 7), 16);
    const aa = Math.round(a * 255).toString(16).padStart(2, '0');

    // Left: only the background colour is see-through
    document.getElementById('a').style.background = `rgb(${r} ${g} ${b} / ${a})`;
    // Right: a solid colour, but the whole box (text included) fades
    const boxB = document.getElementById('b');
    boxB.style.background = hex;
    boxB.style.opacity = a;

    document.getElementById('pct').textContent = alpha.value + '%';
    document.getElementById('codes').innerHTML =
      `${hex}${aa}<br>rgb(${r} ${g} ${b} / ${alpha.value}%)<br>rgba(${r}, ${g}, ${b}, ${a})`;
  }

  pick.addEventListener('input', update);
  alpha.addEventListener('input', update);
  update();
</script>
</body>
</html>
왼쪽: 배경색의 알파. 오른쪽: 상자에 불투명도가 적용된 동일한 색상.

텍스트가 단색으로 유지되어야 하는 경우 배경색에 알파를 배치합니다. CSS 불투명도는 모든 것이 페이드되는 것이 원하는 경우를 다룹니다.

현재색상

currentColor는 "이 요소에 color가 무엇이든"을 의미하는 키워드입니다. 테두리는 이미 기본값으로 설정되어 있으므로 색상이 설정되지 않은 테두리가 텍스트와 일치합니다.

.button { color: #0f5132; border: 2px solid currentColor; }
.button:hover { color: #9a3412; }   /* the border follows */

아이콘에 가장 유용합니다. fill="currentColor"가 포함된 인라인 SVG는 상위 텍스트 색상을 사용하므로 하나의 CSS 규칙이 두 가지 모두를 다시 칠합니다. HTML에서 SVG 색상 변경은 전체 패턴을 보여줍니다.

대비를 확인하세요

화면에서는 괜찮아 보이는 색상이 햇빛 아래 있는 휴대폰이나 시력이 약한 사람에게는 읽기 어려울 수 있습니다. WCAG 명암비는 이를 확인할 수 있는 숫자로 변환합니다.

비율은 두 색상이 얼마나 밝은지를 비교합니다. 4.5:1은 본문 텍스트의 일반적인 최소값입니다.
비율은 두 색상이 얼마나 밝은지를 비교합니다. 4.5:1은 본문 텍스트의 일반적인 최소값입니다.

두 가지 색상을 입력하거나 선택하세요. 계산기는 oklch() 및 투명 값을 포함하여 이 페이지의 모든 형식을 허용합니다.

실행 예제직접 써 보고 코드를 복사하세요
링크로 공유하기
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Contrast ratio calculator</title>
<style>
  body { margin: 0; padding: 16px; font-family: system-ui, sans-serif; color: #1d2330; background: #f6f7f9; }
  .row { display: flex; gap: 8px; align-items: center; margin-bottom: 8px; flex-wrap: wrap; }
  .row span { width: 90px; font-size: 14px; }
  .row input[type=text] { font: 14px ui-monospace, Consolas, monospace; padding: 7px 9px; border: 1px solid #c9ced8; border-radius: 8px; width: 170px; }
  .row input[type=color] { width: 44px; height: 34px; padding: 0; border: 1px solid #c9ced8; border-radius: 6px; }
  button { font: inherit; font-size: 14px; padding: 7px 12px; border-radius: 8px; border: 1px solid #c9ced8; background: #fff; cursor: pointer; }
  #preview { margin: 10px 0; padding: 14px 16px; border-radius: 12px; border: 1px solid #d5d9e0; }
  #preview p { margin: 0 0 6px; font-size: 16px; }
  #preview .big { font-size: 24px; margin: 0; }
  #ratio { font-size: 30px; font-weight: 700; }
  table { border-collapse: collapse; margin-top: 8px; font-size: 14px; width: 100%; max-width: 420px; background: #fff; }
  td, th { border: 1px solid #e1e4ea; padding: 6px 8px; text-align: left; }
  .pass { color: #0f5132; font-weight: 700; }
  .fail { color: #9a3412; font-weight: 700; }
</style>
</head>
<body>
<div class="row"><span>Text</span><input type="text" id="fgText" value="#767676" spellcheck="false"><input type="color" id="fgPick"></div>
<div class="row"><span>Background</span><input type="text" id="bgText" value="#ffffff" spellcheck="false"><input type="color" id="bgPick"><button id="swap">Swap</button></div>

<div id="preview">
  <p>Body text at 16px. Can you read this comfortably?</p>
  <p class="big">Large text at 24px</p>
</div>

<div>Contrast ratio: <span id="ratio"></span></div>
<table>
  <tr><th>Check</th><th>Needs</th><th>Result</th></tr>
  <tr><td>AA, normal text</td><td>4.5:1</td><td id="aa"></td></tr>
  <tr><td>AA, large text</td><td>3:1</td><td id="aaL"></td></tr>
  <tr><td>AAA, normal text</td><td>7:1</td><td id="aaa"></td></tr>
  <tr><td>AAA, large text</td><td>4.5:1</td><td id="aaaL"></td></tr>
</table>

<script>
  const $ = (id) => document.getElementById(id);

  // A 1x1 canvas turns any CSS colour (name, hex, hsl, oklch...) into sRGB pixels.
  const ctx = document.createElement('canvas').getContext('2d', { willReadFrequently: true });
  function paint(color) {
    ctx.fillStyle = color;
    ctx.fillRect(0, 0, 1, 1);
    return ctx.getImageData(0, 0, 1, 1).data;  // [r, g, b, a]
  }

  // WCAG relative luminance
  function luminance([r, g, b]) {
    const lin = (c) => { c /= 255; return c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4; };
    return 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b);
  }
  const toHex = (p) => '#' + [p[0], p[1], p[2]].map((n) => n.toString(16).padStart(2, '0')).join('');

  function update() {
    const fg = $('fgText').value.trim(), bg = $('bgText').value.trim();
    if (!CSS.supports('color', fg) || !CSS.supports('color', bg)) {
      $('ratio').textContent = 'enter two valid colours';
      return;
    }
    // Paint white, then the background, then the text colour on top,
    // so see-through colours are measured the way they would show.
    ctx.clearRect(0, 0, 1, 1);
    paint('#fff');
    const bgPx = paint(bg);
    const fgPx = paint(fg);

    const L1 = luminance(fgPx), L2 = luminance(bgPx);
    const ratio = (Math.max(L1, L2) + 0.05) / (Math.min(L1, L2) + 0.05);

    $('preview').style.color = fg;
    $('preview').style.background = bg;
    $('fgPick').value = toHex(fgPx);
    $('bgPick').value = toHex(bgPx);
    // Round down, so 4.499 never shows as a pass
    $('ratio').textContent = (Math.floor(ratio * 100) / 100).toFixed(2) + ':1';

    const mark = (id, need) => {
      const ok = ratio >= need;
      $(id).textContent = ok ? 'Pass' : 'Fail';
      $(id).className = ok ? 'pass' : 'fail';
    };
    mark('aa', 4.5); mark('aaL', 3); mark('aaa', 7); mark('aaaL', 4.5);
  }

  $('fgText').addEventListener('input', update);
  $('bgText').addEventListener('input', update);
  $('fgPick').addEventListener('input', () => { $('fgText').value = $('fgPick').value; update(); });
  $('bgPick').addEventListener('input', () => { $('bgText').value = $('bgPick').value; update(); });
  $('swap').addEventListener('click', () => {
    [$('fgText').value, $('bgText').value] = [$('bgText').value, $('fgText').value];
    update();
  });
  update();
</script>
</body>
</html>
명암비 계산기. 색상을 바꾸거나 이름, 16진수 또는 oklch() 값을 사용해 보세요.

계산에는 세 단계가 있습니다.

  1. 각 색상을 빨간색, 녹색 및 파란색 값으로 바꿉니다. 데모에서는 1픽셀 캔버스에 그림을 그리고 모든 형식에서 작동하는 픽셀을 읽습니다.
  2. 이를 상대 휘도로 변환합니다. 이는 녹색이 가장 중요하고 파란색이 가장 작은 가중치 합계입니다.
  3. 더 밝은 휘도에 0.05를 더한 값을 더 어두운 휘도에 0.05를 더한 값으로 나눕니다.
레벨 일반 텍스트 큰 텍스트
AA 4.5:1 3:1
AAA 7:1 4.5:1

큰 텍스트는 24px 이상, 굵은 글씨는 약 18.7px 이상을 의미합니다. 결과를 반올림하지 마십시오. 4.49:1은 4.5:1을 충족하지 않습니다. 그런 이유로 데모가 마무리되었습니다.

작동하지 않을 때

당신이 보는 것 원인 수정
색상은 무시됩니다 오타, 누락된 # 또는 5자리 또는 7자리 16진수 값을 수정하세요. 잘못된 선언은 삭제됩니다.
#가 없는 16진수 코드가 작동한 후 중지됩니다. 페이지에 문서 유형이 없어 쿼크 모드로 실행되었습니다. <!doctype html> 및 # 추가
텍스트가 배경과 함께 희미해집니다. 요소의 opacity background-color에서 알파 사용
색상 선택기 값은 항상 #1e90ff와 같습니다. <input type="color">는 소문자 6자리 16진수를 제공합니다. 다른 형식이 필요하면 변환하세요.
hsl() 색상의 옅은 세트가 고르지 않게 보입니다. hsl() 밝기가 밝은 색상의 모양과 일치하지 않습니다. 밝기가 고정된 oklch()를 사용하세요.
아이콘이 텍스트 색상을 따르지 않습니다. SVG에는 고정된 fill가 있습니다. fill="currentColor" 설정

페이지 전체에서 색상을 일관되게 유지하려면 색상을 CSS 변수에 한 번 저장하고 다크 모드로 전환하세요.

링크로 공유하세요

팔레트나 대비 검사는 사람들이 시도해 볼 수 있을 때 동의하기가 더 쉽습니다. 스크린샷은 화면에 표시된 대로 색상을 표시하며 누구도 여기에 새 값을 입력할 수 없습니다.

작업 버전을 보내려면 페이지를 NOS 문서에 붙여넣고 공유 링크 만들기를 선택하세요. 링크할 HTML이 이를 안내합니다.

페이지는 작성된 대로 렌더링되고 스크립트가 실행되므로 페이지를 보내는 사람들은 색상을 선택하고 비율 변경을 볼 수 있습니다. 나중에 코드를 변경하면 동일한 링크에 새 버전이 표시됩니다.

자주 묻는 질문

HTML에서 색상을 어떻게 설정합니까?

CSS로. 스타일 속성이나 스타일 블록에서 색상, 배경색 또는 테두리 색상과 같은 속성에 색상 값을 입력합니다. 이전 글꼴 태그와 bgcolor 속성은 HTML에서 더 이상 사용되지 않으므로 새 페이지에는 CSS를 사용하세요.

#639, #663399, rgb(102 51 153) 사이에 차이가 있나요?

아니요. 같은 색깔의 철자 세 개입니다. 짧은 형식의 각 16진수는 두 배가 되므로 #639는 #663399로 확장되고 16진수 66, 33, 99는 102, 51, 153입니다. 브라우저는 이를 동일한 방식으로 저장하고 표시합니다.

rgb() 또는 rgba()를 작성해야 합니까?

둘 중 하나가 작동합니다. 현재 CSS에서는 동일한 기능이며 둘 다 알파 값을 허용합니다. 새로운 형식은 채널을 공백으로 구분하고 rgb(30 144 255 / 50%)와 같이 슬래시 뒤에 알파를 넣습니다. 쉼표 형식 rgba(30, 144, 255, 0.5) 는 동일한 색상을 제공합니다.

텍스트에는 어떤 명암비가 필요합니까?

WCAG 레벨 AA에서는 일반 텍스트의 경우 최소 4.5:1, 24px 이상 또는 굵은 글씨의 경우 약 18.7px 이상의 큰 텍스트의 경우 3:1을 요구합니다. 레벨 AAA에서는 이를 7:1과 4.5:1로 높입니다. 사람들이 봐야 할 아이콘과 입력 테두리는 3:1이 되어야 합니다.

내 색상이 무시되는 이유는 무엇입니까?

값이 유효하지 않을 수 있으므로 브라우저는 전체 선언을 삭제하고 이전에 적용된 색상을 유지합니다. 일반적인 원인은 누락된 #, 5자리 또는 7자리의 16진수 코드, 철자가 잘못된 색상 이름 등입니다. 개발자 도구를 열고 취소선이 표시된 선언을 찾습니다.

함께 읽어 보기