Menu

Display в CSS: block, inline, inline-block, none и flex

Свойство display определяет, как элемент участвует в раскладке. Разберем block, inline и inline-block на измеренных блоках рядом, display none и visibility hidden, а также место flex, grid, flow-root и contents.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Что делает display

У каждого элемента есть значение display, которое определяет, как он размещается. Первые три, с которыми вы встретитесь, это block, inline и inline-block. Вот три одинаковых блока, с одинаковыми width, height, padding и margin, различается только display:

blockinlineinline-block
Начинается с новой строкиДаНетНет
Ширина по умолчаниюЗаполняет контейнерПо содержимомуПо содержимому
width и heightПрименяютсяИгнорируютсяПрименяются
Вертикальный marginПрименяетсяИгнорируетсяПрименяется
Вертикальный paddingРаздвигает содержимоеРисуется, но не раздвигает строкиРаздвигает содержимое
Типичные элементыdiv, p, h1, ul, sectionspan, a, strong, embutton, input, img (замещаемые элементы ведут себя так)

В превью блочный элемент стоит на отдельной строке шириной 120px. Строчный игнорирует ширину и высоту и оборачивает только свое слово, а его вертикальный padding и рамка выступают над строкой и под ней, не делая строку выше. Блок inline-block остается в строке текста, но сохраняет полный размер.

display: block

Блочный элемент занимает всю доступную ширину и переносит все, что идет следом, на новую строку. Если превратить ссылку в блок, кликабельной станет вся строка:

.menu a {
  display: block;       /* the full row is the link */
  padding: 10px 16px;
}

Ширину блока можно задать, и тогда margin: 0 auto центрирует его, как показано на странице выравнивание div по центру.

display: inline-block

inline-block это золотая середина: он идет в строке как слово, но ему можно задать размер. Это удобно для бейджей, кнопок и иконок внутри текста:

Несколько блоков inline-block в ряд получают между собой небольшой промежуток из-за пробелов в HTML. Для рядов блоков лучше подходит display: flex у родителя.

display: none и visibility: hidden

Оба делают элемент невидимым. Разница в том, сохраняет ли он свое место:

display: nonevisibility: hiddenopacity: 0
Занимает местоНетДаДа
Можно кликнутьНетНетДа
Читается программами чтения с экранаНетНетДа
Можно плавно анимироватьНетНетДа

HTML-атрибут hidden делает то же, что display: none, через таблицу стилей браузера, а значит, любое правило CSS, задающее элементу display (например, .card { display: flex; }), перебивает его, и элемент снова появляется. Добавьте [hidden] { display: none !important; }, если это вам мешает.

Чтобы скрыть что-то визуально, но оставить для программ чтения с экрана (скажем, подпись для кнопки-иконки), используйте класс «визуально скрыто», а не display: none.

display: flex и display: grid

Эти два значения превращают элемент в контейнер раскладки для его дочерних элементов:

  • display: flex выстраивает дочерние элементы в одну строку или колонку с управлением выравниванием и промежутками. Смотрите Flexbox CSS.
  • display: grid размещает дочерние элементы по строкам и колонкам одновременно.

Сам контейнер остается блочным. inline-flex и inline-grid делают то же самое с дочерними элементами, но сам контейнер идет в строке, как inline-block.

Остальные значения

ЗначениеЧто делает
flow-rootБлок, который вмещает свои float и не дает отступам дочерних элементов вытекать наружу; современный «clearfix»
contentsСобственный блок элемента исчезает, а его дочерние элементы ведут себя как дочерние элементы его родителя. Не используйте на кнопках, списках и таблицах: некоторые браузеры теряют смысл элемента для программ чтения с экрана
list-itemБлок с маркером списка, значение по умолчанию у li
table, table-row, table-cellТабличная раскладка для нетабличных элементов
inline-flex, inline-gridFlex- или grid-контейнер, который стоит в строке

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

  • width или height у span или a. Строчные элементы их игнорируют. Используйте inline-block или block.
  • Вертикальный margin у строчного элемента. Тоже игнорируется. Решение то же.
  • display: none для текста, который нужен программам чтения с экрана. Он скрывает его и от них.
  • Ожидание, что дочерний элемент появится внутри родителя с display: none. Внутри скрытого родителя ничего не отрисовывается.
  • Правило display перебивает атрибут hidden. Правило CSS побеждает.
  • Попытка анимировать display. display: none скрывает элемент сразу, без затухания; анимируйте opacity, а display (или visibility) переключайте в конце.

Часто задаваемые вопросы

Чем отличаются block, inline и inline-block?

Элемент block начинается с новой строки и заполняет доступную ширину. Элемент inline идет внутри текста и игнорирует width, height и вертикальные отступы. inline-block идет внутри текста как inline, но принимает ширину, высоту, padding и margin как block.

Что делает display: none?

Полностью убирает элемент со страницы: он не занимает места, не отрисовывается и скрыт от программ чтения с экрана. Его дочерние элементы скрыты вместе с ним и не могут быть показаны собственным значением display.

Чем display: none отличается от visibility: hidden?

display: none убирает элемент и его место. visibility: hidden делает его невидимым, но сохраняет его место в раскладке, поэтому ничего не сдвигается.

div по умолчанию блочный или строчный?

Блочный. div, p, заголовки, ul, section и form по умолчанию block; span, a, strong, em, img, input и button это inline или inline-block.

Почему между элементами inline-block появляется промежуток?

Пробельные символы между тегами в HTML отображаются как пробел, так же как между словами. Используйте у родителя display: flex с gap или уберите пробелы.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ