#css #google-chrome #focus #accessibility #user-agent
#css #google-chrome #фокус #Специальные возможности #user-agent
Вопрос:
У меня небольшая ошибка, из-за которой некоторые члены моей команды видят стили фокусировки по-разному на одном и том же элементе. Они используют Chrome 86 на Mac. Я использую Chrome 79.
Когда этот конкретный элемент сфокусирован, я вижу базовое кольцо фокусировки, к которому я привык, синее свечение на глубине 5 пикселей
Однако мои коллеги видят очень узкую границу размером 2 пикселя вокруг сфокусированного элемента.
Код для элемента:
<button>
<img ... />
</button>
Изображение внутри кнопки было overflow:hidden
применено для создания эффекта обрезки по центру.
Вот фрагмент
button {
display: inline-flex;
width: 100px;
height: 100px;
align-items: center;
overflow: hidden;
position: relative;
margin-right: 8px;
margin-top: 8px;
border: 0;
cursor: pointer;
}
img {
margin: 0 auto;
width: auto;
height: auto;
min-width: 100%;
min-height: 100%;
position: absolute;
right: 50%;
top: 50%;
transform: translate(50%, -50%);
}
<button>
<img src="https://picsum.photos/id/1062/100/50">
</button>
Я пытаюсь понять, в чем причина изменения настроек таблицы стилей пользовательского агента и почему это может привести к такой разнице.
Стиль фокусировки, который я вижу:
outline: -webkit-focus-ring-color auto 5px;
Мои коллеги видят:
outline: -webkit-focus-ring-color auto 2px;
Однако это не универсально в их браузерах. Они видят 5 пикселей на других элементах.
Я действительно не хочу начинать добавлять новые стили фокусировки, поскольку я бы предпочел соблюдать собственные настройки браузера, если пользователь указал стиль фокусировки, который работает для них.
Мои основные вопросы
- Что заставляет браузер выбирать толщину кольца фокусировки?
- Может
overflow:hidden
ли быть причиной этой ошибки на изображении внутри? - Почему я не вижу проблему в Chrome 79?
Комментарии:
1. может быть, вы могли бы предоставить CSS и HTML для reproduice?
2. @MaxiGui вот codepen: codepen.io/asos-francesca/pen/JjKNYWX?editors=1100
3. Почему вы используете Chrome 79? Он уже устарел. Более 90% ваших пользователей к настоящему времени уже будут в Chrome 85 .
4. @Dai Я обычно просто жду, пока Chrome сообщит, что есть обновление, прежде чем я это сделаю. Однако у меня не было никаких уведомлений об обновлении Chrome, поэтому я все еще на 79.
5. @user1486133 Возможно, вы установили корпоративную версию Chrome с отключенными автоматическими обновлениями или иным образом отключили автоматические обновления (вредоносные программы могут сделать это, чтобы гарантировать, что вы остаетесь уязвимыми, кстати — вы можете захотеть запустить проверку на вирусы). Chrome 79 уже почти год, что является древней историей на временной шкале разработки Chrome. Вы должны открыть меню> Справка> О программе и посмотреть, почему он говорит, что он не обновляется. Также убедитесь, что вы не отключили системные службы автоматического обновления Chrome.
Ответ №1:
Что заставляет браузер выбирать толщину кольца фокусировки?
Встроенная таблица стилей браузера («стили пользовательского агента»). Это может изменяться при каждом крупном обновлении браузера — это также зависит от платформы (например, Chrome 86 на Mac будет отображать вещи иначе, чем Chrome 86 в Windows 10) — поэтому вы не должны зависеть от каких-либо конкретных правил таблицы стилей user-agent, чтобы ваша веб-страница отображалась правильно.
Может
overflow:hidden
ли быть причиной этой ошибки на изображении внутри?
Я сомневаюсь в этом.
Почему я не вижу проблему в Chrome 79?
Комментарии:
1. Но он выбирает разную толщину кольца для разных элементов, даже в Chrome 86. Что определяет толщину, выбранную для каждого элемента? Почему для некоторых он выбирает 5 пикселей, а для других — 2 пикселя.
2. @user1486133 Пожалуйста, прочтите связанную статью.
:focus
и:focus-visible
имеют слегка разные стили и запускаются разными событиями пользовательского интерфейса.
Ответ №2:
Ранее в этом году Chromium был обновлен и получил новый внешний вид.
Вы можете прочитать об обновлениях дизайна здесь . Это один (из многих факторов), который может учитывать различные таблицы стилей пользовательского агента.
Однако имейте в виду, что только потому, что вы видите одно, ваши коллеги видят другое, и это единственные варианты.
Мое кольцо фокусировки имеет размер всего 1 пиксель и черное, так что это дает вам представление о том, насколько разнообразны стили (Chrome 86.0.4240.111 в Windows).
Специальные возможности
Более важная часть вашего вопроса — это та часть, в которой вы не хотите «вмешиваться» в стили браузера по умолчанию.
Я действительно не хочу начинать добавлять новые стили фокусировки, поскольку я бы предпочел соблюдать собственные настройки браузера, если пользователь указал стиль фокусировки, который работает для них.
Это просто не работает в реальном мире. Что делать, если ваш сайт имеет синий фон? (Да, я знаю, что браузеры становятся умнее при учете этого, но в плане доступности нам нужно поддерживать вплоть до IE8!). Кроме того, что делать, если у вас сложный виджет, который меняет цвет?
Стиль фокусировки чтобы он соответствовал веб-сайту, вы хотите, чтобы коэффициент контрастности окружающих элементов был не менее 3: 1. Для действительно сложных сайтов вам может потребоваться другой цвет кольца фокусировки в зависимости от расположения фона, чтобы сохранить этот коэффициент контрастности.
Создайте свои кольца фокусировки!
@Dai справедливо отметил, что этот раздел изначально был не очень понятным.
Когда я говорю «стилизовать ваши кольца фокусировки», я имею в виду сделать их более удобными и заметными, чем настройки браузера по умолчанию.
Учитывайте, где они размещены на странице (их окружение), чтобы обеспечить достаточный цветовой контраст (как упоминалось ранее, минимум 3: 1 с окружением) и убедитесь, что они хорошо видны (не зря их называют индикаторами видимого фокуса).
Как сказал @Dai, не используйте это как возможность попробовать проявить свои творческие способности, пурпурные кольца фокусировки шириной 20 пикселей не нужны (и, возможно, могут быть недоступны). Сделайте их простыми и согласованными по всему сайту.
Прежде всего, помните, что индикаторы фокусировки предназначены для обеспечения доступности.
Я склоняюсь к контуру размером 2 пикселя и смещению контура на 2 пикселя, чтобы убедиться, что он виден, поскольку небольшое пустое пространство вокруг элемента облегчает его просмотр.
button {
display: inline-flex;
width: 100px;
height: 100px;
align-items: center;
overflow: hidden;
position: relative;
margin-right: 8px;
margin-top: 8px;
border: 0;
cursor: pointer;
}
img {
margin: 0 auto;
width: auto;
height: auto;
min-width: 100%;
min-height: 100%;
position: absolute;
right: 50%;
top: 50%;
transform: translate(50%, -50%);
}
.better:focus{
outline: 2px solid #333;
outline-offset: 2px;
}
<h2>no image standard button</h2>
<button>
button with text
</button>
<h2>standard</h2>
<button>
<img src="https://picsum.photos/id/1062/100/50">
</button>
<h2>better</h2>
<button class="better">
<img src="https://picsum.photos/id/1062/100/50">
</button>
О, и :focus-visible
будет здорово, когда он наберет обороты, но на данный момент у него не очень хорошая поддержка, поэтому убедитесь, что вы его заполняете, если используете его.
Комментарии:
1. «Стиль ваших колец фокусировки!» — Я не уверен, что хочу, чтобы каждый любитель, незнакомый с WCAG, внезапно начал выполнять
*:focus-visible { border: 20px inset magenta; }
complete с неприятной@keyframes
анимацией для загрузки. Лично я бы предпочел, чтобы элементы доступности в стиле «никто» — знаете, чтобы они оставались элементами доступности , а не эстетическими элементами.2. Ха-ха, да, верно, возможно, мне нужно немного прояснить этот момент, я добавил немного в этот раздел, чтобы, надеюсь, донести вашу точку зрения. Мнение было правильным, индикаторы фокусировки по умолчанию в браузере на самом деле не так доступны, как могли бы быть, но я не хочу, чтобы кто-то неправильно истолковал мой смысл и создал 20px пурпурные кольца фокусировки!
3. Спасибо, я уже обнаружил использование контурного смещения для «исправления» ошибки, но был осторожен в отношении внесения изменений, которые влияют на стиль фокусировки по умолчанию, поскольку я всегда предпочитаю, чтобы пользователь контролировал свои собственные настройки a11y. Я пытался разобраться, почему это происходит, чтобы посмотреть, могу ли я настроить свой код таким образом, чтобы сделать все кольцо Chrome86 видимым целиком, а не обрезанным. Я все еще не понимаю, почему он обрезает его, когда контейнер отображается полностью, а не обрезается, как его внутреннее изображение?
4. Это чистая гипотеза, но похоже, что, поскольку изображение имеет ту же ширину, что и кнопка, изображение появляется перед индикатором фокусировки и частично блокирует его. Очень сложно сказать, поскольку инспектор всегда будет показывать одно и то же значение для кольца фокусировки. Что касается пользователей, управляющих своими настройками a11y, это немного неправильно, если они используют пользовательскую таблицу стилей в качестве переопределения, она в любом случае переопределит все, что вы установили, чтобы вы не вмешивались. Однако 99% пользователей не будут этого делать, и поэтому им придется мириться с (не идеальными) индикаторами фокусировки, которые предоставляет браузер, если вы их не установите.
5. На самом деле я только что проверил это с помощью лупы, индикатор фокусировки очень слегка вставлен (так что половина внутри и половина снаружи при ширине 1CSS px). Теперь, если вы установите для него ширину 5 пикселей, он будет в основном 4,5 пикселя снаружи и 0,5 пикселя внутри. Таким образом, изображение, похоже, частично покрывает его, как я и подозревал. Если вы сделаете изображение размером 99 на 99 пикселей с отступом в 0,5 пикселя, индикатор фокусировки останется таким же (хотя кнопка будет просвечивать очень слабо). Я добавил второй пример в раздел «стандартный», чтобы проиллюстрировать это.
Ответ №3:
Контур при фокусировке, если он не задан в CSS, фактически определяется настройками браузера.
Здесь вы уже можете видеть, как разные браузеры ведут себя в разных браузерах на Windows и Mac. Поэтому я не удивлюсь, что эти настройки меняются от версии к другой.