Тег div в HTML: что это, для чего нужен и как использовать

Тег div (от английского division, «раздел») - универсальный блочный контейнер. Он собирает несколько элементов в один блок, чтобы к блоку можно было применить стиль, положение или скрипт. Сам по себе div ничего не значит и без стилей невидим: у него нет ни фона, ни рамки, ни отступов. Тег парный, закрывающий обязателен.

Проще всего div использовать, и потому его чаще всего берут не там, где надо. Если внутри собираются самостоятельная статья, раздел страницы или боковой блок, у них есть свои теги: article, section и aside. Если это обычный текст, нужен p, а часть строки оборачивают в span. Контейнер без смысла оставляют для случаев, когда подходящего тега нет.

HTML
<div class="card">
  <p>Текст карточки</p>
</div>

Тег div в HTML: что это и для чего нужен

Спецификация HTML описывает div как элемент без собственного смысла: он представляет своё содержимое и ничего к нему не добавляет. Внутри допустим блочный и строчный контент, а в dl тег служит обёрткой для пары dt и dd. Стандарт предлагает считать div элементом последней инстанции, когда подходящего тега нет.

Для чего нужен div. Первое - собрать элементы в блок для оформления: карточку, панель, колонку. Второе - выстроить макет: flex и grid в CSS применяют к контейнеру. Третье - найти блок из скрипта по class или id. Четвёртое - задать язык или направление сразу для группы абзацев через lang и dir.

Слова «без смысла» значат, что браузер не считает содержимое разделом, статьёй, навигацией или подвалом. Поэтому на вопрос «какие теги не имеют смысла согласно стандарту: div, article, section, span» верный ответ - div и span. Что делать, если смысл нужен, написано в разделе про семантические теги.

Как использовать тег div: class, id, style и другие атрибуты

Собственных атрибутов у div нет, только глобальные. Чаще всего нужны пять.

АтрибутЧто делаетПример
classОбщий стиль или зацепка для многих блоков<div class="card">
idУникальная метка для якоря или скрипта<div id="offer">
styleСтиль прямо в теге, для разового случая<div style="width: 200px">
langЯзык сразу для группы абзацев<div lang="en">
data-*Данные для скрипта<div data-id="42">
HTML
<div class="card" id="offer">
  <p>Текст карточки</p>
</div>

<div lang="en">
  <p>First paragraph.</p>
  <p>Second paragraph.</p>
</div>

Закрывающий тег обязателен: каждый открытый div нужно закрыть, иначе следующие блоки окажутся внутри незакрытого. Браузер закроет его сам в конце родителя: в замере <div>a<div>b</div> превратилось в <div>a<div>b</div></div>, но о месте ошибки не сообщит.

Атрибут align у div устарел и в HTML5 не допускается. Chrome его ещё понимает, но превращает в выравнивание текста: <div align="center"> центрирует текст внутри блока, а сам блок остаётся на всю ширину родителя. Для выравнивания блока используют CSS, способы разобраны в разделе про центрирование.

Тег div блочный: ширина, высота, отступы и display

По умолчанию div - блочный элемент (display: block): он начинается с новой строки, растягивается на всю ширину родителя, а высоту берёт по содержимому. В замере div в родителе шириной 300 px получил ширину 300 px и высоту 30 px, то есть одну строку текста.

СвойствоЧто происходит у div
ШиринаКак у родителя; заданная width действует
ВысотаПо содержимому; заданная height действует
Пустой divВысота 0, фон не виден
Вертикальные отступы соседейСхлопываются: между отступами по 20 px получилось 20 px, а не 40
Размер с padding и рамкойПри content-box ширина 100 px, padding 20 px и рамка 10 px дают 130 px; при border-box остаётся 100 px

Пустой div без высоты не виден, даже если у него задан фон. Чтобы его увидеть, задают height или записывают в него содержимое. Строчным блок делает display: inline, но тогда width и height перестают действовать, и div ведёт себя как span. Проверьте режимы в кадре.

CSS
.box {
  width: 120px;
  height: 60px;
  box-sizing: border-box;
}

Пример: как ведёт себя div-блок

Результат

Выберите вариант. Кадр измеряет ширину и высоту div и расстояние между блоками.

Тег div внутри div, a, p и других тегов: что допустимо

Внутри div допустим блочный и строчный контент, в том числе другие div. Вложенные div - обычное дело: в замере три вложенных div остались без изменений. Но лишние обёртки ничего не дают и усложняют разметку.

div внутри p не допускается: абзац может содержать только строчный контент. Парсер закрывает абзац раньше: <p>a<div>b</div>c</p> превращается в <p>a</p><div>b</div>c<p></p>. Обратная запись, p внутри div, допустима.

div внутри a в HTML5 допустим: ссылка может оборачивать целый блок, например карточку. Между table и tr div записывать нельзя: в замере <table><div>x</div></table> браузер вынес div перед таблицей. Внутри ul, button и h1 стандарт div не допускает, но парсер оставляет запись как есть, поэтому ошибку видит только валидатор. В dl div допустим как обёртка для пары dt и dd.

Пример: как браузер разберёт вложенные теги

Результат

Выберите запись. Кадр показывает вашу разметку, разметку после разбора браузером и оценку по стандарту.

Тег div, p и span: чем отличаются

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

Признакdivpspan
СмыслНетАбзац текстаНет
ТипБлочныйБлочныйСтрочный
Отступы по умолчаниюНетЕсть вертикальныеНет
Что можно вложитьБлочный и строчный контентТолько строчный контентТолько строчный контент
Для чегоСобрать блок из нескольких элементовАбзац текстаВыделить фрагмент внутри строки

Выбор такой: текст абзацем - p, блок из нескольких элементов - div, часть строки - span. Подробнее об отличии от span написано на странице про span, а об абзаце - на странице про p.

Тег div и семантические теги: header, nav, main, footer и когда div нужен

Раньше страницы собирали из div с классами header, menu, footer. В HTML5 для этого появились теги со смыслом. Их называют семантическими: браузер, поисковая система и вспомогательные технологии по ним понимают устройство страницы.

Блок страницыКакой тег вместо div
Шапка сайтаheader
Менюnav
Основное содержимоеmain
Самостоятельная статьяarticle
Тематический разделsection
Боковая колонкаaside
Подвал сайтаfooter

Заголовок тоже отмечают не div, а тегами h1 - h6. Блок с крупным шрифтом выглядит как заголовок, но для программ остаётся обычным блоком: так на вопрос, какой тег отвечает за заголовок для поисковой системы, ответ - h1, а не div.

Записывайте div там, где смысла нет: обёртка для стилей, колонка в сетке, карточка в списке, контейнер для скрипта. Проверьте в кадре, как меняется число блоков, которые понимает браузер.

Пример: div или тег со смыслом

Результат

Нажимайте на блоки. Кадр показывает разметку и число блоков, назначение которых понимает браузер.

Тег div в CSS: цвет, фон, рамка, отступы и центрирование

Внешний вид блока задают правила CSS: color для текста, background для фона, border для рамки, padding для внутренних отступов, margin для внешних, width и height для размеров. Правило лучше записывать для класса, а не для всех div страницы.

CSS
.card {
  color: #1F2430;
  background: #fff2c9;
  border: 1px solid #b8b0a0;
  padding: 12px;
  width: 240px;
}

Центрирование - частый вопрос, и ответ зависит от того, что центрировать. Блок по горизонтали центрирует margin: 0 auto при заданной ширине. Свойство text-align: center у родителя блок не сдвигает: оно центрирует текст и строчные элементы. Устаревший align действует как text-align. Для блока в центре родителя подходит flex: display: flex и justify-content: center.

CSS
.center {
  width: 200px;
  margin: 0 auto;
}

Пример: способы центрирования div

Результат

Выберите способ. Кадр измеряет, оказался ли по центру родителя блок и текст внутри него.

Тег div вместо кнопки и ссылки: почему не стоит, и добавление div скриптом

Клик по div можно обработать скриптом, но это не превращает его в кнопку или ссылку. В замере div с обработчиком click сработал от мыши, но у него tabIndex равен -1: метод focus() фокус не дал, курсор остался обычным, а клавиша Tab пропустила его и перешла к настоящей кнопке. Читатель, который не пользуется мышью, до такого div не доберётся.

Поэтому для действия берут button, а для перехода - a с href. Если нужна ссылка вокруг целого блока, например карточки, в HTML5 можно обернуть div в a. Если div всё же нужен как элемент управления, ему добавляют tabindex="0", роль и обработку клавиш, но это лишняя работа по сравнению с button.

Создать div скриптом и добавить в другой блок можно методами createElement и append. Текст записывают свойством textContent: оно записывает строку как текст, а не как разметку.

JavaScript
const box = document.createElement('div');
box.className = 'card';
box.textContent = 'Новый блок';
document.querySelector('.list').append(box);

Частые ошибки с тегом div

Ошибки с этим тегом связаны с выбором вместо семантических тегов, с вложенностью и с ожиданиями от блока.

ОшибкаЧто происходитКак исправить
div вместо заголовка: <div class="title">Название</div>Программы не считают блок заголовком, поисковая система теряет структуруИспользовать h1 - h6
Вся страница из div с классами header, menu, footerРазметка разрастается, а назначения блоков программа не видитВзять header, nav, main, footer и другие семантические теги
div внутри pПарсер закрывает абзац раньше: получается пустой p и лишний текст вне блокаЗаписывать div рядом с p или вокруг него
text-align: center у родителя ради центрирования блокаСдвигается текст, а блок остаётся на местеДля блока: width и margin: 0 auto
Пустой div с фоном без высотыВысота 0, блок не виденЗадать height или записать содержимое
Незакрытый <div>Браузер закроет его в конце родителя, следующие блоки окажутся внутриЗакрывать каждый div и проверять вложенность
div вместо кнопки: <div onclick="...">Клавиатурой его не активировать: он не получает фокусИспользовать button или a
align="center" у divАтрибут устарел: центрируется текст, а не блокCSS: margin: 0 auto или flex
Рамка и отступы без учёта box-sizingПри content-box ширина 100 px вместе с padding и рамкой даёт 130 pxЗадать box-sizing: border-box
Категория
Поделиться в социальных сетях

Отправить комментарий

0 Комментарии

Отправить комментарий (0)

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×