← HTML & CSS/Семантический HTML#11 из 383← ПредыдущийСледующий →+15 XP
Полезно по теме:Гайд: старт в frontendПрактика: DOM и событияТермин: DOMМаршрут: старт с нуля

Семантический HTML

Представь журнал. У него есть шапка с логотипом, навигация по разделам, основная статья, боковая колонка с рекламой, подвал с контактами. Читатель сразу понимает структуру. 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

Представь журнал. У него есть шапка с логотипом, навигация по разделам, основная статья, боковая колонка с рекламой, подвал с контактами. Читатель сразу понимает структуру. 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 — подвал.

Загружаем среду выполнения...
Загружаем AI-помощника...