Согласно Википедии, при преобразовании яркости в оттенки серого «нужно получить значения его красного, зеленого и синего» и смешать их в следующей пропорции: R: 30% G: 59% B: 11%
Следовательно, у белого будет 100% яркости, а у желтого - 89%. В то же время, зеленый имеет всего 59%. 11% почти в четыре раза меньше разницы в 41%!
И даже лайм (#00ff00
) не подходит для чтения большого количества текстов.
ИМХО для хорошей контрастности яркость цветов должна отличаться как минимум на 50%. И эта яркость должна измеряться в пересчете на оттенки серого.
upd : недавно нашел всеобъемлющий инструмент для этого в сети
который по порядку использует формулу из w3 документа
Пороговые значения могут быть взяты из # 1.4
Вот реализация этой более продвинутой вещи.
function luminanace(r, g, b) {
var a = [r, g, b].map(function (v) {
v /= 255;
return v <= 0.03928
? v / 12.92
: Math.pow( (v + 0.055) / 1.055, 2.4 );
});
return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722;
}
function contrast(rgb1, rgb2) {
return (luminanace(rgb1[0], rgb1[1], rgb1[2]) + 0.05)
/ (luminanace(rgb2[0], rgb2[1], rgb2[2]) + 0.05);
}
contrast([255, 255, 255], [255, 255, 0]); // 1.074 for yellow
contrast([255, 255, 255], [0, 0, 255]); // 8.592 for blue
// minimal recommended contrast ratio is 4.5, or 3 for larger font-sizes