Находим ошибки модели содержимого

Что делаем: подключаем блок «Отзывы», в котором спрятаны шесть ошибок. Браузер покажет его без единого замечания, но спецификация такую разметку запрещает. Мы учимся искать эти ошибки.

Браузер прощает почти всё

Правило, которое нужно усвоить: если страница отображается, это ещё не значит, что она верна. Парсер HTML молча чинит ошибки и строит дерево по своим правилам, которое может отличаться от вашего кода. Поэтому ошибки модели содержимого находят не глазами, а проверкой.

Модель содержимого

У каждого элемента в спецификации есть раздел Content model: что можно положить внутрь. Элементы делятся на категории. Нас интересуют три:

КатегорияЧто туда входит
Строчное (phrasing) содержимоетекст, span, a, strong, em, img, button
Потоковое (flow) содержимоепочти всё: плюс p, div, ul, section
Интерактивное содержимоеa с href, button, input, select, details

Шесть ошибок в блоке «Отзывы»

Что в кодеЧто не так
ul внутри pp принимает только строчное содержимое: браузер закроет абзац до списка
div прямо внутри ulдети ul — только li (и скрипты/шаблоны)
h3 внутри spanspan — строчный, заголовок — потоковый
a внутри buttonинтерактивный элемент внутри интерактивного
два элемента с id="reviews"id обязан быть уникальным
label for="nick" при поле id="name"подпись указывает на несуществующее поле

Чем проверять

  • Nu Html Checker (validator.w3.org/nu): проверяет документ по стандарту и указывает строку.
  • Панель Accessibility в DevTools: показывает дерево доступности и имена элементов.
  • Проверка клавиатурой: пройдите страницу только клавишей Tab.
  • Автоматические проверки, например axe или Lighthouse: находят часть ошибок, но не все.
  • Диктор (NVDA, VoiceOver): проверка вживую.

Ни один инструмент не заменяет остальные: автоматика видит около трети проблем, а смысл всё равно проверяет человек.

По спецификации

Проверьте себя

Страница отображается без ошибок. Значит ли это, что разметка верна?
Что нельзя вкладывать друг в друга по модели содержимого?

Редактор · index.html

Предпросмотр

Подготовка окружения…

Ожидание запуска Vite…
Терминал