Семантичний HTML
Семантичний HTML використовує теги, що описують значення контенту (<article>, <nav>, <main>) замість загальних контейнерів (<div>, <span>), щоб браузери, програми читання з екрана та пошукові системи розуміли, що саме являє собою кожна частина сторінки.
Теорія
TL;DR
<header>каже 'це header';<div class="header">каже 'виглядає як header' - різниця принципова- Семантичні теги автоматично передають ARIA-ролі допоміжним технологіям без додаткових атрибутів
<nav>стає 'navigation landmark',<main>стає 'main landmark' без жодного рядка JavaScript- Семантичні теги - для структури контенту;
<div>- тільки для стилізації або JS-контейнерів
Швидкий приклад
<!-- Несемантично: screen reader бачить "Div. Div. Div." -->
<div class="header">Лого і навігація</div>
<div class="main-content">Тіло статті</div>
<div class="footer">Копірайт</div>
<!-- Семантично: screen reader оголошує "Banner region. Navigation. Main." -->
<header>
<img src="logo.png" alt="Логотип компанії">
<nav><!-- навігаційні посилання --></nav>
</header>
<main>
<article>Контент статті</article>
</main>
<footer>© 2026 Компанія</footer>Візуально однаково. Але значення для всього, що читає HTML, - повністю різне.
Головна різниця
<div class="nav"> і <nav> виглядають у браузері однаково. Але <nav> автоматично отримує role="navigation" в accessibility tree під час парсингу DOM. Користувач screen reader може одразу перейти до навігації. З <div> потрібно вручну додавати role="navigation" - і цей атрибут стабільно зникає під час рефакторингу.
Коли використовувати
- Сторінка має шапку, навігацію, основний контент і підвал - бери
<header>,<nav>,<main>,<footer> - Пишеш блог-пост або новину - обгортай у
<article>, для тематичних блоків із заголовками використовуй<section> - Бічна панель із пов'язаними посиланнями -
<aside> - Контейнер для layout або JS-логіки без змістового значення -
<div>підійде
Як браузер це обробляє
Під час парсингу HTML рушії Blink (Chrome) і Gecko (Firefox) відображають семантичні елементи прямо в accessibility tree. <header> на верхньому рівні автоматично отримує role="banner". <main> отримує role="main". Screen reader-и звертаються до цього дерева через платформові API (MSAA на Windows, AXAPI на macOS) без жодного JavaScript. Це відбувається на етапі парсингу, не після запуску скриптів.
Типові помилки
<section> без заголовка
<!-- Неправильно: screen reader оголошує "section" без підпису -->
<section>Просто абзац тексту.</section>
<!-- Правильно: section означає тематичну групу і потребує заголовка -->
<section>
<h2>Чому доступність важлива</h2>
<p>...</p>
</section>Якщо заголовка немає - використовуй <div>.
<a> стилізований як кнопка
<!-- Неправильно: клавіатурні користувачі натискають Space на кнопці;
посилання на Space не реагує -->
<a href="#" class="btn">Надіслати</a>
<!-- Правильно: дії - це <button>, навігація - це <a> -->
<button type="submit">Надіслати</button>Користувачі screen reader очікують Enter для посилань і Enter/Space для кнопок. Якщо змішувати - клавіатурна навігація ламається.
Кілька вкладених <main>
<!-- Неправильно: AT оголошує кілька "main" landmark - користувачі губляться -->
<main>
<main>Контент</main>
</main>Один <main> на сторінку. Для підсекцій всередині - <section>.
role="main" на <div> замість <main>
<!-- Сьогодні працює, але зникне під час чергового прибирання коду -->
<div role="main" class="content">...</div>
<!-- Постійне рішення. Сам елемент ніхто не видалить. -->
<main class="content">...</main>Де зустрічається в реальних проектах
- Next.js App Router:
<header>,<main>,<nav>уlayout.tsx, обгортають кожну сторінку - Gatsby з MDX: кожен пост автоматично обгортається в
<article> - WordPress block editor: виводить
<figure>і<figcaption>для зображень за замовчуванням - Tailwind UI: семантична основа плюс utility-класи (
<nav class="flex space-x-4">)
Питання для поглиблення
Q: Яка різниця між <section> і <div>?
A: <section> представляє тематичну групу і має мати заголовок. <div> - суто презентаційний, без значення. Якщо не можеш дати секції заголовок - бери <div>.
Q: Можна використовувати <header> всередині <article>?
A: Так. <header> всередині <article> стає заголовком цієї статті, а не шапкою сайту. Тільки <header> на верхньому рівні отримує role="banner". Вкладені - просто групують вміст.
Q: Чи впливає семантичний HTML на SEO?
A: Google розглядає семантичні елементи як структурні сигнали. Контент в <article> індексується інакше, ніж контент у звичайному <div>. <header> і <footer> допомагають краулеру зрозуміти структуру сторінки, що впливає на відображення в результатах пошуку.
Q: Користувач screen reader потрапляє на <nav> з 50 посиланнями. Що відбувається?
A: Деякі screen reader-и (наприклад VoiceOver) дозволяють пропускати landmark-регіони. Інші змушують табуляцією проходити кожне посилання. Рішення: додай aria-label="Основна навігація" щоб розрізняти кілька <nav> на сторінці, і розмісти посилання 'Перейти до контенту' на самому початку сторінки.
Приклади
Структура блог-поста
<article>
<header>
<h1>Семантичний HTML: навіщо це потрібно</h1>
<!-- <time> повідомляє дату публікації не тільки людям, але й машинам -->
<time datetime="2026-04-14">14 квітня 2026</time>
</header>
<section>
<h2>Чому це важливо</h2>
<p>Screen reader-и використовують ці елементи для побудови навігаційних меню.</p>
</section>
<section>
<h2>Основні теги</h2>
<p>Починай зі структурних: header, main, footer, nav, article, aside.</p>
</section>
</article>Screen reader читає це так: 'Article. Heading level 1. Семантичний HTML: навіщо це потрібно. 14 квітня 2026.' Без семантики: 'Div. Div. Div.'
Повна структура сторінки з landmark-елементами
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8">
<title>ITLead - Підготовка до співбесід</title>
</head>
<body>
<header>
<a href="/">
<img src="logo.png" alt="Логотип ITLead">
</a>
<nav aria-label="Основна навігація">
<ul>
<li><a href="/questions">Питання</a></li>
<li><a href="/topics">Теми</a></li>
</ul>
</nav>
</header>
<main>
<article>
<h1>Що таке семантичний HTML?</h1>
<p>Контент тут...</p>
</article>
<aside aria-label="Пов'язані теми">
<h2>Дивись також</h2>
<ul>
<li><a href="/questions/aria">ARIA-ролі</a></li>
</ul>
</aside>
</main>
<footer>
<p>© 2026 ITLead</p>
</footer>
</body>
</html>Кожна велика область тут - це landmark. Користувач screen reader може відкрити меню landmark-ів і перейти прямо до 'Основна навігація', 'Main', 'Complementary' або 'Content info' - не прочитавши жодного слова контенту.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.