Разрыв строки в H1 превращает элемент в группу VoiceOver

Я использую <br> внутри <h1> по причинам дизайна, например:

<h1>This is a <br>headline</h1>

Но заметили, что это превратит элемент в «группу», которую VoiceOver читает как отдельные элементы, например:

Заголовок 1 уровня "Это... заголовок"
Группа 3 товара
"Это"
"заголовок"
"Пустая группа"

Добавление атрибутов aria-hidden = "true" или role = "presentation" к <br> удаляет только объявление «пустая группа», но VoiceOver по-прежнему считает H1 «группой».

Возможно ли, чтобы элемент br присутствовал внутри h1, не объявляя его как «группу» VoiceOver?

Возможно, это обман этого - добавьте aria-hidden к br: <br aria-hidden = "true" /> или лучше: этот ответ предлагая метку арии - найдено поиском SO

mplungjan 11.04.2023 10:10

@OratorioTangram в своем последнем предложении вы хотели сказать, что »role = "presentation" […] [не] имеет никакого эффекта«? @mplungjan Было бы неплохо, чтобы это предположение было подтверждено здесь в качестве выбранного ответа, поскольку ни один из связанных дублирующих вопросов, похоже, не задавался конкретно о предотвращении пауз, вызванных br, и ни один из них не касался конкретно VoiceOver.

myf 11.04.2023 10:54

@mplungjan Добавление aria-hidden = "true" к br к br удаляет только объявление «пустая группа». ВО по-прежнему считает Н1 групповым.

Oratorio Tangram 11.04.2023 11:55

@myf Правильно, это лишь немного меняет объявление, но VO по-прежнему думает, что H1 - это группа.

Oratorio Tangram 11.04.2023 11:56

Так что это было некоторое улучшение. Я снова открыл вопрос

mplungjan 11.04.2023 11:56

И это? <h1 aria-label = "This is a headline">This is a <br>headline</h1>

mplungjan 11.04.2023 11:58

@mplungjan читает метку aria, а затем продолжает, как и раньше.

Oratorio Tangram 11.04.2023 13:02

@mplungjan, опираясь на это, работает, но неуклюже - <h1 aria-label = "This is a headline"><span aria-hidden = "true">This is a <br>headline</span></h1>

Oratorio Tangram 11.04.2023 13:05

И это? <h1 aria-label = "This is a headline" aria-hidden = "true">This is a <br>headline</h1>

mplungjan 11.04.2023 14:40
aria-hidden = "true" полностью удалит узел из дерева доступности, поэтому aria-label не будет объявлен, пока aria-hidden = "true" будет присутствовать.
myf 11.04.2023 16:48

Также есть Что заставляет VoiceOver объявлять пустые группы? вопрос с комментарием со ссылкой на статью, в которой говорится о макияже role = "text", но неясно, действительно ли <h1><span role = "text">foo <br>bar</span></h1> поможет здесь.

myf 11.04.2023 16:51
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
11
131
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я хотел объединить некоторые комментарии, чтобы их было легче читать.

Но сначала уточнение. Объявление «группы» с VoiceOver на Mac. Вы не слышите слово «группа» при использовании VoiceOver на iOS. У меня нет Mac, чтобы проверить это, но я попробовал это на своем iPhone.

Независимо от «группового» объявления, мое тестирование в основном предназначено для прослушивания заголовка как одного элемента, а не разделенного на два, хотя семантически ваш заголовок состоит из двух элементов, поскольку у вас есть <br>. Это не относится к исходному вопросу, поскольку вы в основном спрашивали, как удалить «групповое» объявление, а не как читать заголовок как один элемент. Тем не менее, вот некоторые результаты тестирования принудительного чтения заголовка как одного. Последний пример может иметь побочный бонус в виде исключения «группового» объявления.

Были предложены следующие идеи:

Оригинальный код:

<h1>This is a <br>headline</h1>

При смахивании вправо с помощью VO на iOS:

  • "Это заголовок уровня 1"
  • "заголовок, уровень заголовка 1"

NVDA на ПК, используя стрелку вниз для навигации:

  • "заголовок уровня 1 Это"
  • "заголовок уровня 1"

JAWS на ПК, используя стрелку вниз для навигации:

  • "заголовок уровня 1 Это"
  • "заголовок уровня 1"

Кроме «группового» объявления на Mac, это то, что я ожидал.

Первое предложение:

<h1 aria-label = "This is a headline">This is a <br>headline</h1>

При смахивании вправо с помощью VO на iOS:

  • «Это заголовок, уровень заголовка 1»
  • «Это заголовок, уровень заголовка 1»

Поскольку заголовок по-прежнему состоит из двух элементов (из-за <br>), но применяется aria-label (*), вы слышите aria-label для обеих частей заголовка.

(*) Обратите внимание, что aria-label переопределяет дочерние элементы при правильном использовании, что будет рассмотрено ниже после всех этих примеров.

NVDA на ПК, используя стрелку вниз для навигации:

  • "заголовок 1 уровня Это заголовок"

В NVDA нет второго элемента, когда применяется aria-label, потому что aria-label заменяет содержимое всех дочерних элементов. См. https://www.w3.org/TR/wai-aria-practices-1.2/#naming_with_aria-label, в частности:

При применении к элементу с одной из ролей, которая поддерживает именование из дочернего контента, aria-label скрывает дочерний контент от пользователей вспомогательных технологий и заменяет его значением aria-label.

Если вы переходите по ссылке нейминг из дочернего контента, заголовок является одним из элементов.

JAWS на ПК, используя стрелку вниз для навигации:

  • "заголовок уровня 1 Это"
  • "заголовок уровня 1"

aria-label полностью игнорируется JAWS, и вы получаете тот же результат, что и исходный код.

Второе предложение:

<h1 aria-label = "This is a headline"><span aria-hidden = "true">This is a <br>headline</span></h1>

При смахивании вправо с помощью VO на iOS:

  • «Это заголовок, уровень заголовка 1»

Второго элемента нет. aria-label соблюдается, а aria-hidden по существу скрывает внутренний текст самого заголовка. aria-hidden действительно не должен иметь никакого эффекта, потому что aria-label переопределяет все дочерние элементы (*), как указано выше.

(*) Обратите внимание, что aria-label переопределяет дочерние элементы при правильном использовании, что будет рассмотрено ниже после всех этих примеров.

NVDA на ПК, используя стрелку вниз для навигации:

  • "заголовок 1 уровня Это заголовок"

Для NVDA разницы нет. aria-hidden не влияет, чего я и ожидал, и поэтому меня смутило, что это повлияло на VoiceOver.

JAWS на ПК, используя стрелку вниз для навигации:

  • ""

Ничего не читается, по-видимому, из-за aria-hidden и из-за того, что JAWS не учитывает aria-label в заголовке, который является частью (*) комментария ниже. Поскольку JAWS не видит aria-label, а содержимое заголовка скрыто, читать нечего.

Третье предложение:

<h1><span role = "text">This is a <br>headline</span></h1>

При смахивании вправо с помощью VO на iOS:

  • «Это заголовок [пауза], уровень заголовка 1»

Второго элемента нет, потому что role = "text" убирает все дочерние элементы и просто объединяет текст. Однако ВО объявляет его несколько иначе, чем в предыдущем примере, и имеет короткую паузу между «а» и «заголовком», как будто между ними стоит запятая.

NVDA на ПК, используя стрелку вниз для навигации:

  • "заголовок уровня 1 Это"
  • "заголовок уровня 1"

JAWS на ПК, используя стрелку вниз для навигации:

  • "заголовок уровня 1 Это"
  • "заголовок уровня 1"

Поскольку role = "text" не является утвержденной ролью, в этом примере нет никакой разницы по сравнению с оригиналом с NVDA или JAWS. Тем не менее, Apple реализовала эту роль, и она отмечена VoiceOver, и иногда она бывает полезна, если вы понимаете, что она не повлияет на другие программы чтения с экрана. Я использовал role = "text" в коде производственного уровня с оговоркой, что поддержка может быть отключена Apple в любое время. Но этот производственный код был написан 10 лет назад и до сих пор прекрасно работает.

(*) комментарий о правильном использовании aria-label

Взгляните на «2.10 Практическая поддержка: aria-label, aria-labelledby и aria-describedby», в частности, 7-й пункт:

Не используйте aria-label или aria-labelledby в элементах заголовков, потому что они переопределяют их в NVDA, VoiceOver и Talkback. **JAWS их игнорирует. **

Поэтому идея использования aria-label в заголовке настоятельно не рекомендуется.

Один из способов, чтобы заголовок читался как одна строка, который поддерживается всеми программами чтения с экрана, И может исключить «групповое» объявление.

<h1>
  <span aria-hidden = "true">
    This is a <br>headline
  </span>
  <span class = "sr-only">
    This is a headline
  </span>
</h1>

У вас по сути два заголовка. Первый предназначен для зрячего пользователя, который игнорируется программой чтения с экрана, а второй — для пользователя программы чтения с экрана, который не будет отображаться для зрячего пользователя.

В классе "sr-only" нет ничего особенного. Это просто обычное название для CSS "только для чтения с экрана". Вы можете увидеть больше об этом на Что такое sr-only в Bootstrap 3?

Я считаю, что этот пример также устранит «групповое» объявление, но у меня нет Mac, чтобы проверить это.

Другие вопросы по теме

Похожие вопросы