Кратко
СкопированоОдна из важных особенностей HTML — семантика, которая буквально переводится как «обозначающий». При помощи HTML мы описываем структуру страниц и их содержимого, то есть объясняем браузерам, вспомогательным и другим технологиям и программам значение элементов. Это может быть параграф текста, кнопка, часть страницы с основным содержимым или ничего не значащий контейнер.
На практике семантика HTML-элементов передаётся через их роли, а ещё состояния и свойства. Роли описывают основной смысл элемента, а состояния и свойства добавляют больше деталей: выбран или не выбран чекбокс, активно или неактивно поле в форме и так далее.
Каждый раз, когда пишите HTML-код, вы имеете дело с семантикой. Даже если используете только <div> и <span> 🤯
Некоторые элементы и атрибуты
СкопированоВсе HTML-теги, которых больше 100, семантические. Для простоты разделим их на две группы — секционные и контентные. Полный список элементов найдёте в HTML Living Standard.
Секционные теги делят HTML-документ (страницу) на большие логические блоки или секции:
<article>— самостоятельный блок с содержимым вроде превью поста в блоге, карточки товара или рекламного баннера. Такой контент не потеряет смысл, если его перенести на другую страницу или сайт.<nav>— основная или дополнительная навигация со ссылками на другие страницы или отдельные разделы.<section>— блок, который объединяет содержимое по смыслу.<main>— основное содержимое страницы.<header>— вводное содержимое или навигация. Не привязан к конкретному месту страницы и отдельной секции, но традиционно используется для создания основной навигации по сайту — шапки (хедера). Также можно использовать для оборачивания оглавления раздела, заголовка статьи с вводной информацией о ней и прочего.<footer>— дополнительная информация о сайте или части одной страницы. Тоже не привязан к части страницы или отдельной секции. Например, подвал (футер) может быть у превью поста и содержать информацию о дате публикации и авторе.
Посмотрим на пример с карточкой. Поисковый робот просканирует код и сделает вывод, что на странице несколько независимых от контекста блоков <article> с параграфами текста. У карточек есть вводное содержимое <header> с заголовком <h2> и неважным текстом <span>. Также дополнительная информация о содержимом в <footer> — дата без времени <time>.
<article> <header> <h2>SEO для начинающих</h2> <span class="author">Иван Иванович</span> </header> <p> Благодаря этому курсу вы научитесь задавливать конкурентов с помощью ссылочной массы, а не качественного контента. </p> <footer> <time datetime="2023-02-13"> 13 февраля 2023 </time> </footer></article>
<article>
<header>
<h2>SEO для начинающих</h2>
<span class="author">Иван Иванович</span>
</header>
<p>
Благодаря этому курсу вы научитесь задавливать конкурентов
с помощью ссылочной массы, а не качественного контента.
</p>
<footer>
<time datetime="2023-02-13">
13 февраля 2023
</time>
</footer>
</article>
Контентные теги описывают смысл частичек и типов содержимого — контента. Перечислим несколько тегов, на самом деле их гораздо больше:
<h1>-<h6>для определения заголовков на странице.<h1>используют для основного заголовка документа или раздела. Остальные нужны для подзаголовков. Все заголовки описывают структуру и иерархию страниц.<button>для кнопок. Используют для отправки форм и выполнения других команд.<img>для картинок.<table>для таблиц. Состоят из нескольких элементов для структурирования табличных данных: строк<tr>, заголовочных ячеек<th>и ячеек с данными<td>.<ul>неупорядоченный маркированный список.<a>для ссылок, с помощью которых пользователи переходят от одной страницы к другой.<p>для абзацев текста. Это основные блоки текста в HTML; логически разграничивают части текста с общей мыслью или идеей.
И снова пример. Когда скринридеры столкнутся с таким HTML, они узнают о декоративной графике <img alt, параграфе текста <p> и ссылке <a>.
<img src="seo-basics.png" alt=""><p> <a url="/seo-basics">Базовый курс по SEO</a> научит задавливать конкурентов с помощью ссылочной массы, а не качественного контента.</p>
<img src="seo-basics.png" alt="">
<p>
<a url="/seo-basics">Базовый курс по SEO</a> научит задавливать конкурентов
с помощью ссылочной массы, а не качественного контента.
</p>
HTML-атрибуты раскрывают дополнительный смысл содержимого страниц. Например, глобальный атрибут title означает, что это дополнительные сведения о тексте или элементе. lang сообщает о языке слова, фразы или ссылки, а dir описывает направление письма.
Конечно, не все теги подробно описывают типы содержимого. К примеру, <section> только намекает, что это что-то объединённое по смыслу. <article> уже больше рассказывает о содержимом: оно тесно связано, сгруппировано в одном месте и не зависит от другого на странице.
<div> и <span> тоже существуют не зря, хотя их часто называют несемантическими. Это не совсем так. Оба тега играют роль универсальных контейнеров с ролью generic. То есть они говорят браузерам или скринридерам, что их смысл не важен и на них можно не обращать внимание.
С семантическими тегами вы тоже, скорее всего, знакомы. Это глобальные атрибуты title для дополнительной информации об элементе, lang для языка текстового содержимого, translate для перевода с одного языка на другой и dir для направления письма.
Зачем нужна семантика
СкопированоКто-то может подумать, что раз даже <div> и <span> семантические, расставлять теги кнопок, ссылок и списков долго и бессмысленно. Всё прямо наоборот: у вёрстки, которая подробно описывает содержимое страниц, больше преимуществ, чем у «дивной».
Поддержка и читаемость кода
СкопированоИсходный код проекта с вниманием к семантике легче поддерживать. В нём проще ориентироваться, а любой член команды сразу видит логику отдельных элементов и общую структуру интерфейса. Польза семантики особенно заметна, когда проект постоянно развивается и обзаводится новыми компонентами. В такой код проще и быстрее вносить изменения.
Качественная вёрстка экономит время разработчиков и уменьшает количество строчек кода. Например, у <button> и <input> уже есть стили по умолчанию и встроены обработчики событий: их не нужно писать руками. Чтобы воспроизвести нативное поведение кнопки, нужно слушать события keydown при нажатии на Enter и keyup для пробела и Enter. Размеры файлов со стилями и скриптами напрямую влияют на производительность сайта (perfomance). Чем больше вес файлов, тем дольше грузится страница. Подробнее о производительности позже.
Отдельная статья расходов времени при переписывании кода (рефакторинге) — внедрение доступности. Плохой код приводит ко многим проблемам с доступностью. Если команда не подумала о семантической разметке с самого начала, время на внедрение доступности в проект увеличивается в несколько раз.
UX, юзабилити и доступность
СкопированоСемантика — основа хорошего пользовательского опыта или UX (user experience). Хороший UX складывается из лёгкого и успешного взаимодействия с интерфейсами (юзабилити), полезного содержимого, доступности для пользователей с инвалидностью и общей удовлетворённости от всего процесса.
Поговорим подробнее про пользу семантики для доступности. Зрячим пользователям обычно легче ориентироваться на сайте, чем тем, кто его не видит. Люди со слепотой и слабовидящие используют скринридеры, экранные лупы и другие вспомогательные технологии для взаимодействия со страницами.
Логичная HTML-разметка улучшает опыт пользователей вспомогательных технологий и устраняет барьеры, из-за которых невозможно пользоваться сайтом. К примеру, скринридер расскажет пользователям, что <button> — это кнопка. Пользователи голосового управления могут кликнуть по элементу <button> с помощью команды «кнопка, клик». У чекбоксов есть состояния checked и unchecked. Благодаря им люди могут услышать, какой чекбокс выбран, а какой нет. В <h1>−<h6> встроено свойство для уровня заголовка — level. Скринридеры зачитывают уровень заголовка вместе с ролью: заголовок первого уровня или заголовок четвёртого уровня. Так структуру страницы смогут представить те, кто слушает интерфейсы.
Другой плюс продуманной HTML-разметки — навигация для скринридеров. Теги вроде <header> и <footer> — ориентиры. Это значит, что пользователи могут перемещаться по отдельным блокам страницы с помощью горячих клавиш.
Пользователи скринридеров перемещаются и по заголовкам. Это распространённый метод поиска информации по странице.
Другая неочевидная польза семантики — вам не придётся стилизовать сайт отдельно под режим принудительных цветов, например, режим высокой контрастности в Windows. В его случае количество цветов ограничивается до небольшой палитры. Если кнопка свёрстана на <div>, система не заменит цвет элемента на системный.
Браузеры, расширения и другие технологии
СкопированоСемантика приносит пользу и самим браузерам. К примеру, во все браузеры встроен режим чтения (reading mode). В нём со страницы удаляются все лишние элементы и остаётся самое важное: заголовки, текст, картинки и видео. Если страница, например, свёрстана без <h1>, <h2> и заголовков других уровней, пользователи получат большой кусок неструктурированного текста. Такие же проблемы будут и у сервисов для RSS (really simple syndication) и отложенного чтения и закладок вроде Pocket.
Часть пользователей устанавливает разные браузерные расширения. К примеру, чтобы изменять стили страниц, текста или бионического чтения. Расширения полагаются на разметку, как и браузеры в целом.
Умные часы и голосовые помощники тоже не остались в стороне от HTML-семантики. В часы от Apple и Samsung встроены браузеры, доступ к которым получаете через голосовые команды для Siri, Bixby или Google Assistant. Голосовые помощники выполнят команды быстрее и точнее, если для ссылок используете <a> или <time> для дат.
Поисковая оптимизация
СкопированоПоисковики стерпят всё и поймут вас в любом случае, даже если общаетесь с ними на языке дивов. Однако семантика упрощает им работу и позитивно влияет на поисковую оптимизацию сайтов — SEO (search engine optimization), а именно:
- улучшает точность индексации страниц;
- повышает показатели производительности сайта;
- увеличивает органический трафик и количество кликов;
- гарантирует
спокойную старостьспокойное будущее.
Более точная индексация. Семантика дополняет другие факторы ранжирования и раскрывает больше информации о структуре сайта, темах страниц и связях между разными видами контента. Поисковые роботы точнее определяют главную тему страницы по заголовку <h1> и атрибуту title. Ряд семантических тегов наводит мосты между типами контента. Например, между видео <video> и скрытыми субтитрами в <track>.
Лучшая производительность. Производительность — ещё один ключевой фактор ранжирования. Браузеры лучше работают с чистым и хорошо организованным кодом. Семантическая разметка как раз избавляет от лишнего JavaScript и CSS, а это ускоряет загрузку страниц.
Рост органического трафика. Органический трафик (organic traffic) — это количество пользователей, которые перешли на сайт из поисковой выдачи, а не по рекламным ссылкам и баннерам.
Один из источников такого трафика — сниппеты на первой странице выдачи поисковика. К примеру, в Google под название страницы попадают заголовки второго уровня <h2> и ссылки из основной навигации <nav>. Ещё больше смысла добавляет простое и ёмкое описание из атрибута description. Пользователи больше доверяют сайтам, которые прозрачны и заранее предупреждают, чего от них ждать.
Вклад в будущие поисковые алгоритмы. Всё течёт, всё меняется, и SEO тоже. Компании разрабатывают новые алгоритмы поиска, основанные на искусственном интеллекте. Например, Microsoft уже запустила поумневший движок Bing. Google работает над новым движком «Проект "Маги"» 🧙♂️
В будущем ключевыми факторами ранжирования могут стать качественные клики (qualified clicks), качество и актуальность контента, и UX в целом. UX подразумевает юзабилити и доступность, а они в хороших отношениях с семантикой. Так что хорошая вёрстка может оказаться важнее микроразметки и производительности.
Как разметить страницу
СкопированоПервый шаг. Смотрим на крупные логические блоки страницы и выбираем подходящие теги. Например, <header>, <footer>, <main>, <nav> или <aside>.
Можете использовать такое правило при выборе тега. Если задаёте дивам классы вроде header, sidebar, content, post и footer, подумайте, не подходят ли больше элементы <header>, <aside>, <main>, <article> и <footer>. Из любого правила есть исключение: контекст интерфейса и содержимого важнее.

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

Приблизим карточку с превью поста. В блоке <article> размещаются картинка, параграф текста <p> и хедер с заголовком и другой информацией о посте.

Второй шаг. Смотрим на содержимое всей страницы и отдельных, более мелких блоков на ней. Расставляем заголовки <h1>-<h6>. Хороший тон использовать один <h1>. После в правильном порядке располагаем заголовки других уровней.
Представим, что на странице есть заголовок первого уровня и несколько подзаголовков второго и третьего уровней. После <h1> идёт <h2>, после — пара <h3>, которые находятся в том же блоке. Следующая секция опять начинается с <h2>.
<main> <section> <h1></h1> <p></p> </section> <section> <h2></h2> <p></p> <h3></h3> <p></p> <h3></h3> <p></p> </section> <section> <h2></h2> <p></p> </section></main>
<main>
<section>
<h1></h1>
<p></p>
</section>
<section>
<h2></h2>
<p></p>
<h3></h3>
<p></p>
<h3></h3>
<p></p>
</section>
<section>
<h2></h2>
<p></p>
</section>
</main>
Третий шаг. Переходим к небольшим смысловым блокам. Это списки, таблицы, примеры кода, цитаты и похожие элементы.
Четвёртый шаг. Разбираемся с самыми мелкими частями содержимого: параграфами, кнопками, ссылками, временем, изображениями, видео и т. д.
Примеры
СкопированоВёрстка с <div> и <span>
СкопированоСверстаем страницу вымышленного сайта про SEO двумя способами: дивно и хорошо.
В дивном примере используем минимальное количество тегов.
Заглянем в HTML-код из демо:
<div class="container"> <div class="header"> <div class="nav"> <a href="#" class="nav__item">Главная</a> <a href="#" class="nav__item">Блог</a> <a href="#" class="nav__item">Контакты</a> </div> </div> <div class="main"> <span class="heading">Курсы компании «Гарцующий пони»</span> <div class="wrapper"> <div class="card"> <div class="card__header"> <span class="card__heading">SEO для начинающих</span> <span class="card__author">Иван Иванович</span> </div> <div class="card__content"> <img src="./images/seo-course.png" alt="" class="card__img" decoding="async" > <span class="card__description"> Благодаря этому курсу вы научитесь задавливать конкурентов с помощью ссылочной массы, а не качественного контента. </span> </div> <div class="card__footer"> <span>13 февраля 2023</span> </div> </div> <div class="card"> <div class="card__header"> <span class="card__heading"> WordPress разработка </span> <span class="card__author">Ольга Ольгина</span> </div> <div class="card__content"> <img src="./images/wordpress-course.png" alt="" class="card__img" decoding="async" > <span class="card__description"> WordPress — топ за свои деньги. Изучите его, чтобы стать востребованным фрилансером. </span> </div> <div class="card__footer"> <span>23 октября 2023</span> </div> </div> <div class="card"> <div class="card__header"> <span class="card__heading">JavaScript для чайников</span> <p class="card__author">М. Михайловских</p> </div> <div class="card__content"> <img src="./images/javascript-course.png" alt="" class="card__img" decoding="async" > <span class="card__description"> Курс подойдёт для любых чайников: электрических, газовых и даже для кастрюлек, временно подменяющих сломанный чайник. </span> </div> <div class="card__footer"> <span>30 ноября 2023</span> </div> </div> </div> </div> <div class="footer"> <span class="copyright"> 2023. Разработано компанией <a class="copyright__link" href="#">«Гарцующий пони»</a> </span> </div></div>
<div class="container">
<div class="header">
<div class="nav">
<a href="#" class="nav__item">Главная</a>
<a href="#" class="nav__item">Блог</a>
<a href="#" class="nav__item">Контакты</a>
</div>
</div>
<div class="main">
<span class="heading">Курсы компании «Гарцующий пони»</span>
<div class="wrapper">
<div class="card">
<div class="card__header">
<span class="card__heading">SEO для начинающих</span>
<span class="card__author">Иван Иванович</span>
</div>
<div class="card__content">
<img
src="./images/seo-course.png"
alt=""
class="card__img"
decoding="async"
>
<span class="card__description">
Благодаря этому курсу вы научитесь задавливать конкурентов
с помощью ссылочной массы, а не качественного контента.
</span>
</div>
<div class="card__footer">
<span>13 февраля 2023</span>
</div>
</div>
<div class="card">
<div class="card__header">
<span class="card__heading">
WordPress разработка
</span>
<span class="card__author">Ольга Ольгина</span>
</div>
<div class="card__content">
<img
src="./images/wordpress-course.png"
alt=""
class="card__img"
decoding="async"
>
<span class="card__description">
WordPress — топ за свои деньги. Изучите его, чтобы стать
востребованным фрилансером.
</span>
</div>
<div class="card__footer">
<span>23 октября 2023</span>
</div>
</div>
<div class="card">
<div class="card__header">
<span class="card__heading">JavaScript для чайников</span>
<p class="card__author">М. Михайловских</p>
</div>
<div class="card__content">
<img
src="./images/javascript-course.png"
alt=""
class="card__img"
decoding="async"
>
<span class="card__description">
Курс подойдёт для любых чайников: электрических, газовых
и даже для кастрюлек, временно подменяющих сломанный чайник.
</span>
</div>
<div class="card__footer">
<span>30 ноября 2023</span>
</div>
</div>
</div>
</div>
<div class="footer">
<span class="copyright">
2023. Разработано компанией
<a class="copyright__link" href="#">«Гарцующий пони»</a>
</span>
</div>
</div>
В предыдущем примере героически избегали всего спектра HTML-элементов и рассчитывали только на <div> и <span>. Заменим ничего не значащие <div> и <span> на подходящие элементы. Хедер, футер, ссылки, заголовки — всё обрело больше смысла.
Посмотрим на улучшенный код:
<header class="header"> <nav class="nav"> <a href="#" class="nav__item">Главная</a> <a href="#" class="nav__item">Блог</a> <a href="#" class="nav__item">Контакты</a> </nav></header><main class="main"> <h1 class="heading">Курсы компании «Гарцующий пони»</h1> <div class="wrapper"> <article class="card"> <header class="card__header"> <h2 class="card__heading">SEO для начинающих</h2> <p class="card__author">Иван Иванович</p> </header> <div class="card__content"> <img src="./images/seo-course.png" alt="" class="card__img" decoding="async" > <p class="card__description"> Благодаря этому курсу вы научитесь задавливать конкурентов с помощью ссылочной массы, а не качественного контента. </p> </div> <footer class="card__footer"> <time class="card__date" datetime="2023-02-13" > 13 февраля 2023 </time> </footer> </article> <article class="card"> <header class="card__header"> <h2 class="card__heading">WordPress разработка</h2> <p class="card__author">Ольга Ольгина</p> </header> <div class="card__content"> <img src="./images/wordpress-course.png" alt="" class="card__img" decoding="async" > <p class="card__description"> WordPress — топ за свои деньги. Изучите его, чтобы стать востребованным фрилансером. </p> </div> <footer class="card__footer"> <time class="card__date" datetime="2023-10-23" > 23 октября 2023 </time> </footer> </article> <article class="card"> <header class="card__header"> <h2 class="card__heading">JavaScript для чайников</h2> <p class="card__author">М. Михайловских</p> </header> <div class="card__content"> <img src="./images/javascript-course.png" alt="" class="card__img" decoding="async" > <p class="card__description"> Курс подойдёт для любых чайников: электрических, газовых и даже для кастрюлек, временно подменяющих сломанный чайник. </p> </div> <footer class="card__footer"> <time class="card__date" datetime="2023-11-30" > 30 ноября 2023 </time> </footer> </article> </div></main><footer class="footer"> <p class="copyright"> 2023. Разработано компанией <a class="copyright__link"href="#">«Гарцующий пони»</a> </p></footer>
<header class="header">
<nav class="nav">
<a href="#" class="nav__item">Главная</a>
<a href="#" class="nav__item">Блог</a>
<a href="#" class="nav__item">Контакты</a>
</nav>
</header>
<main class="main">
<h1 class="heading">Курсы компании «Гарцующий пони»</h1>
<div class="wrapper">
<article class="card">
<header class="card__header">
<h2 class="card__heading">SEO для начинающих</h2>
<p class="card__author">Иван Иванович</p>
</header>
<div class="card__content">
<img
src="./images/seo-course.png"
alt=""
class="card__img"
decoding="async"
>
<p class="card__description">
Благодаря этому курсу вы научитесь задавливать конкурентов
с помощью ссылочной массы, а не качественного контента.
</p>
</div>
<footer class="card__footer">
<time
class="card__date"
datetime="2023-02-13"
>
13 февраля 2023
</time>
</footer>
</article>
<article class="card">
<header class="card__header">
<h2 class="card__heading">WordPress разработка</h2>
<p class="card__author">Ольга Ольгина</p>
</header>
<div class="card__content">
<img
src="./images/wordpress-course.png"
alt=""
class="card__img"
decoding="async"
>
<p class="card__description">
WordPress — топ за свои деньги. Изучите его,
чтобы стать востребованным фрилансером.
</p>
</div>
<footer class="card__footer">
<time
class="card__date"
datetime="2023-10-23"
>
23 октября 2023
</time>
</footer>
</article>
<article class="card">
<header class="card__header">
<h2 class="card__heading">JavaScript для чайников</h2>
<p class="card__author">М. Михайловских</p>
</header>
<div class="card__content">
<img
src="./images/javascript-course.png"
alt=""
class="card__img"
decoding="async"
>
<p class="card__description">
Курс подойдёт для любых чайников: электрических, газовых
и даже для кастрюлек, временно подменяющих сломанный чайник.
</p>
</div>
<footer class="card__footer">
<time
class="card__date"
datetime="2023-11-30"
>
30 ноября 2023
</time>
</footer>
</article>
</div>
</main>
<footer class="footer">
<p class="copyright">
2023. Разработано компанией
<a class="copyright__link"href="#">«Гарцующий пони»</a>
</p>
</footer>