Что определяет глубину пикселей в стиле контурного кольца фокусировки Chrome / Mac?

#css #google-chrome #focus #accessibility #user-agent

#css #google-chrome #фокус #Специальные возможности #user-agent

Вопрос:

У меня небольшая ошибка, из-за которой некоторые члены моей команды видят стили фокусировки по-разному на одном и том же элементе. Они используют Chrome 86 на Mac. Я использую Chrome 79.

Когда этот конкретный элемент сфокусирован, я вижу базовое кольцо фокусировки, к которому я привык, синее свечение на глубине 5 пикселей

кольцо фокусировки с синим свечением и глубиной 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 пикселей на других элементах.

Я действительно не хочу начинать добавлять новые стили фокусировки, поскольку я бы предпочел соблюдать собственные настройки браузера, если пользователь указал стиль фокусировки, который работает для них.

Мои основные вопросы

  1. Что заставляет браузер выбирать толщину кольца фокусировки?
  2. Может overflow:hidden ли быть причиной этой ошибки на изображении внутри?
  3. Почему я не вижу проблему в 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?

Потому что Chrome изменил свои стили пользовательских агентов для :focus и :focus-visible в Chrome 86.

Комментарии:

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. Поэтому я не удивлюсь, что эти настройки меняются от версии к другой.