$ sudo teach IT
Урок 6.1 — Семантическая вёрстка | Модуль 6
Модуль 6 — Практика и заключение

Урок 6.1: Семантическая вёрстка

Учимся писать HTML, который понимают не только браузеры, но и люди

Что такое семантический тег?

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

Вспомните тег <b> и тег <strong>. Визуально они выглядят одинаково — жирный текст. Но:

  • <b> — просто жирное начертание. Никакого смысла.
  • <strong> — важность. Скринридеры выделят этот текст интонацией.

То же самое с <i> (курсив) и <em> (логическое ударение). Семантические теги — это теги, которые объясняют, что находится внутри: шапка, меню, статья, подвал, навигация, раздел.

💡 Запомните: семантическая вёрстка — это когда по тегам можно понять структуру страницы, даже не читая содержимого. Откройте HTML, и вы сразу видите: «вот шапка, вот навигация, вот главная статья, вот боковая колонка».

Раньше, в 2000-е, веб-разработчики верстали страницы так:

<div id="header">
  <div class="logo">Мой сайт</div>
  <div class="nav">
    <div class="menu-item">Главная</div>
    <div class="menu-item">О нас</div>
  </div>
</div>
<div id="content">
  <div class="post">
    <div class="post-title">Заголовок</div>
    <div class="post-body">Текст...</div>
  </div>
</div>
<div id="footer">
  <div class="copyright">2026 Все права защищены</div>
</div>

Это работает, но это «верстка табуретками». Вместо того чтобы сказать «это навигация», мы говорим «это див с классом nav». Браузер, поисковик, скринридер — они не понимают, что это навигация. Они просто видят блок.

Современный, семантический подход:

<header>
  <div class="logo">Мой сайт</div>
  <nav>
    <a href="/">Главная</a>
    <a href="/about">О нас</a>
  </nav>
</header>
<main>
  <article>
    <h1>Заголовок</h1>
    <p>Текст...</p>
  </article>
</main>
<footer>
  <p>2026 Все права защищены</p>
</footer>

Чувствуете разницу? Теперь сами теги говорят о том, что внутри. <header> — шапка. <nav> — навигация. <main> — главное содержимое. <article> — статья. <footer> — подвал.

Зачем нужна семантическая вёрстка?

1. SEO (поисковая оптимизация)

Google и Яндекс — это программы, которые читают ваш HTML. У них нет глаз, они не видят, как красиво выглядит страница. Они видят только код. И они обучаются распознавать семантические теги.

Когда поисковик видит <article>, он понимает: «Ага, это самостоятельный материал, его можно показывать в поиске». Когда видит <nav>: «Это навигация по сайту, не буду её индексировать как основной контент».

Когда видит <h1> — это главный заголовок страницы, самое важное ключевое слово. А <h2> — подзаголовки разделов.

📈 Реальный пример

Два интернет-магазина продают одинаковые товары. Один свёрстан дивами, второй — семантически. У второго — выше позиции в поиске, потому что Google лучше понимает структуру его страниц. Это не теория — это подтверждённые практикой кейсы.

2. Доступность (a11y)

Миллионы людей по всему миру пользуются скринридерами — программами, которые озвучивают содержимое экрана. Не потому что не видят, а потому что так удобнее (например, за рулём).

Скринридеры ориентируются на семантику. Когда они встречают <nav>, они говорят: «Навигация, 5 ссылок». Когда <article>: «Статья, заголовок такой-то». Пользователь может перепрыгивать между разделами, как по главам книги.

Если вся страница свёрстана дивами — скринридер просто прочитает текст подряд. Представьте, что книгу без оглавления и абзацев читают вслух — сплошной поток слов. Неудобно, правда?

💡 Хорошая практика: проверьте свою страницу с выключенным CSS. Если структура читается и понятна — вы молодец. Если это каша из дивов — пора переделывать.

3. Читаемость кода и поддержка

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

Сравните два фрагмента:

<!-- Несемантически -->
<div class="footer">
  <div class="footer-columns">
    <div class="footer-col">...</div>
    <div class="footer-col">...</div>
  </div>
</div>

<!-- Семантически -->
<footer>
  <div class="footer-columns">
    <section>...</section>
    <section>...</section>
  </div>
</footer>

Второй вариант сразу понятен: это подвал сайта, внутри — разделы. Первый вариант: «какой-то див с классом footer, внутри ещё дивы...».

4. Будущее и стандарты

HTML развивается. Семантические теги появились в спецификации HTML5 (2014 год). Сегодня это стандарт. Завтра появятся новые возможности, которые будут опираться на семантику. Если ваш код уже семантичен — вы готовы к будущему. Если нет — придётся переписывать.

Основные семантические теги

Давайте разберём каждый тег подробно, с примерами и пояснениями.

<header> — шапка сайта или раздела

Тег <header> обозначает вводную часть: шапку сайта, заголовок раздела, предисловие к статье. Может содержать логотип, название, навигацию, поиск.

Важно: <header> может быть несколько на странице. Например, один — шапка всего сайта, другой — заголовок внутри статьи.

<header>
  <img src="logo.svg" alt="Логотип компании">
  <h1>Название сайта</h1>
  <p>Краткое описание, слоган</p>
</header>

<article>
  <header>
    <h2>Заголовок статьи</h2>
    <time datetime="2026-06-24">24 июня 2026</time>
    <p>Автор: Иван Петров</p>
  </header>
  <p>Текст статьи...</p>
</article>

<nav> — навигация

Внутри <nav> помещают основные ссылки для навигации по сайту или по разделу. Не все ссылки должны быть в nav — только самые важные блоки ссылок.

<nav>
  <ul>
    <li><a href="/">Главная</a></li>
    <li><a href="/blog">Блог</a></li>
    <li><a href="/contacts">Контакты</a></li>
  </ul>
</nav>

Обратите внимание: навигацию обычно делают списком (<ul> + <li>), потому что это логически — список ссылок. Но это не строгое требование.

<main> — главное содержимое (один на страницу)

<main> — уникальный тег. Он может встречаться на странице только один раз. Внутри — основное содержимое страницы, уникальное для неё. То, что не повторяется на других страницах (шапка, подвал, боковая панель — повторяются, поэтому они не в main).

<body>
  <header>...</header>
  <main>
    <h1>Добро пожаловать!</h1>
    <p>Это уникальный контент страницы...</p>
  </main>
  <footer>...</footer>
</body>
💡 Запомните: <main> — это то, ради чего пользователь пришёл на страницу. Шапка и подвал — важны, но они вторичны.

<section> — раздел

<section> группирует связанное содержимое. Обычно внутри есть заголовок (<h1>–<h6>).

Представьте, что страница — это книга. <section> — это глава. У каждой главы есть название.

<section>
  <h2>Наши услуги</h2>
  <div class="services-grid">
    <div class="service">
      <h3>Веб-разработка</h3>
      <p>Создаём сайты любой сложности</p>
    </div>
    <div class="service">
      <h3>SEO-продвижение</h3>
      <p>Выводим в топ поисковых систем</p>
    </div>
  </div>
</section>

<article> — самостоятельная статья или новость

<article> — это содержимое, которое можно «вынуть» из страницы и оно не потеряет смысла. Новость, пост в блоге, комментарий, карточка товара.

Главное свойство article — самодостаточность. Если вы захотите опубликовать этот блок на другом сайте или в RSS-ленте — он должен быть понятен.

<article>
  <h2>Google представил новую нейросеть</h2>
  <p><time datetime="2026-06-20">20 июня 2026</time></p>
  <p>Компания Google анонсировала новую модель...</p>
  <a href="/news/google-ai">Читать далее</a>
</article>

Внутри article могут быть свои header, footer, section — всё как на полноценной странице.

<aside> — боковая панель

<aside> содержит информацию, косвенно связанную с основным контентом. Боковая панель, блок «похожие статьи», реклама, цитата.

<aside>
  <h3>Интересные статьи</h3>
  <ul>
    <li><a href="#">Как учить верстку</a></li>
    <li><a href="#">CSS Grid vs Flexbox</a></li>
  </ul>
</aside>

<footer> — подвал

<footer> — заключительная часть: копирайт, контакты, ссылки на соцсети, карта сайта.

<footer>
  <p>© 2026, Учебный центр. Все права защищены.</p>
  <nav>
    <a href="/privacy">Политика конфиденциальности</a>
    <a href="/terms">Условия использования</a>
  </nav>
</footer>

Визуальная схема семантической страницы

Вот так выглядит типичная семантическая страница:

<header>
   Логотип + Название
  <nav> — ссылки</nav>
</header>

<main>
  <article>
    <header> — заголовок, дата</header>
    Текст статьи
    <section> — комментарии</section>
  </article>
  <aside> — похожие статьи</aside>
</main>

<footer>
   Копирайт, контакты
</footer>

Вложенность семантических тегов

Семантические теги можно (и нужно) вкладывать друг в друга. Важно понимать, какие комбинации имеют смысл:

Конструкция Смысл Оценка
<article> > <section> В статье несколько разделов ✓
<section> > <article> В разделе несколько статей ✓
<header> > <nav> Навигация внутри шапки ✓
<article> > <article> Например, комментарии к статье ✓
<main> > <main> Невалидно — main может быть только один ✗
<nav> > <nav> Навигация внутри навигации — бессмысленно ✗
<footer> > <header> В подвале может быть заголовок ✓

Почему <div> — это плохо?

Давайте сразу расставим точки над i: <div> — не зло. Это универсальный контейнер без семантического значения. И это нормально — использовать его там, где никакой другой тег не подходит.

Проблема возникает, когда <div> используют везде, игнорируя семантические теги. Это называется «div-verstka» или «div-болезнь».

Вот чем плоха бездумная верстка дивами:

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

Правило простое: если есть подходящий семантический тег — используйте его. Если нет — используйте <div>.

Например, для галереи изображений нет специального тега. Можно обернуть дивом. А для навигации есть <nav> — используем его.

💡 Золотое правило: открываем HTML, смотрим на теги, и должно быть сразу понятно, где что находится. Если видите 20 дивов подряд — что-то пошло не так.

Практика: вёрстка блога

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

Задача: страница блога с шапкой, навигацией, списком статей, боковой панелью и подвалом. Каждая статья — самодостаточный <article>.

Попробуйте сначала написать сами, а потом сверьтесь с кодом ниже:

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Мой блог</title>
    <style>
        * { margin: 0; padding: 0; box-sizing: border-box; }
        body {
            font-family: system-ui, sans-serif;
            line-height: 1.6;
            color: #333;
            background: #f8f8f8;
        }
        .container {
            max-width: 1100px;
            margin: 0 auto;
            padding: 20px;
        }
        header {
            background: #2d2d2d;
            color: white;
            padding: 20px 0;
        }
        header .container {
            display: flex;
            justify-content: space-between;
            align-items: center;
        }
        nav a {
            color: white;
            text-decoration: none;
            margin-left: 20px;
        }
        nav a:hover { text-decoration: underline; }
        .content-wrapper {
            display: grid;
            grid-template-columns: 1fr 300px;
            gap: 30px;
            margin: 30px 0;
        }
        article {
            background: white;
            padding: 24px;
            border-radius: 8px;
            margin-bottom: 20px;
            box-shadow: 0 1px 4px rgba(0,0,0,0.1);
        }
        article h2 { margin-bottom: 8px; }
        article time {
            color: #666;
            font-size: 0.9em;
        }
        article .read-more {
            display: inline-block;
            margin-top: 12px;
            color: #e65100;
            font-weight: 600;
            text-decoration: none;
        }
        aside {
            background: white;
            padding: 24px;
            border-radius: 8px;
            box-shadow: 0 1px 4px rgba(0,0,0,0.1);
            align-self: start;
        }
        aside section { margin-bottom: 24px; }
        aside h3 { margin-bottom: 8px; font-size: 1.1em; }
        aside ul { list-style: none; }
        aside li { margin-bottom: 6px; }
        aside a { color: #e65100; text-decoration: none; }
        aside a:hover { text-decoration: underline; }
        footer {
            background: #2d2d2d;
            color: white;
            text-align: center;
            padding: 20px 0;
            margin-top: 40px;
        }
        @media (max-width: 768px) {
            .content-wrapper {
                grid-template-columns: 1fr;
            }
            header .container {
                flex-direction: column;
                gap: 12px;
            }
            nav a { margin: 0 10px; }
        }
    </style>
</head>
<body>
    <header>
        <div class="container">
            <h1>Мой блог</h1>
            <nav>
                <a href="/">Главная</a>
                <a href="/blog">Блог</a>
                <a href="/about">Обо мне</a>
                <a href="/contacts">Контакты</a>
            </nav>
        </div>
    </header>

    <main>
        <div class="container content-wrapper">
            <div class="articles">
                <article>
                    <header>
                        <h2>Как учить HTML и CSS</h2>
                        <time datetime="2026-06-20">20 июня 2026</time>
                    </header>
                    <p>Изучение веб-разработки начинается с основ. HTML — это структура, CSS — стиль. В этой статье я расскажу, с чего начать и на что обратить внимание новичку...</p>
                    <a href="#" class="read-more">Читать далее →</a>
                </article>

                <article>
                    <header>
                        <h2>CSS Grid: полное руководство</h2>
                        <time datetime="2026-06-15">15 июня 2026</time>
                    </header>
                    <p>CSS Grid — это мощная система компоновки, которая позволяет создавать сложные макеты с минимальным количеством кода. Давайте разберёмся с основными концепциями...</p>
                    <a href="#" class="read-more">Читать далее →</a>
                </article>

                <article>
                    <header>
                        <h2>Почему семантическая вёрстка важна</h2>
                        <time datetime="2026-06-10">10 июня 2026</time>
                    </header>
                    <p>Семантические теги появились в HTML5 и полностью изменили подход к вёрстке. Теперь мы не просто верстаем «на глаз», а придаём смысл каждому элементу...</p>
                    <a href="#" class="read-more">Читать далее →</a>
                </article>
            </div>

            <aside>
                <section>
                    <h3>Рубрики</h3>
                    <ul>
                        <li><a href="#">HTML</a></li>
                        <li><a href="#">CSS</a></li>
                        <li><a href="#">JavaScript</a></li>
                        <li><a href="#">Инструменты</a></li>
                    </ul>
                </section>
                <section>
                    <h3>Последние комментарии</h3>
                    <ul>
                        <li>Анна: «Отличная статья!»</li>
                        <li>Пётр: «Спасибо, очень помогло»</li>
                        <li>Мария: «Жду продолжения»</li>
                    </ul>
                </section>
            </aside>
        </div>
    </main>

    <footer>
        <div class="container">
            <p>© 2026 Мой блог. Все права защищены.</p>
        </div>
    </footer>
</body>
</html>

Разбор кода блога

Давайте разберём, какие семантические теги мы использовали:

Тег Где используется Зачем
<header> Шапка сайта + внутри каждой статьи Содержит название сайта / заголовок статьи с датой
<nav> Внутри шапки Навигация по сайту
<main> Основной контент Всё уникальное содержимое страницы
<article> Три блока статей Каждая статья — самостоятельный материал
<aside> Боковая панель Дополнительная информация: рубрики, комментарии
<section> Внутри aside Каждый блок (рубрики, комментарии) — отдельный раздел
<footer> Подвал сайта Копирайт и заключительная информация
<time> Внутри header статей Машиночитаемая дата
💡 Обратите внимание: мы использовали <time> с атрибутом datetime. Это тоже семантический тег — он указывает на дату в формате, понятном машинам. Браузеры и поисковики могут использовать эту информацию для умного отображения дат.

Семантические теги, которые мы не рассмотрели

В HTML5 есть и другие семантические теги. Вот краткий список для самостоятельного изучения:

Тег Описание
<figure> Иллюстрация, диаграмма, фото. Внутри может быть <figcaption> — подпись.
<figcaption> Подпись к <figure>.
<mark> Выделенный текст (как маркером).
<details> Раскрывающийся блок с дополнительной информацией.
<summary> Заголовок для <details>.
<address> Контактная информация (email, телефон, адрес).
<blockquote> Длинная цитата с указанием источника (атрибут cite).
<q> Короткая цитата в тексте.
<abbr> Аббревиатура с атрибутом title для расшифровки.
<figure>
    <img src="diagram.png" alt="Схема семантической вёрстки">
    <figcaption>Рис. 1 — Типовая структура семантической страницы</figcaption>
</figure>

<p>Используйте тег <mark>для выделения</mark> важных фрагментов.</p>

<details>
    <summary>Нажмите, чтобы раскрыть</summary>
    <p>А здесь — скрытый контент!</p>
</details>

<address>
    Наш email: <a href="mailto:info@example.com">info@example.com</a>
</address>

Проверочный чеклист

После того как вы сверстали страницу, пройдитесь по чеклисту. Если всё «да» — вы молодец:

  • На странице ровно один <main>? ☐
  • Шапка обёрнута в <header>? ☐
  • Подвал — в <footer>? ☐
  • Навигация — в <nav>? ☐
  • Статьи — в <article>? ☐
  • Боковая панель — в <aside>? ☐
  • Разделы внутри статей — в <section>? ☐
  • Заголовки идут по порядку: <h1>, затем <h2>, <h3> (не перескакиваем)? ☐
  • У всех изображений есть alt? ☐
  • Страница понятна без CSS? ☐

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

Давайте посмотрим на ошибки, которые часто допускают новички (и не только):

Ошибка 1: <header> только для шапки сайта

Многие думают, что <header> может быть только один — для всей страницы. На самом деле <header> можно (и нужно) использовать внутри <article>, <section>, <aside>.

Ошибка 2: <nav> для всех ссылок

Не нужно оборачивать в <nav> каждую группу ссылок. Например, ссылки в подвале на политику конфиденциальности — это не навигация, а дополнительная информация. Используйте <nav> для основных блоков навигации.

Ошибка 3: <section> без заголовка

Технически <section> может быть без заголовка, но семантически это странно. Раздел без названия — что это за раздел? Всегда старайтесь добавлять заголовок.

Ошибка 4: Использование <br> для отступов

<br> — это перенос строки. Не используйте его для создания отступов между блоками. Для этого есть CSS margin и padding. <br> — для стихов, адресов, строк кода.

Ошибка 5: Игнорирование <h1>

На каждой странице должен быть ровно один <h1> — главный заголовок. Без него поисковики хуже понимают, о чём страница.

💡 Совет: установите расширение для браузера, которое показывает структуру заголовков. Например, «HeadingsMap» для Chrome. Если вы видите, что заголовки прыгают с h1 на h4 без h2 и h3 — это ошибка.

Заключение

Семантическая вёрстка — это не просто модный тренд. Это стандарт качества веб-разработки. Она делает ваш код:

  • Понятным — для других разработчиков
  • Доступным — для людей с ограничениями
  • Оптимизированным — для поисковых систем
  • Готовым к будущему — новые технологии будут опираться на семантику

Начинайте с малого: вместо <div class="header"> пишите <header>. Вместо <div class="nav"> — <nav>. Со временем это войдёт в привычку, и вы будете удивляться, как раньше жили без семантики.

А теперь — задание: возьмите любой свой старый проект, где всё свёрстано дивами, и перепишите его с использованием семантических тегов. Вы увидите, как код станет чище, понятнее и профессиональнее.


Урок 6.1: Семантическая вёрстка

5 вопросов