0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>9 мар 2022</li>
2
<ul><li>9 мар 2022</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Глафира Жур провела небольшое исследование и выяснила, как вернуть таблицам доступность после осенних обновлений Chrome.</p>
4
</ul><p>Глафира Жур провела небольшое исследование и выяснила, как вернуть таблицам доступность после осенних обновлений Chrome.</p>
5
<p>Онлайн-журнал для тех, кто влюблён в код и информационные технологии. Пишем для айтишников и об айтишниках.</p>
5
<p>Онлайн-журнал для тех, кто влюблён в код и информационные технологии. Пишем для айтишников и об айтишниках.</p>
6
<p>Недавно я обнаружила, что скринридер не читает таблицы в Chrome. При этом они выглядят как таблицы, описаны стандартными табличными<a>HTML</a>-тегами, никаких дополнительных стилей к ним не применяли и не меняли роль. Короче говоря, стандартная структура:<em>table > tbody > (tr > td*3)*3</em>.</p>
6
<p>Недавно я обнаружила, что скринридер не читает таблицы в Chrome. При этом они выглядят как таблицы, описаны стандартными табличными<a>HTML</a>-тегами, никаких дополнительных стилей к ним не применяли и не меняли роль. Короче говоря, стандартная структура:<em>table > tbody > (tr > td*3)*3</em>.</p>
7
Обыкновенная HTML-таблица<em>Скриншот: Skillbox Media</em><p>Считается, что сделать таблицы доступными можно, соблюдая два основных правила:</p>
7
Обыкновенная HTML-таблица<em>Скриншот: Skillbox Media</em><p>Считается, что сделать таблицы доступными можно, соблюдая два основных правила:</p>
8
<p>1. Задать таблице имя. Например, с помощью<em><caption></em>внутри<em><table></em>или внешнего лейбла aria-label - специально для программ, читающих с экрана.</p>
8
<p>1. Задать таблице имя. Например, с помощью<em><caption></em>внутри<em><table></em>или внешнего лейбла aria-label - специально для программ, читающих с экрана.</p>
9
<p>2. Задать заголовочную ячейку<em><th></em>, чтобы пользователь скринридера понимал, на каком элементе он находится.</p>
9
<p>2. Задать заголовочную ячейку<em><th></em>, чтобы пользователь скринридера понимал, на каком элементе он находится.</p>
10
<p>Однажды я столкнулась с таким блоком данных:</p>
10
<p>Однажды я столкнулась с таким блоком данных:</p>
11
OpenHighCloseLow<p>Я думала, что он свёрстан при помощи div, поэтому ожидала, что скринридер прочитает ячейки в порядке<em>Open -> Close -> High -> Low</em>. В этом случае первым прозвучал бы div с <em>Open / Close</em>, а потом div с <em>High / Low</em>. Но скринридер прочитал таблицу построчно:<em>Open -> High -> Close -> Low</em>. Получилась какая-то путаница!</p>
11
OpenHighCloseLow<p>Я думала, что он свёрстан при помощи div, поэтому ожидала, что скринридер прочитает ячейки в порядке<em>Open -> Close -> High -> Low</em>. В этом случае первым прозвучал бы div с <em>Open / Close</em>, а потом div с <em>High / Low</em>. Но скринридер прочитал таблицу построчно:<em>Open -> High -> Close -> Low</em>. Получилась какая-то путаница!</p>
12
<p>Я заглянула в код и увидела, что таблица свёрстана как table - поэтому она и не читалась в ожидаемом порядке. Но возник другой вопрос: почему скринридер не сказал, что читает table? Тогда я проверила роль в Accessibility Tree и нашла<em>role="layouttable"</em>!</p>
12
<p>Я заглянула в код и увидела, что таблица свёрстана как table - поэтому она и не читалась в ожидаемом порядке. Но возник другой вопрос: почему скринридер не сказал, что читает table? Тогда я проверила роль в Accessibility Tree и нашла<em>role="layouttable"</em>!</p>
13
Простая таблица без стилей в Chrome. Внимание на правую часть экрана<em>Скриншот: Skillbox Media</em><p>Откуда взялась<em>role = "layouttable"</em> - в<a>спеке</a> не сказано. Сообщений об апдейте Chrome, связанных с этим параметром, я пока тоже не нашла. И в Firefox такого прикола нет - все таблицы обозначаются как<em>role="table"</em>.</p>
13
Простая таблица без стилей в Chrome. Внимание на правую часть экрана<em>Скриншот: Skillbox Media</em><p>Откуда взялась<em>role = "layouttable"</em> - в<a>спеке</a> не сказано. Сообщений об апдейте Chrome, связанных с этим параметром, я пока тоже не нашла. И в Firefox такого прикола нет - все таблицы обозначаются как<em>role="table"</em>.</p>
14
Та же таблица в Firefox<em>Скриншот: Skillbox Media</em><p>В результате собственного расследования и благодаря ответу на <a>вопрос</a>в чате Accessibility Community выяснилось, что, если в таблице нет тегов<em><th></em>, браузер рассматривает её как layout-таблицу и добавляет<em>role="layouttable"</em>. Поэтому скринридер перестаёт её читать как таблицу.</p>
14
Та же таблица в Firefox<em>Скриншот: Skillbox Media</em><p>В результате собственного расследования и благодаря ответу на <a>вопрос</a>в чате Accessibility Community выяснилось, что, если в таблице нет тегов<em><th></em>, браузер рассматривает её как layout-таблицу и добавляет<em>role="layouttable"</em>. Поэтому скринридер перестаёт её читать как таблицу.</p>
15
<p>Статья написана на основе треда Глафиры в <a>Twitter</a>.</p>
15
<p>Статья написана на основе треда Глафиры в <a>Twitter</a>.</p>
16
<p>Кроме того, если у таблицы нет<em><th></em>, но атрибутом задана ширина границ (например,<em>border="1"</em>) - таблица снова становится table и читается скринридером.</p>
16
<p>Кроме того, если у таблицы нет<em><th></em>, но атрибутом задана ширина границ (например,<em>border="1"</em>) - таблица снова становится table и читается скринридером.</p>
17
Та же таблица с заданным значением border<em>Скриншот: Skillbox Media</em><p>Заметьте: если в структуре HTML-документа не установить<em><th></em>или border, но задать значение свойства border в <a>CSS</a> - таблица так и останется layouttable.</p>
17
Та же таблица с заданным значением border<em>Скриншот: Skillbox Media</em><p>Заметьте: если в структуре HTML-документа не установить<em><th></em>или border, но задать значение свойства border в <a>CSS</a> - таблица так и останется layouttable.</p>
18
<p>Вывод: если хотите, чтобы скринридер правильно читал ваши таблицы в Google Chrome, - не забывайте прописывать<em><th></em>.</p>
18
<p>Вывод: если хотите, чтобы скринридер правильно читал ваши таблицы в Google Chrome, - не забывайте прописывать<em><th></em>.</p>
19
<p>Ещё для<em><th></em>полезно выставлять значение атрибута<em>scope "col", если это заголовок столбца, или</em><em>"row", если заголовок строки.</em></p>
19
<p>Ещё для<em><th></em>полезно выставлять значение атрибута<em>scope "col", если это заголовок столбца, или</em><em>"row", если заголовок строки.</em></p>
20
<p>На <a>webaim.org</a>работа скринридера с таблицами описывается следующим образом:</p>
20
<p>На <a>webaim.org</a>работа скринридера с таблицами описывается следующим образом:</p>
21
<p>"Скринридеры анализируют разметку и структуры таблицы, чтобы "угадать“, является ли она data table или layout table. Поэтому очень важно, чтобы элементы разметки data table, такие как <caption> и <th>, НИКОГДА не использовались в layout table".</p>
21
<p>"Скринридеры анализируют разметку и структуры таблицы, чтобы "угадать“, является ли она data table или layout table. Поэтому очень важно, чтобы элементы разметки data table, такие как <caption> и <th>, НИКОГДА не использовались в layout table".</p>
22
Таблица с явно заданным role="table"<em>Скриншот: Skillbox Media</em><p>Как подметил <a>@zavsievich</a>в Twitter, если явно задать таблице без<em><th></em><em>role="table"</em>, то Chrome будет говорить скринридеру, что перед ним - таблица. Её дочерние элементы будут читаться как нужно, а скринридер сможет правильно по ней перемещаться.</p>
22
Таблица с явно заданным role="table"<em>Скриншот: Skillbox Media</em><p>Как подметил <a>@zavsievich</a>в Twitter, если явно задать таблице без<em><th></em><em>role="table"</em>, то Chrome будет говорить скринридеру, что перед ним - таблица. Её дочерние элементы будут читаться как нужно, а скринридер сможет правильно по ней перемещаться.</p>
23
<a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>
23
<a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>