Представь журнал. У него есть шапка с логотипом, навигация по разделам, основная статья, боковая колонка с рекламой, подвал с контактами. Читатель сразу понимает структуру. HTML5 дал нам теги, которые делают то же самое для браузеров, поисковиков и незрячих пользователей.
Семантика — это смысл. Семантический HTML означает, что каждый тег несёт смысловую нагрузку, описывает не как что-то выглядит, а что это такое.
<!-- Несемантично — div ни о чём не говорит -->
<div class="header">...</div>
<div class="nav">...</div>
<div class="main">...</div>
<!-- Семантично — теги описывают роль контента -->
<header>...</header>
<nav>...</nav>
<main>...</main><header> — шапка<header>
<img src="logo.svg" alt="Логотип" />
<nav>...</nav>
</header>Шапка страницы или секции. Обычно содержит логотип, заголовок, навигацию. Может встречаться несколько раз — как шапка страницы и как шапка статьи.
<nav> — навигация<nav>
<ul>
<li><a href="/">Главная</a></li>
<li><a href="/catalog">Каталог</a></li>
<li><a href="/about">О нас</a></li>
</ul>
</nav>Только для основных навигационных блоков. Ссылки в подвале можно оставить в <footer> без <nav>.
<main> — основной контент<main>
<h1>Каталог кроссовок</h1>
<p>Лучшие бренды по лучшим ценам.</p>
</main>Уникальный контент страницы. На странице должен быть один <main>. Хедер, футер и сайдбар сюда не входят.
<footer> — подвал<footer>
<p>© 2024 Sneaker Shop. Все права защищены.</p>
<a href="/privacy">Политика конфиденциальности</a>
</footer><section> — тематический раздел<section>
<h2>Популярные товары</h2>
<p>...</p>
</section>
<section>
<h2>Новые поступления</h2>
<p>...</p>
</section>Раздел со своим заголовком. У каждой <section> должен быть заголовок (h2–h6).
<article> — самостоятельная единица контента<article>
<h2>Обзор Nike Air Max 90</h2>
<p>Классическая модель, которая не устаревает...</p>
<footer>Автор: Иван, дата: 01.03.2024</footer>
</article>Контент, который можно вынуть из страницы и опубликовать отдельно: статья блога, карточка товара, твит, комментарий.
<aside> — боковой контент<aside>
<h3>Похожие товары</h3>
<ul>...</ul>
</aside>Контент, косвенно связанный с основным: сайдбар, блок рекламы, связанные статьи.
<figure> и <figcaption> — картинка с подписью<figure>
<img src="sneaker.jpg" alt="Nike Air Max 90" />
<figcaption>Nike Air Max 90 — классика с 1990 года</figcaption>
</figure>1. SEO: Google лучше понимает структуру и повышает позиции в поиске
2. Доступность: скринридеры озвучивают «Навигация», «Основное содержимое», «Подвал» — незрячий пользователь ориентируется на странице
3. Поддержка кода: разработчик с первого взгляда понимает структуру страницы
4. Совместимость: браузеры применяют умолчания по ролям тегов
Ошибка 1: div-soup — весь HTML из одних div
<div><div><div><div>Контент</div></div></div></div>Ошибка 2: section без заголовка
<section>
<p>Какой-то текст без заголовка</p> <!-- Неверно -->
</section>Ошибка 3: Перепутать article и section
<article> — самостоятельная единица (можно опубликовать отдельно).
<section> — часть большего целого (логический раздел страницы).
Lighthouse (инструмент Google) проверяет семантику в разделе Accessibility. Правильная семантика — это +баллы в Core Web Vitals. В Next.js и Nuxt структура с <header>, <main>, <footer> — стандарт из коробки.
Создание семантической структуры страницы через DOM
// Семантические теги и их роли
const semanticTags = [
{ tag: 'header', role: 'Шапка страницы — логотип и навигация' },
{ tag: 'nav', role: 'Навигационные ссылки' },
{ tag: 'main', role: 'Основное содержимое страницы' },
{ tag: 'section', role: 'Тематический раздел с заголовком' },
{ tag: 'article', role: 'Самостоятельная единица контента' },
{ tag: 'aside', role: 'Боковой контент — сайдбар, реклама' },
{ tag: 'footer', role: 'Подвал — копирайт, контакты' },
{ tag: 'figure', role: 'Картинка с подписью' },
]
console.log('Семантические теги HTML5:')
semanticTags.forEach(item => {
const el = document.createElement(item.tag)
console.log('<' + el.tagName.toLowerCase() + '> — ' + item.role)
})
// Строим структуру страницы
const page = document.createElement('div')
const header = document.createElement('header')
const nav = document.createElement('nav')
const main = document.createElement('main')
const aside = document.createElement('aside')
const footer = document.createElement('footer')
header.appendChild(nav)
page.append(header, main, aside, footer)
console.log('Структура страницы:')
Array.from(page.children).forEach(el => {
console.log(' <' + el.tagName.toLowerCase() + '>')
})figure и figcaption — семантическая картинка с подписью
// Создаём figure с figcaption (как в Wikipedia или статье блога)
const figure = document.createElement('figure')
const img = document.createElement('img')
img.src = 'https://example.com/nike-1990.jpg'
img.alt = 'Первая реклама Nike Air Max, 1990 год'
img.width = 600
img.height = 400
const caption = document.createElement('figcaption')
caption.textContent = 'Nike Air Max 90 — модель была представлена в 1990 году и продаётся по сей день'
figure.appendChild(img)
figure.appendChild(caption)
console.log('figure тег:', figure.tagName)
console.log('Изображение:', figure.querySelector('img').alt)
console.log('Подпись:', figure.querySelector('figcaption').textContent)
// article с внутренним footer (автор и дата)
const article = document.createElement('article')
const articleH2 = document.createElement('h2')
articleH2.textContent = 'История Nike Air Max'
const articleP = document.createElement('p')
articleP.textContent = 'Кроссовки с видимой воздушной подушкой изменили индустрию...'
const articleFooter = document.createElement('footer')
articleFooter.textContent = 'Автор: Иван Петров | 01 марта 2024'
article.append(articleH2, articleP, figure, articleFooter)
console.log('article содержит элементов:', article.children.length)Представь журнал. У него есть шапка с логотипом, навигация по разделам, основная статья, боковая колонка с рекламой, подвал с контактами. Читатель сразу понимает структуру. HTML5 дал нам теги, которые делают то же самое для браузеров, поисковиков и незрячих пользователей.
Семантика — это смысл. Семантический HTML означает, что каждый тег несёт смысловую нагрузку, описывает не как что-то выглядит, а что это такое.
<!-- Несемантично — div ни о чём не говорит -->
<div class="header">...</div>
<div class="nav">...</div>
<div class="main">...</div>
<!-- Семантично — теги описывают роль контента -->
<header>...</header>
<nav>...</nav>
<main>...</main><header> — шапка<header>
<img src="logo.svg" alt="Логотип" />
<nav>...</nav>
</header>Шапка страницы или секции. Обычно содержит логотип, заголовок, навигацию. Может встречаться несколько раз — как шапка страницы и как шапка статьи.
<nav> — навигация<nav>
<ul>
<li><a href="/">Главная</a></li>
<li><a href="/catalog">Каталог</a></li>
<li><a href="/about">О нас</a></li>
</ul>
</nav>Только для основных навигационных блоков. Ссылки в подвале можно оставить в <footer> без <nav>.
<main> — основной контент<main>
<h1>Каталог кроссовок</h1>
<p>Лучшие бренды по лучшим ценам.</p>
</main>Уникальный контент страницы. На странице должен быть один <main>. Хедер, футер и сайдбар сюда не входят.
<footer> — подвал<footer>
<p>© 2024 Sneaker Shop. Все права защищены.</p>
<a href="/privacy">Политика конфиденциальности</a>
</footer><section> — тематический раздел<section>
<h2>Популярные товары</h2>
<p>...</p>
</section>
<section>
<h2>Новые поступления</h2>
<p>...</p>
</section>Раздел со своим заголовком. У каждой <section> должен быть заголовок (h2–h6).
<article> — самостоятельная единица контента<article>
<h2>Обзор Nike Air Max 90</h2>
<p>Классическая модель, которая не устаревает...</p>
<footer>Автор: Иван, дата: 01.03.2024</footer>
</article>Контент, который можно вынуть из страницы и опубликовать отдельно: статья блога, карточка товара, твит, комментарий.
<aside> — боковой контент<aside>
<h3>Похожие товары</h3>
<ul>...</ul>
</aside>Контент, косвенно связанный с основным: сайдбар, блок рекламы, связанные статьи.
<figure> и <figcaption> — картинка с подписью<figure>
<img src="sneaker.jpg" alt="Nike Air Max 90" />
<figcaption>Nike Air Max 90 — классика с 1990 года</figcaption>
</figure>1. SEO: Google лучше понимает структуру и повышает позиции в поиске
2. Доступность: скринридеры озвучивают «Навигация», «Основное содержимое», «Подвал» — незрячий пользователь ориентируется на странице
3. Поддержка кода: разработчик с первого взгляда понимает структуру страницы
4. Совместимость: браузеры применяют умолчания по ролям тегов
Ошибка 1: div-soup — весь HTML из одних div
<div><div><div><div>Контент</div></div></div></div>Ошибка 2: section без заголовка
<section>
<p>Какой-то текст без заголовка</p> <!-- Неверно -->
</section>Ошибка 3: Перепутать article и section
<article> — самостоятельная единица (можно опубликовать отдельно).
<section> — часть большего целого (логический раздел страницы).
Lighthouse (инструмент Google) проверяет семантику в разделе Accessibility. Правильная семантика — это +баллы в Core Web Vitals. В Next.js и Nuxt структура с <header>, <main>, <footer> — стандарт из коробки.
Создание семантической структуры страницы через DOM
// Семантические теги и их роли
const semanticTags = [
{ tag: 'header', role: 'Шапка страницы — логотип и навигация' },
{ tag: 'nav', role: 'Навигационные ссылки' },
{ tag: 'main', role: 'Основное содержимое страницы' },
{ tag: 'section', role: 'Тематический раздел с заголовком' },
{ tag: 'article', role: 'Самостоятельная единица контента' },
{ tag: 'aside', role: 'Боковой контент — сайдбар, реклама' },
{ tag: 'footer', role: 'Подвал — копирайт, контакты' },
{ tag: 'figure', role: 'Картинка с подписью' },
]
console.log('Семантические теги HTML5:')
semanticTags.forEach(item => {
const el = document.createElement(item.tag)
console.log('<' + el.tagName.toLowerCase() + '> — ' + item.role)
})
// Строим структуру страницы
const page = document.createElement('div')
const header = document.createElement('header')
const nav = document.createElement('nav')
const main = document.createElement('main')
const aside = document.createElement('aside')
const footer = document.createElement('footer')
header.appendChild(nav)
page.append(header, main, aside, footer)
console.log('Структура страницы:')
Array.from(page.children).forEach(el => {
console.log(' <' + el.tagName.toLowerCase() + '>')
})figure и figcaption — семантическая картинка с подписью
// Создаём figure с figcaption (как в Wikipedia или статье блога)
const figure = document.createElement('figure')
const img = document.createElement('img')
img.src = 'https://example.com/nike-1990.jpg'
img.alt = 'Первая реклама Nike Air Max, 1990 год'
img.width = 600
img.height = 400
const caption = document.createElement('figcaption')
caption.textContent = 'Nike Air Max 90 — модель была представлена в 1990 году и продаётся по сей день'
figure.appendChild(img)
figure.appendChild(caption)
console.log('figure тег:', figure.tagName)
console.log('Изображение:', figure.querySelector('img').alt)
console.log('Подпись:', figure.querySelector('figcaption').textContent)
// article с внутренним footer (автор и дата)
const article = document.createElement('article')
const articleH2 = document.createElement('h2')
articleH2.textContent = 'История Nike Air Max'
const articleP = document.createElement('p')
articleP.textContent = 'Кроссовки с видимой воздушной подушкой изменили индустрию...'
const articleFooter = document.createElement('footer')
articleFooter.textContent = 'Автор: Иван Петров | 01 марта 2024'
article.append(articleH2, articleP, figure, articleFooter)
console.log('article содержит элементов:', article.children.length)Напиши семантическую HTML-структуру страницы блога. Используй теги: header с nav (ul > li * 3: "Главная", "Статьи", "Контакты"), main с article (h2 "Мой первый пост" и p с описанием), aside с h3 "Похожие статьи" и ul из 2 пунктов, footer с текстом копирайта.
Используй семантические теги: <header>, <nav>, <main>, <article>, <aside>, <footer>. Каждый тег несёт смысловую нагрузку: header — шапка, main — основной контент, aside — боковой контент, footer — подвал.