同じ明度、異なる相対輝度
Moyoutilの色変換に#FF0000と#00FF00を入力すると、hsl(0, 100%, 50%)とhsl(120, 100%, 50%)になります。HSL明度はいずれも50%ですが、WCAGのsRGB相対輝度は0.2126と0.7152です。HSL明度と相対輝度は異なる量です。CSS Color 4もHSL明度が視覚的に均一な尺度ではないと説明しています。
RGBチャンネルを単純平均しない
WCAGは0〜255のチャンネル値を255で割って線形化し、R・G・Bに0.2126・0.7152・0.0722の重みを適用します。コントラスト比は明るい色と暗い色の相対輝度から求める(L1 + 0.05) / (L2 + 0.05)です。白との比率は赤が約3.9985:1、緑が約1.3722:1です。表示値は小数第4位まで丸めており、適合判断に丸めた値を使わないでください。
以下のコードは計算再現用の別例です。MoyoutilはHEX・RGB・HSLを変換しますが、コントラスト比やWCAG適合性は表示しません。実際のデザインでは文字色と背景色を一緒に確認してください。透明度、画像、グラデーション背景はこの不透明な単色の例の対象外です。
const linear = n => {
const s = n / 255;
return s <= 0.04045 ? s / 12.92
: ((s + 0.055) / 1.055) ** 2.4;
};
const luminance = rgb => {
const [r, g, b] = rgb.map(linear);
return 0.2126*r + 0.7152*g + 0.0722*b;
};
const contrast = (a, b) => {
const x = luminance(a), y = luminance(b);
return (Math.max(x,y)+0.05)
/ (Math.min(x,y)+0.05);
};
console.log(contrast([255,0,0], [255,255,255]).toFixed(4));
console.log(contrast([0,255,0], [255,255,255]).toFixed(4));
// 3.9985
// 1.3722よくある質問
コントラスト比だけでアクセシビリティ全体を確認できますか?
いいえ。この説明は2つの不透明色のコントラスト計算のみを扱います。文字サイズや使用状況の基準、その他のアクセシビリティ要件は別途確認してください。