Семантические теги HTML5: полное руководство с примерами

Как семантический HTML проясняет структуру страницы для людей и машин, где он помогает доступности и почему это не короткий путь к позициям.

До HTML5 веб был морем div и span с CSS-классами вроде .header, .sidebar, .footer. Поисковые роботы и скринридеры вынуждены были угадывать, что есть что. HTML5 ввёл семантические теги — элементы, которые несут смысл сами по себе, независимо от CSS. Тег <article> обозначает самодостаточный материал. <nav> — навигацию. <aside> — дополнительный контент, связанный с основным, но не обязательный для понимания.

Семантика ≠ стилизация. Семантический тег описывает роль элемента в документе, а не его внешний вид. Внешний вид задаёт CSS. Без стилей <section> и <div> выглядят одинаково — разница в том, что браузер и поисковик знают о <section> то, чего не знают о <div>.

Структурные теги страницы

HTML5 ввёл набор тегов для разметки крупных областей страницы. Они образуют скелет документа, по которому браузеры, поисковые системы и вспомогательные технологии могут пройти, не читая CSS.

Наглядная схема семантической структуры страницы в HTML5.
<header>
Вводное содержимое ближайшего секционного контекста — страницы или раздела. На уровне страницы это шапка сайта с логотипом, навигацией и поиском. Внутри <article> — заголовок, метаданные и автор. На одной странице может быть несколько <header>, если они относятся к разным разделам.
<nav>
Блок навигационных ссылок. Не каждый набор ссылок оборачивают в <nav>, только основные маршруты навигации: главное меню, хлебные крошки, пагинацию. Ссылки на политику конфиденциальности в подвале — не <nav>. Скринридеры используют <nav>, чтобы перейти к навигации горячей клавишей.
<main>
Уникальное основное содержимое страницы. В документе должен быть только один <main>. Содержимое <main> не должно повторяться на других страницах: шапка, подвал и боковые панели повторяются, поэтому они вынесены за пределы <main>. Скринридеры переходят к <main> горячей клавишей.
<footer>
Завершающий раздел ближайшего секционного контекста. На уровне страницы это контакты, копирайт и ссылки. Внутри <article> — информация об авторе, теги и дата последнего обновления. Как и <header>, может встречаться в нескольких разделах.
<article>
Самодостаточный материал, который можно распространять отдельно: статья блога, новость, пост на форуме, карточка товара или комментарий. Ключевая проверка: если вырвать <article> из контекста и опубликовать отдельно, сохранит ли он смысл? Если да — это <article>.
<section>
Тематически цельная часть документа, для которой нет более точного тега. Должна иметь заголовок (<h2>–<h6>). Если заголовка нет, скорее всего нужен <div>. Не используйте <section> вместо <div> для стилизации.
<aside>
Контент, косвенно связанный с основным: врезки, боковые панели, рекламные блоки, биографии авторов, похожие материалы. Внутри <article> — примечание или цитата, не критичные для понимания основного текста. На уровне страницы — боковая колонка.

Базовый скелет любой страницы выглядит так — и это уже семантически корректная разметка:

html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Page title</title>
</head>
<body>

  <header>
    <a href="/"><img src="logo.svg" alt="Company name"></a>
    <nav aria-label="Main navigation">
      <ul>
        <li><a href="/blog">Blog</a></li>
        <li><a href="/services">Services</a></li>
        <li><a href="/contacts">Contacts</a></li>
      </ul>
    </nav>
  </header>

  <main>
    <!-- Unique page content -->
  </main>

  <footer>
    <p>&copy; 2026 Company name</p>
    <nav aria-label="Secondary navigation">
      <a href="/privacy">Privacy</a>
      <a href="/sitemap">Sitemap</a>
    </nav>
  </footer>

</body>
</html>

Теги для контента: article, section, h1–h6, p

Структурные теги задают области страницы. Теги содержимого описывают природу самого контента. Посмотрим на сочетание, которое встречается на каждой странице блога.

html
<!-- Blog post page -->
<main>

  <article>
    <header>
      <h1>How to choose the right HTML tag</h1>
      <p>Published: <time datetime="2026-05-22">22 May 2026</time></p>
      <address>
        By: <a rel="author" href="/authors/pavlo">seohead</a>
      </address>
    </header>

    <section>
      <h2>Why semantics matters</h2>
      <p>Section text...</p>
    </section>

    <section>
      <h2>Main tags</h2>
      <p>Section text...</p>

      <aside>
        <p>Note: the HTML Living Standard is continuously updated.</p>
      </aside>
    </section>

    <footer>
      <p>Tags: <a href="/tags/html">#html</a>, <a href="/tags/seo">#seo</a></p>
    </footer>
  </article>

  <!-- Related articles -->
  <aside aria-label="Related articles">
    <h2>Also read</h2>
    <ul>
      <li><a href="/blog/heading-structure">Heading structure</a></li>
      <li><a href="/blog/schema-org-json-ld">Schema.org markup</a></li>
    </ul>
  </aside>

</main>
Обратите внимание: <header> и <footer> внутри <article> — не то же, что <header> и <footer> уровня страницы. Это отдельные секционные контексты. Поисковые роботы понимают это различие и правильно относят заголовок, дату и автора к конкретной статье, а не к сайту в целом.

Когда использовать section, а когда div

Правило простое: если у блока есть смысловое название, используйте <section>. Если блок нужен только для оформления или как хук для JavaScript, используйте <div>.

html
<!-- CORRECT: section with a heading -->
<section>
  <h2>Product benefits</h2>
  <ul>
    <li>Fast delivery</li>
    <li>2-year warranty</li>
  </ul>
</section>

<!-- CORRECT: div for styling -->
<div class="cards-grid">
  <article>...</article>
  <article>...</article>
  <article>...</article>
</div>

<!-- WRONG: section with no heading -->
<section class="cards-grid">
  <article>...</article>
</section>

<!-- WRONG: div where content has meaning -->
<div id="about">
  <!-- The About section — this should be <section> -->
  <h2>About us</h2>
  <p>...</p>
</div>

Медиа, данные и служебные теги

HTML5 добавил теги для отдельных типов данных. Они дают поисковикам дополнительные сигналы без разметки Schema.org.

<figure> и <figcaption>

Самодостаточное медиа с подписью: изображения, диаграммы, таблицы, фрагменты кода — всё, что связано с основным текстом и могло бы быть перенесено в приложение без потери смысла. <figcaption> — официальная подпись к <figure>. Google использует <figcaption> как дополнительное описание при анализе изображений.

<time>

Машиночитаемая дата или время. Атрибут datetime в формате ISO 8601 позволяет поисковой системе точно определить дату публикации или события независимо от того, как дата показана пользователю. Google прямо рекомендует использовать <time> для дат статей в разметке Article структурированных данных.

<address>

Контактная информация для ближайшего <article> или всего документа. Внутри <article> — контакты автора. На уровне страницы — контакты организации. Не используйте <address> для почтовых адресов вне контекста контактов автора или организации.

<details> и <summary>

Нативный сворачиваемый блок без JavaScript. <summary> — видимый заголовок, <details> — скрытое содержимое. Браузер сам открывает и закрывает блок. Поисковые системы индексируют содержимое <details>, даже когда блок закрыт. Подходит для FAQ и спойлеров.

<mark>

Выделяет текст как релевантный в текущем контексте, например результаты поиска или ключевые слова в цитате. Не путайте с <strong> (важность) и <em> (акцент). <mark> означает «отмечено как релевантное», а не «важно» и не «оформлено для красоты».

<data> и <output>

<data value="42">Сорок два</data> связывает понятный человеку текст с машиночитаемым значением. <output> показывает результат вычисления или действия пользователя. Оба тега редко встречаются на контентных сайтах, но незаменимы в веб-приложениях с формами и калькуляторами.

Пример разметки для тега <figure> с подписью:
html
<!-- figure + figcaption for an image -->
<figure>
  <img
    src="/images/html5-structure.webp"
    alt="Diagram of the semantic structure of an HTML5 page"
    width="800" height="450"
  >
  <figcaption>Fig. 1 — Typical semantic structure of an HTML5 document</figcaption>
</figure>

<!-- figure + figcaption for code -->
<figure>
  <pre><code class="language-html">&lt;article&gt;...&lt;/article&gt;</code></pre>
  <figcaption>Example: minimal article markup</figcaption>
</figure>

<!-- time with datetime attribute -->
<p>
  Article updated:
  <time datetime="2026-05-22T10:30:00+03:00">22 May 2026</time>
</p>

<!-- details + summary (FAQ without JS) -->
<details>
  <summary>What is semantic HTML?</summary>
  <p>Markup where each tag conveys the meaning of the content,
     not just its visual appearance.</p>
</details>

<!-- mark for search highlighting -->
<p>Results for "<mark>semantic tags</mark>" — 42 articles</p>

Вложенность и комбинации: реальные примеры

Семантическая сила HTML5 проявляется не в отдельных тегах, а в их правильном сочетании. Разберём типичные архитектуры страниц.

Страница списка статей блога

html
<main>
  <header>
    <h1>SEO blog</h1>
    <p>Practical articles on website promotion</p>
  </header>

  <!-- Article list — each card is an article -->
  <section aria-label="Article list">
    <article>
      <header>
        <h2><a href="/blog/semantic-html5">HTML5 semantic tags</a></h2>
        <p>
          <time datetime="2026-05-22">22 May 2026</time>
          · <span>18 min read</span>
        </p>
      </header>
      <p>HTML5 semantic tags are the foundation of correct page markup...</p>
      <footer>
        <a href="/blog/semantic-html5">Read more</a>
      </footer>
    </article>

    <article>
      <header>
        <h2><a href="/blog/heading-structure">Heading structure</a></h2>
        <p>
          <time datetime="2026-04-10">10 April 2026</time>
          · <span>12 min read</span>
        </p>
      </header>
      <p>One H1 per page. H2 divides content into sections...</p>
      <footer>
        <a href="/blog/heading-structure">Read more</a>
      </footer>
    </article>
  </section>

  <!-- Pagination -->
  <nav aria-label="Pagination">
    <a href="?page=1" aria-current="page">1</a>
    <a href="?page=2">2</a>
    <a href="?page=3">3</a>
  </nav>
</main>

Карточка товара с отзывами

html
<main>
  <article itemscope itemtype="https://schema.org/Product">

    <!-- Product main area -->
    <header>
      <h1 itemprop="name">SoundMax Pro Wireless Headphones</h1>
      <p itemprop="description">40 hours of battery life, active noise cancellation...</p>
    </header>

    <!-- Product image -->
    <figure>
      <img
        src="/products/soundmax-pro.webp"
        alt="SoundMax Pro wireless headphones — front view"
        itemprop="image"
        width="600" height="600"
      >
      <figcaption>SoundMax Pro in three colours: black, white, blue</figcaption>
    </figure>

    <!-- Price -->
    <section aria-label="Price and purchase">
      <p>
        <data value="129" itemprop="price">$129</data>
      </p>
      <button type="button">Add to cart</button>
    </section>

    <!-- Specs -->
    <section>
      <h2>Specifications</h2>
      <dl>
        <dt>Battery life</dt><dd>40 hours</dd>
        <dt>Connection</dt><dd>Bluetooth 5.3</dd>
        <dt>Weight</dt><dd>250 g</dd>
      </dl>
    </section>

    <!-- Reviews — each review is an article inside article -->
    <section aria-label="Customer reviews">
      <h2>Reviews</h2>

      <article>
        <header>
          <strong>Anna K.</strong>
          <time datetime="2026-04-15">15 April 2026</time>
        </header>
        <p>Excellent headphones, clean sound. The noise cancellation works brilliantly.</p>
      </article>

      <article>
        <header>
          <strong>Michael R.</strong>
          <time datetime="2026-03-28">28 March 2026</time>
        </header>
        <p>The 40-hour claim is real. Took them on a business trip and they lasted the week.</p>
      </article>
    </section>

  </article>
</main>

Лендинг с секциями и боковой панелью

html
<body>
  <header>
    <nav aria-label="Main navigation">
      <!-- logo + menu -->
    </nav>
  </header>

  <main>
    <!-- Hero section -->
    <section aria-labelledby="hero-title">
      <h1 id="hero-title">SEO promotion for your business</h1>
      <p>We help businesses improve technical and content foundations</p>
      <a href="#contacts" role="button">Get a free audit</a>
    </section>

    <!-- Services -->
    <section>
      <h2>Our services</h2>
      <ul role="list">
        <li>
          <article>
            <h3>Technical audit</h3>
            <p>Full technical health check of your site...</p>
          </article>
        </li>
        <li>
          <article>
            <h3>Content strategy</h3>
            <p>Keyword universe and content calendar...</p>
          </article>
        </li>
      </ul>
    </section>

    <!-- Main content + sidebar -->
    <div class="layout-two-col">
      <section>
        <h2>Case studies</h2>
        <!-- ... -->
      </section>

      <aside aria-label="Contact us">
        <h2>Get in touch</h2>
        <address>
          <p>Email: <a href="mailto:hello@seohead.tech">hello@seohead.tech</a></p>
          <p>Telegram: <a href="https://t.me/seohead">@seohead</a></p>
        </address>
      </aside>
    </div>
  </main>

  <footer>
    <nav aria-label="Site map">
      <ul>
        <li><a href="/blog">Blog</a></li>
        <li><a href="/glossary">Glossary</a></li>
      </ul>
    </nav>
    <p><small>&copy; 2026 seohead.tech</small></p>
  </footer>
</body>
В примере с лендингом используем aria-labelledby, чтобы связать секцию с заголовком через id. Так скринридер правильно назовёт секцию, даже если заголовок оформлен нестандартно. Это хорошая практика для всех <section> и <nav>, у которых название неочевидно из структуры.
html
<!-- Multiple <nav> elements are fine — distinguish them with aria-label -->

<!-- Breadcrumbs -->
<nav aria-label="Breadcrumbs">
  <ol>
    <li><a href="/">Home</a></li>
    <li><a href="/blog">Blog</a></li>
    <li aria-current="page">HTML5 semantic tags</li>
  </ol>
</nav>

<!-- Main navigation inside <header> -->
<nav aria-label="Main navigation">
  <ul>
    <li><a href="/blog" aria-current="page">Blog</a></li>
    <li><a href="/services">Services</a></li>
  </ul>
</nav>

<!-- Pagination at the end of a listing -->
<nav aria-label="Blog pages">
  <a href="?page=1" rel="prev" aria-label="Previous page">←</a>
  <a href="?page=1">1</a>
  <span aria-current="page">2</span>
  <a href="?page=3">3</a>
  <a href="?page=3" rel="next" aria-label="Next page">→</a>
</nav>

<!-- In-page table of contents -->
<nav aria-label="Article contents">
  <ol>
    <li><a href="#structural-tags">Structural tags</a></li>
    <li><a href="#content-tags">Content tags</a></li>
    <li><a href="#nesting-examples">Nesting examples</a></li>
  </ol>
</nav>

Влияние на SEO: что получает поисковая система

Семантическая разметка даёт браузерам и вспомогательным технологиям более понятную структурную информацию. Она может упростить интерпретацию и поддержку страницы, но это не прямой рычаг ранжирования и не замена полезному контенту.

Определение основного контента

Google использует <main>, чтобы определить основное содержимое страницы. Контент в шапке, подвале и <aside> получает меньший вес при ранжировании. Если весь текст находится внутри <div class="main">, Google тратит дополнительные ресурсы на понимание структуры.

Дата и атрибуция автора

<time datetime="2026-05-22"> даёт Google точную дату публикации, что помогает оценить свежесть материала. <address> с rel="author" связывает статью с автором. Оба сигнала участвуют в формировании расширенных результатов в выдаче.

Расширенные результаты

Содержимое <details> + <summary> индексируется Google и может показываться в выдаче как раскрывающиеся блоки (People Also Ask). <figure> + <figcaption> влияют на индексацию изображений и на то, как они отображаются в Google Картинках.

Внутренняя перелинковка

Ссылки внутри <nav> получают навигационный контекст, а ссылки внутри <article> — контентный. Googlebot учитывает положение ссылки на странице при оценке её веса. Ссылка из основного текста <article> ценнее ссылки из <aside>.

Schema.org (JSON-LD) и семантические теги HTML5 дополняют друг друга, а не конкурируют. Семантика задаёт структуру документа, Schema.org добавляет машиночитаемые данные о типе контента, сущностях и свойствах. Вместе они дают Google полную картину страницы.

Частые ошибки в семантической разметке

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

html
<!-- MISTAKE 1: <section> instead of <div> for styling -->
<section class="flex-wrapper">  <!-- no heading = not section -->
  <img src="photo.jpg" alt="">
</section>
<!-- CORRECT -->
<div class="flex-wrapper">
  <img src="photo.jpg" alt="Photo description">
</div>

<!-- MISTAKE 2: <article> for a card without standalone meaning -->
<article class="feature-card">
  <span class="icon">⚡</span>
  <h3>Fast delivery</h3>
</article>
<!-- CORRECT: a benefits card is li or div, not article -->
<li class="feature-card">
  <span class="icon" aria-hidden="true">⚡</span>
  <h3>Fast delivery</h3>
</li>

<!-- MISTAKE 3: <header> as a synonym for <div class="header"> -->
<header class="section-header">
  <h2>Our advantages</h2>
</header>
<!-- CORRECT: use <header> only when a section has an introductory group -->
<section>
  <h2>Our advantages</h2>  <!-- h2 directly, no header wrapper -->
  ...
</section>

<!-- MISTAKE 4: two <main> elements -->
<main>Primary content</main>
<main>Also important content</main>  <!-- invalid! -->
<!-- CORRECT: one <main>, supplementary content in <aside> -->
<main>Primary content</main>
<aside>Supplementary content</aside>

<!-- MISTAKE 5: <address> for an office address in body text -->
<address>1 High Street, London</address>  <!-- not in an author/org context -->
<!-- CORRECT -->
<p>Office address: 1 High Street, London</p>
<!-- or in footer as site contact information: -->
<footer>
  <address>
    <a href="mailto:hello@company.com">hello@company.com</a>
  </address>
</footer>
Самая частая ошибка — использовать <section> как красивое название для обёртки без смыслового значения. Простой тест: если заменить <section> на <div> и смысл не изменится, правильный тег — <div>.

Ещё одна частая проблема — пустые или отсутствующие атрибуты alt. Изображения внутри <figure> должны иметь либо осмысленный alt, либо alt="", если изображение декоративное и описано в <figcaption>. Никогда не опускайте атрибут alt полностью: это нарушает требования доступности и валидацию HTML.

html
<!-- Decorative image: empty alt, figcaption describes it -->
<figure>
  <img src="chart.png" alt="" role="presentation">
  <figcaption>Organic traffic growth over 6 months: +340%</figcaption>
</figure>

<!-- Informative image: full alt text -->
<figure>
  <img
    src="html5-tags-map.png"
    alt="Map of HTML5 semantic tags: header, nav, main, article, section, aside, footer"
  >
  <figcaption>Fig. 2 — Complete map of HTML5 semantic elements</figcaption>
</figure>

<!-- Mistake: no alt at all -->
<img src="diagram.png">  <!-- invalid! -->

Частые вопросы

Влияет ли семантическая разметка напрямую на ранжирование в Google?
Отдельного бонуса за семантику нет. Используйте семантический HTML, потому что он задаёт документу понятную структуру и поддерживает доступность. Оценивайте поисковые результаты по всей странице, контенту и техническим признакам, а не по выбору одного тега.
Можно ли вкладывать <article> в <article>?
Да, и это корректно. Классический пример: карточка товара (<article>) содержит раздел отзывов, где каждый отзыв — тоже <article>. Или статья блога (<article>) содержит встроенный пост из соцсети (<article>). Вложенный <article> означает, что внутренний элемент — самостоятельный материал, связанный с внешним.
Чем <strong> отличается от <b>, а <em> от <i>?
<strong> отмечает содержимое как важное: скринридеры добавляют ударение. <b> — просто стилистическое выделение без смысла важности. <em> добавляет смысловое ударение, которое меняет значение фразы («я не говорил, что он украл»: ударение меняет смысл). <i> — курсив без ударения: термины, иностранные слова, названия произведений. Разница для SEO минимальна, для доступности — существенна.
Нужен ли role="main" вместе с тегом <main>?
Нет. Тег <main> уже имеет неявную роль ARIA main. Добавлять role="main" избыточно. То же касается <nav> (роль navigation), <header> уровня страницы (роль banner) и <footer> (роль contentinfo). Дублирование тега и роли только путает дерево доступности.
Что с одностраничными приложениями (SPA) на React или Vue?
Здесь семантика важна вдвойне. SPA генерирует HTML динамически, поэтому роботы и скринридеры получают структуру только после JavaScript-рендеринга. Убедитесь, что при переходах между «страницами» обновляется <title>, фокус переносится на <main>, а семантическая структура каждой «страницы» воспроизводится правильно. React и Vue не мешают семантической разметке — это вопрос дисциплины в команде.

Check it with SpiderHead

Free and local: run the audit on your own machine.

Try it