В формате разметки HTML5 появились новые элементы, которые служат заменой для обычных блочных элементов с атрибутами class и id, например <div class="article">
или
<div id="page">
.
Рассмотрим три элемента, которые легко можно спутать друг с другом:
- div — «базовый контейнер», который мы все знаем и любим. Это обычный блочный элемент без какого-либо семантического значения.
- section — «документ или раздел приложения». Обычно содержит верхний (header) и нижний (footer) колонтитулы. Это несколько схожих по смыслу статей, подраздел одной большой статьи, главная часть страницы (например, раздел новостей) или страница интерфейса с закладками.
- article — «независимая часть документа или сайта». Эта часть должна иметь смысл вне зависимости от остального содержания. Например, это может быть статья в блоге или форуме, комментарий. Так же как и section внутри этого тега могут размещать верхний и нижний колонтитулы.
Разница между div, section и article
В HTML4 div использовался как базовый элемент разметки. Он не имел особого семантического значения. Так же не было особых требований на его содержимое и взаимоотношение между ним внутри блока.
Элемент section
Новый элемент section очень похож на div , т.к. используется как контейнер, но он уже имеет особое семантическое значение — объекты, которые располагаются внутри него, объединены общим смыслом.
Так же этот элемент служит для разбивки текста на разделы.
Элемент article
Новый элемент article — это специальный вид section , который обозначает независимую и самодостаточную часть страницы. На его месте можно использовать section, но article добавляет больше семантического значения.
Что выбрать?
Если проводить аналогию с HTML4, то можно сравнить эти теги с p и blockquote. Оба тега — блочные элементы, но blockquote, как разновидность p, имеет значение «блок цитируемого текста». То же самое и с section и article: тег section обозначает близкий по смыслу текст, а тег article обозначает осмысленную часть этого текста.
Смущающим обстоятельством является то, что section может быть использована для различных частей страницы (главная колонка, раздел новостей и т.п. на одной странице) и содержать article, а так же для дробления большого article (т.е. использоваться внутри article).
Чтобы определиться, какой из элементов выбрать, можно использовать алгоритм:
- Будет ли содержимое иметь осмысленное значение само по себе, например, при публикации в RSS-потоке? Если да, то выбираем article
- Если части содержимого объединены общим значением, то выбираем section
- Наконец, если нет никакого семантического значения, то выбираем div
Элемент section , за редким исключением, не должен использоваться, если у него нет заголовка. Если при автоматическом построении содержания документа будут встречаться не именованные разделы, то, вероятно, разметка сделана не верно. Однако наличие не именованных элементов nav и aside может быть вполне типичным явлением.
Итак, элемент section не стоит использовать если:
- требуется блочный элемент для декорирования. Это функция элемента div
- в этом месте для разметки содержимого больше по смыслу подходят элементы article, aside или nav
- у раздела нет естественного заголовка
Элементы section и article используются аналогично div в HTML4. Они не должны встречаться внутри p, blockquote или address.
Пример использования
<header>
<h1>Название сайта</h1>
<nav>
<ul>
<li><a href="page1.html">Страница 1</a></li>
<li><a href="page2.html">Страница 2</a></li>
<li><a href="page3.html">Страница 3</a></li>
</ul>
</nav>
</header>
<section>
<h2>Свежие статьи</h2>
<article>
<h2>Заголовок статьи 1</h2>
<p>Текст статьи</p>
</article>
<article>
<h2>Заголовок статьи 2</h2>
<p>Текст статьи</p>
<aside>Дополнительная информация, относящаяся к статье 2</aside>
</article>
</section>
<aside>
<section>
<h3>Blogroll</h3>
</section>
<section>
<h3>Реклама</h3>
</section>
</aside>
<footer>
<p>Копирайты</p>
</footer>
По мотивам http://oli.jp/2009/html5-structure1/
Коментарии к заметке
Хорошая, годная статья. Спасибо!
Спасибо, давно хотелось прочесть столь вменяемый и хороший текст по обозначенной теме. Всех благ автору!
Чётко и по делу. Что, когда и где применять. лучше не нашёл, везде инфа или неполная, или неточная. Сайт в закладках полюбому.
Спасибо, интересно и помогло, как раз разбираюсь с семантикой html 5
Больше нечего добавить. Спасибо!
Отличная статья, особенно пример мне очень помог. Спасибо.
Спасибо наконец разобрался что, к чему.
Коротко и ясно :)
Полный бред, не нашел ни единственной причины, чтобы использовать section или article, вместо всеми любимого div’а. Это тоже самое, что утверждать, что для звонка нужно использовать iPhone 6, а не старенький самсунг, хотя в плане совершения звонка самсунг уже всем полюбился и нет нужды его чем то заменять.
Профессионалы применяют эти теги не из-за того, что они модные. Они нужны, чтобы наполнить разметку смыслом для вспомогательных технрологий, поисковиков, роботов и т.п. Вы можете верстать одними div-ами и вообще никакие другие теги кроме него не использовать. И это не шутка.
Я так и не понял про отличие article от section.
Ваш пример:
Но ведь можно вместо section написать article? Реклама это же самодостаточный раздел? он не зависит ни от чего другого… контент может быть один, а реклама вообще на другую тему…
короче бредятина это все с этими элементами, только запутывает больше…
дальше:
Из статьи про section — «…объекты, которые располагаются внутри него, объединены общим смыслом.»
Разве в примере в section объекты объединены общим смыслом?
и где тут общий смысл внутри section не пойму?
Спасибо за вопросы.
<article>
подразумевает, что внутри блока будет много текста. Если у вас блок с рекламой состоит из пары картинок, то это, увы, не тянет на «много текста» и, соответственно, на тег article. И под «много текста» я подразумеваю хотя бы несколько полноценных предложений. При выборе тегов стоит опираться на их содержимое.Вы сами его процитировали: Свежие статьи
Про объединение нескольких статей тегом
<section>
всё очень просто. Статьи выводятся списком. Раз они попали в список, то у этого списка есть заголовок. Он и отражает их общий смысл. Если к блокуsection
вы не можете придумать заголовок, то это используйтеdiv
.В вашем примере статьи связывает только то, что они были недавно опубликованы. Если вы посмотрите на список статей в какой-либо категории, то их общий смысл станет более очевидным.
Добрый день! А можно размещать рекламу adsence и виджет комментариев вконтакте между элементами article и main, в которых находится сама статья? Если да, то надо их еще окружать элементом aside или section?
Любая реклама и виджеты сторонних сайтов вставляются через JS. На момент загрузки документа их не существует. Поэтому никакая дополнительная разметка им не нужна — используй обычные
<div>
.Добрый день, Владимир! Если я создам два сайта абсолютно идентичных, но в 1 случае — буду использовать только div, а во 2 — div, section, article, то браузеры будут охотнее и быстрее продвигать последний вариант? Влияет ли это на продвижение сайта?
Александр, догадываюсь, что вы имели в виду поисковые системы, а не браузеры. Если не ошибаюсь, то они пока никак не распознают эти теги. Другими словами, они для краулера одинаковые.
все очень дохожчиво.. особенно аналогия с
p
иblockquote
. толькоp
иblockquote
разве блочные элементы, я знал их как строчныеСпасибо.
p
иblockquote
всегда были блочными элементами.Вопрос про разметку в комментариях к статье. У вордпресса в wp-includes/class-walker-comment.php
Есть комменты для сайтов с разметкой HTML5. Почему у вас не размечены комментарии тегом артикл? Это я к тому, что в вордпресс толковые реята и может они правы насчет этой размтеки?
Вот кстати пример от мозилы по поводу комментов:
https://developer.mozilla.org/ru/docs/Web/HTML/Element/article
Хороший пример. В нём проиллюстрирована вложенная структура.
<article>
обрамляет отдельный комментарий, а<section>
— группу. Я считаю, что так и надо делать.Константин, отвечая на ваш предыдущий комментарий, могу только сказать, что мне было лень полировать эту часть страницы. Спасибо, что указали на недоработку. Обязательно обновлю вёрстку в ближайшее время.
Благодарю за ответ. У меня еще вопрос по вашей разметке. После проверки в валидаторе в вашем Head выает такое:
У меня вопрос очередной. Чем грозят подобные ошибки при ранжировании сайта? Мне нравится ваше решение по поводу микроразметки сайта. И я взял ее для себя на вооружение. Потому и копаюсь в вашем коде))
Константин, смотрите, валидатор HTML-разметки знает стандарты, которым должен соответствовать документ. Но он понятия не имеет о разметках типа microdata, RDFa, Open Graph, Twitter Cards и многих других. У него нет задачи валидировать их. Соответственно он будет показывать ошибки и предупреждения на данные, о которых он не знает. Понимаете?
Если вас интересует как какая-то поисковая система или социальная сеть воспринимает контент страницы, то пользуйтесь инструментами валидации, которые предоставляют эти платформы.
Это снова я) Вы скрыли h1. Для чего? Он не лезет в общую концепцию дизайна? Заранее благодарен за ответ
Константин, этот элемент нужен, чтобы сформировать правильную структуру документа . Но в дизайне мне этот дублирующий заголовок не нужен, поэтому я и скрыл его. Чтобы не плодить дубликатов, нужно убрать
<article>
на странице статьи. Вся страница — это и есть статья.Просто, чем больше я разбираю ваш html код, тем больше открываю для себя новостей и все больше появляются вопросы. Хотелось бы почитать статью от вас про код вашего сайта и узнать — почему вы выбрали в коде то или иное решение.
С тем же h1. Во всех руководствах по СЕО, категорически заявляют о важности не скрывать контент и уж тем более в таком теге. Вы же сделали все наоборот и скрыли его пометив классом visuallyhidden при этом не получив карательных санкций от поисковиков.
Почему вы не вы используете теги nav и main. Ведь если использовать их в вашей разметке, то теряется правильная структура заголовков (если анализировать с помощью html5 outliner). Этого нигде не прочитать в русском интернете.
Да, понимаю, что мои эксперименты выглядят бредово. Область SEO окружена мистикой и суевериями. Люди просто делают то, что пишут другие люди, не вдаваясь в суть (типа, наши деды так делали, отцы так делали и мы будем так делать), и тем самым излишне ограничивают себя. Я не стесняюсь почитать спецификации, подумать над ними и соединить разные требования, избежав противоречий. В большинстве случаев так упарываться не нужно.
Если вы про экспериментsы с тегами nav и main, то это отнюдь не бредово. Я как раз вчера был озадачен ответом Untitled Section на проверку разметки заголовков в html5 outliner. Выяснил, что проблема в том, что он требует заголовки в nav и body. У вас же эта проблема решена очень элегантно).
У меня очередной вопрос. Хочу внутри статьи использовать блок с содержанием (список оглавлений в статье):
Правильно ли поймет меня робот от гугла или яндекса?
Спасибо.
Разметка во фрагменте вполне адекватная. С другой стороны, ни Гугл, ни Яндекс не интересуют эти данные. Они для них равносильны обычному тексту.
Главная суть всех разметок — это донести какую-то информацию потребителю.
Можно сверстать всё на
<div>
, а кнопки и ссылки реализовать на JS. Но так как браузер уже знает как работать с<a>
и<button>
, то нет смыла не использовать.Потом есть вспомогательные технологии (например, скринридеры или клавиатурная навигация), которые дают возможность перемещаться между заголовками или регионами страницы. Для них мы должны использовать соответствующие теги (
<h1>
—<h6>
для заголовков, например) и атрибутыrole
. Для вспомогательных технологий были стандартизированы атрибуты, начинающиеся со словаaria
, которые добавляют смыл в разметку гораздо больше, чем просто теги.Появились агрегаторы контента, которые хотели извлекать со страницы данные, а авторы этих страниц были не против делиться этим контентом. Так появились языки микро-разметки. Поисковики удачно запрыгнули на этот поезд предоставляя привлекательную карточку в выдаче в обмен на данные. Конечно они собирают всю доступную микро-разметку, но сейчас на приктике используют только ограниченное количество типов (хлебные крошки, рецепты, цены, адреса и т.п.).
В общем, моя мысль о том, что разметка, микро-разметка, aria-атрибуты и т.п. применяются с учётом того, как она будет использоваться в реальной жизни. Без сомнений, процесс предоставления и потребления контента не может работать только в одну сторону. Как классические «спрос» и «предложение» не могут друг без друга. Если кто-то заинтересован в
ItemList
, то почему бы ему его не предоставить. С другой стороны, размечать всё и вся какими-то типами может быть чертовски накладно.Благодарю за столь развернутый ответ. Насчёт реализации списка оглавлений на джаве — уже думал об этом — это было бы лучшим вариантом.
Я читал кажется в вашем твиттере, что вы обожаете джаву и вам покажется реализация на этом языке лёгкой задачей, но на у меня весьма поверхностные знания в программировании. Я просто пилю сайт для себя и своих пациентов.
Насчёт атрибута aria и role. Т.е. по-вашему эти маркеры более понятны роботам, чем та же разметка от счема.орг?
Кстати, а вам не приходило написать статью на более высококонкурентную фразу? К примеру «программирование на java»? Интересна выдача в Гугле)
Константин, атрибуты
aria-*
иrole
нужны для вспомогательных технологий, а не для поисковиков. В предыдущем комментарии я хотел показать, что любые дополнительные «разметки» нужно применять с чётким пониманием кому она будет полезна. Если вы не знаете в чём её польза, то и добавлять не нужно. В общем, слоган «чем проще, тем лучше» тут действует безотказно.Вы имеете в виду JavaScript? Нет, у меня никогда не было такой цели.