color / accessibility

コントラスト比チェッカー

テキスト色と背景色のコントラスト比を計算し、WCAG 2.1のAA・AAAレベルを満たすか判定します。アクセシビリティ対応の確認に。

使い方

01
  1. 「テキスト色」にテキストのカラーコードを入力します(例: #19161a, rgb(25,22,26))
  2. 「背景色」に背景のカラーコードを入力します(例: #f3efe8)
  3. カラーピッカー(左の色ボックス)をクリックしてGUIで色を選ぶこともできます
  4. コントラスト比とWCAG 2.1の合否判定がリアルタイムで表示されます
  5. 下部のプレビューで実際のテキスト表示を確認できます

実装コード

02

WCAG 2.1に準拠したコントラスト比の計算は、sRGB線形化と相対輝度の計算に基づいています。外部ライブラリは不要で、ブラウザ標準のJavaScriptのみで実装しています。

/** sRGB channel linearization */
function linearize(c: number): number {
  const s = c / 255
  return s <= 0.04045 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4)
}

/** Relative luminance (WCAG 2.x) */
export function relativeLuminance(r: number, g: number, b: number): number {
  return 0.2126 * linearize(r) + 0.7152 * linearize(g) + 0.0722 * linearize(b)
}

/** Contrast ratio between two luminance values */
export function contrastRatio(l1: number, l2: number): number {
  const lighter = Math.max(l1, l2)
  const darker = Math.min(l1, l2)
  return (lighter + 0.05) / (darker + 0.05)
}

/** Parse hex, rgb(), rgba() color strings to 0-255 components */
export function parseColor(input: string): ParseResult {
  const s = input.trim()
  const hex3 = s.match(/^#?([0-9a-f])([0-9a-f])([0-9a-f])$/i)
  if (hex3) {
    return { ok: true, r: parseInt(hex3[1]+hex3[1],16),
             g: parseInt(hex3[2]+hex3[2],16), b: parseInt(hex3[3]+hex3[3],16) }
  }
  const hex6 = s.match(/^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i)
  if (hex6) {
    return { ok: true, r: parseInt(hex6[1],16),
             g: parseInt(hex6[2],16), b: parseInt(hex6[3],16) }
  }
  const rgb = s.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/)
  if (rgb) {
    return { ok: true, r: parseInt(rgb[1]), g: parseInt(rgb[2]), b: parseInt(rgb[3]) }
  }
  return { ok: false, error: `色の形式が無効です: "${input}"` }
}

よくある使用例・注意点

03
WCAG 2.1 の基準値
通常テキスト(18px未満・非ボールド)はAA合格に4.5:1以上、AAA合格に7:1以上が必要です。大きなテキスト(18px以上または14px以上のボールド)はAA合格に3:1以上、AAA合格に4.5:1以上です。
UIコンポーネントへの適用
ボタンの枠線・アイコン・フォームの境界線など、テキスト以外のUI要素にも3:1以上のコントラスト比が求められます(WCAG 2.1 成功基準 1.4.11)。背景に対して十分なコントラストを確保してください。
アルファ・透明度の扱い
このツールは不透明色(アルファ値なし)のみ対応しています。rgba()で透明度を指定した場合、RGBの値のみを使用して計算します。半透明の色は実際の表示と異なる場合があります。
デザイントークンへの活用
デザインシステムのカラートークンを定義する際に、事前にコントラスト比を確認する習慣をつけると、アクセシビリティ対応コストを後から削減できます。特にライトモード・ダークモードの両方で基準を満たすか確認することが重要です。

関連ツール

04
カラー変換 — 準備中パスワード強度チェック — 準備中HTMLエスケープ

ソースコード

05

このツールのソースコード(テストコードを含む)はGitHubで公開しています。 MITライセンスで自由に利用・改変できます。

GitHub でコードを見る →