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