Gernar
Frontend DeveloperHTML и доступность

Интервью-вопрос

Что такое семантика в HTML

Семантика в HTML это выбор тегов по смыслу содержимого. На интервью покажите, что вы думаете не только о верстке, но и о доступности, клавиатуре, тестах и поддержке кода.

Добавлен
Редакция

Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.

🐰0
🥚0

Мини-квиз

Проверка перед разбором

Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.

Вопрос 1 из 50 правильно

Как лучше объяснить семантику в HTML?

Вы даете короткий ответ на интервью и хотите начать с главной идеи.

Варианты ответа

Разбор

Разобраться, а не зазубрить

Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.

Базовая идея

Семантика отвечает на простой вопрос: что это за часть интерфейса по смыслу. Не какой у нее цвет. Не какой класс удобнее для CSS. А какую роль этот элемент играет для пользователя и документа.

Например, список ссылок на разделы сайта лучше описать как <nav>. Основную уникальную часть страницы лучше поместить в <main>. Отправку формы лучше делать через <button type="submit">, а не через кликабельный <div>.

На интервью можно сказать так: семантический HTML отвечает за смысловую структуру, а CSS отвечает за внешний вид. Если смешать эти слои, интерфейс может выглядеть нормально, но стать неудобным для клавиатуры, скринридера, автотестов и поддержки.

Почему это важно на практике

Семантика влияет не только на аккуратность кода. Нативные элементы уже дают готовое поведение. <button> получает фокус с клавиатуры и активируется Enter или Space. <label> связывает текст с полем формы. <h1> - <h6> создают структуру заголовков, по которой удобно перемещаться.

Это особенно важно для доступности. Скринридер строит представление страницы на основе дерева доступности. Если вся страница сделана из <div>, пользователю сложнее найти основное содержимое, навигацию, форму или кнопку.

Семантика помогает избежать и обычных UI-багов. Кнопка без type внутри формы может случайно отправить данные. Ссылка с href="#" вместо действия меняет URL, сбивает клавиатурную навигацию и портит аналитику клика. Правильный тег помогает выбрать нужное поведение еще до обработчиков.

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

Как выбирать подходящий тег

Начинайте не со списка тегов, а с назначения блока. Если элемент что-то делает, чаще всего это кнопка. Если ведет по адресу, это ссылка. Если группирует поля ввода, нужны форма, label и связанные элементы. Если блок нужен только для grid или flex, семантический тег может быть лишним.

Как выбрать семантический элемент

1Это главный уникальный контент страницы?
Используйте <main>, обычно один видимый main на странице.
2Это навигация по сайту или внутри страницы?
Используйте <nav>, а при нескольких меню дайте им понятные aria-label.
3Блок можно читать отдельно от страницы?
Используйте <article> для поста, новости, комментария или карточки с самостоятельным смыслом.
4Это тематический раздел внутри страницы?
Используйте <section> и добавьте заголовок или доступное имя.
5Нужна только обертка для сетки или стилей?
Оставьте <div> или <span>, не добавляйте лишнюю семантику.

Пример плохой и безопасной разметки

Плохой вариант ниже может казаться рабочим, если проверять только мышью. Но по семантике он слабый. Навигация, основная область и действие спрятаны в обычных <div>. Пользователь с клавиатуры может не попасть на псевдокнопку. Скринридер не увидит нормальную структуру страницы. Ссылки нельзя будет открыть в новой вкладке или скопировать как обычный URL.

<!-- Плохо: смысл спрятан в class и onClick -->
<div class="header">
  <div class="menu">
    <span onclick="go('/')">Главная</span>
    <span onclick="go('/pricing')">Тарифы</span>
  </div>
</div>

<div class="content">
  <div class="title">Настройки профиля</div>
  <div class="save" onclick="saveProfile()">Сохранить</div>
</div>

Безопаснее выбрать элементы по назначению. Внешний вид можно сделать таким же через CSS, но поведение и смысл будут правильнее. Если сохранение запускает запрос, отдельно добавьте состояние loading, disabled и обработку ошибки. Семантика не заменяет UI-состояния, но дает правильную основу для взаимодействия.

<header>
  <nav aria-label="Основная навигация">
    <a href="/">Главная</a>
    <a href="/pricing">Тарифы</a>
  </nav>
</header>

<main>
  <h1>Настройки профиля</h1>
  <button type="button" onclick="saveProfile()">Сохранить</button>
</main>

В ответе на интервью не перечисляйте все теги HTML подряд. Лучше покажите принцип выбора и один пример, где неправильная разметка дает конкретный риск.

Роль div, span и ARIA

<div> и <span> не плохие элементы. Они нейтральные. Их нормально использовать для оберток, сетки, группировки без отдельного смысла или небольших inline-фрагментов.

Проблема начинается там, где нейтральный элемент заменяет подходящий нативный. Например, когда кнопку делают через <div>, ссылку через <span>, а поле формы оставляют без <label>.

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

Что сказать про SEO

Про SEO лучше говорить коротко и без обещаний. Семантическая разметка помогает поисковым системам лучше понимать структуру страницы: где заголовки, навигация, основной контент, повторяющиеся блоки. Но сама по себе она не гарантирует рост позиций.

На интервью формулируйте аккуратно: семантика полезна для машинного понимания документа, но главный frontend-риск обычно в доступности и поведении интерфейса. Такой ответ звучит точнее, чем фраза "семантика нужна для SEO".

Практический вывод для frontend-разработчика

Перед версткой задайте себе три вопроса. Что это за элемент по смыслу. Как пользователь будет с ним взаимодействовать. Есть ли нативный HTML-элемент, который уже дает нужную роль и поведение.

Если такой элемент есть, используйте его. Если нет, берите нейтральную обертку и добавляйте доступность осознанно. Так вы пишете код, который проще поддерживать и сложнее случайно сломать.

Слабый путь
  1. 1Сверстать все блоки через div
  2. 2Добавить клики на неинтерактивные элементы
  3. 3Подписать смысл только через className
  4. 4Потом чинить клавиатуру и скринридеры вручную
Безопасный путь
  1. 1Определить смысл блока для пользователя
  2. 2Выбрать нативный HTML-элемент
  3. 3Проверить заголовки, label и порядок фокуса
  4. 4Добавлять ARIA только для недостающих состояний

Частые ошибки

Где обычно ошибаются

Проверьте формулировки, которые звучат уверенно, но на интервью быстро выдают пробелы.

  1. 1

    Делать интерактив через div

    <div onClick> не становится кнопкой автоматически. У него нет нативного фокуса, клавиатурного поведения и понятной роли. Для действия используйте <button>, а если приходится делать кастомный элемент, добавьте роль, tabIndex, обработку Enter и Space, но лучше избегайте этого без необходимости.

  2. 2

    Называть семантику только SEO

    SEO это только часть эффекта. Главный практический плюс для frontend-разработчика в доступности, предсказуемом поведении и понятной структуре для команды. Если сказать только про поисковики, ответ звучит поверхностно.

  3. 3

    Использовать section как универсальный контейнер

    <section> нужен для тематического раздела, а не для каждой обертки сетки. Если у блока нет темы и заголовка, чаще подходит <div>. Иначе страница получает шумную структуру, которая не помогает навигации.

  4. 4

    Путать ссылку и кнопку

    <a> ведет к другому адресу или фрагменту страницы, <button> запускает действие. Если действие сделать ссылкой с href="#", появляются лишние переходы, плохой UX с клавиатуры и нестабильные тесты.

  5. 5

    Исправлять HTML только через ARIA

    ARIA может уточнить роль или состояние, но не заменяет нативное поведение. role="button" не добавит отправку формы, фокус и обработку клавиш. Безопаснее выбрать правильный HTML-элемент с самого начала.

  6. 6

    Забывать type у кнопки в форме

    У <button> внутри формы по умолчанию тип submit. Если кнопка открывает модалку, очищает поле или переключает вкладку, она может случайно отправить форму и вызвать лишний запрос. Для второстепенных действий пишите <button type="button">, а для отправки формы оставляйте submit осознанно.

Follow-up

Что могут спросить дальше

Короткие ответы на вопросы, которыми проверяют понимание семантики, доступности и практических ограничений HTML.

Живые ответы

Видео с похожим вопросом

Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.

Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.

Содержание