TGViewer
<divelopers> <divelopers> @alexnozer_dev · 1.19K subscribers
Post #78 326
О валидности разметки

На хабре вышла статья про отрисовку таблиц при помощи Symbiote.js. Это фреймворк, который базируются на веб-стандартах и активно использует API веб-компонентов. За это авторам отдельный респект, потому что мне нравится идея максимально близких к платформе инструментов, полагающихся на стандарты.

В статье описывается работа с таблицами при помощи этого фреймворка. Всё бы хорошо, но приводятся примеры итоговой сгенерированной разметки:

<my-table>
<table>
<table-row>
<td>Row number: 1</td>
<td>Date: 1714405915233</td>
</table-row>
<table-row>
<td>Row number: 2</td>
<td>Date: 1714405915233</td>
</table-row>
<table-row>
<td>Row number: 3</td>
<td>Date: 1714405915233</td>
</table-row>
</table>
</my-table>
Этот фрагмент разметки не является валидным. Дело в том, что по спецификации внутри <table> разрешено вкладывать только <caption>, <colgroup>, <thead>, <tbody>, <tfoot>, <tr>, <script> и <template>. Причём не просто вкладывать в произвольно порядке, а по определённым правилам.

В примере кода из статьи внутрь <table> вкладываются кастомные элементы <table-row>, что недопустимо. На этом этапе валидатор бросает критическую ошибку и прекращает дальнейший разбор разметки.

Фреймворк добавляет таким элементам свойство display: contents, которое делает кастомный элемент "прозрачным" при построении раскладки и не учитывает его. Но физически элемент всё равно остаётся в DOM и AOM, поэтому свойство проблему не решает.

Чем такая невалидная разметка чревата? Страница будет невалидной, валидатор не сможет полностью проверить страницу, ассистивные технологии, парсеры и поисковые роботы не распознают данные из таблицы, перестанут работать API-методы таблиц (добавление строк, получение данных и т.д.).

Как в этой ситуации поступить? Раз инструмент полагается на кастомные элементы, то всю таблицу стоит делать при помощи них и добавлять дополнительную семантику при помощи ARIA-атрибутов как рекомендуется в WAI-ARIA практиках для таблиц.

<my-table role="table" aria-rowcount="3" aria-colcount="2">
<table-row role="row">
<table-cell role="rowheader">Row number: 1</table-cell>
<table-cell role="cell">Date: 1714405915233</table-cell>
</table-row>
<table-row role="row">
<table-cell role="rowheader">Row number: 2</table-cell>
<table-cell role="cell">Date: 1714405915233</table-cell>
</table-row>
<table-row role="row">
<table-cell role="rowheader">Row number: 3</table-cell>
<table-cell role="cell">Date: 1714405915233</table-cell>
</table-row>
</my-table>
Web Accessibility Initiative (WAI) Table Example Accessibility resources free online from the international standards organization: W3C Web Accessibility Initiative (WAI).
  • ❤ 8
  • 👍 5
More from @alexnozer_dev
  1. Sep 28, 2026You don’t know HTML: SGML, HTML, XML, XHTML За свою историю язык разметки гипертекста HTML…
  2. Sep 23, 2026Images Preview На некоторых сайтах, где надо показывать изображения в высоком качестве, дл…
  3. Sep 21, 2026Реализация пользовательских атрибутов Под конец прошлого года я рассказывал об API пользов…
  4. Sep 14, 2026Подклассы Event вместо CustomEvent Многие библиотеки предоставляют систему событий в качес…
  5. Sep 11, 2026Эволюция стилей в темах Shopify Адам Ватан на днях поделился новостью, что Shopify выкупил…
  6. Sep 9, 2026Persistent Widgets Многие сайты не должны быть SPA. Но иногда эта архитектура продиктована…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →