Контент, т.е. html имеет приоритет перед внешним видом.
Поэтому CSS должен делать две вещи:
Проверяйте чтобы фон и текст сочетались.
Проверяйте чтобы фон и текст сочетались при отключенном файле CSS.
function setContrastColor(color) {
const arr = color.split("");
const red = +("0x" + arr.slice(1, 3).join(""));
const green = +("0x" + arr.slice(3, 5).join(""));
const blue = +("0x" + arr.slice(5).join(""));
const luma = (0.299 * red + 0.587 * green + 0.114 * blue) / 255;
return luma > 0.5 ? "#000000" : "#ffffff";
}
Пример реализации, где клик по названию цвета делает выбранный цвет фоном, а все тексты на странице получают контрастный цвет в зависимости от цвета фона - черный или белый.
Элемент может быть невидим на экране, но видим для screeneader. Но также возможно сделать элемент невидимым и для экрана и для программы-чтеца.
Хорошая идея состоит в том, чтобы сделать видимым нужный контент для screeaneader. Бонусом (и очень веским) мы получим скорость работы web-приложения. Дело в том, что если элемент не видим, но есть в DOM (opacity: 0), то он доступен для screeneader, а браузер для появления такого элемента использует Repeaint. Если элемент не в DOM (display: none), то это элемент невидим для screeneader, а браузер для появления такого элемента использует Reflow. Пересчет всей страницы (Reflow) - это намного более дорогая по ресурсам операция, чем перерисовка отдельной части DOM (Repeaint).
Пользователи могут использовать zoom или переопределить стили вашей страницы, увеличив размер шрифта в body. Желательно предусмотреть такую возможность - сайт не должен развалился, хотя допустимо потерять часть идей дизайнера.
ADAAA и W3C считают, что веб-страница не должна искажаться при zoom 200% и меньше.