Что делает display
У каждого элемента есть значение display, которое определяет, как он размещается. Первые три, с которыми вы встретитесь, это block, inline и inline-block. Вот три одинаковых блока, с одинаковыми width, height, padding и margin, различается только display:
block | inline | inline-block | |
|---|---|---|---|
| Начинается с новой строки | Да | Нет | Нет |
| Ширина по умолчанию | Заполняет контейнер | По содержимому | По содержимому |
width и height | Применяются | Игнорируются | Применяются |
| Вертикальный margin | Применяется | Игнорируется | Применяется |
| Вертикальный padding | Раздвигает содержимое | Рисуется, но не раздвигает строки | Раздвигает содержимое |
| Типичные элементы | div, p, h1, ul, section | span, a, strong, em | button, 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: none | visibility: hidden | opacity: 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-grid | Flex- или 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 или уберите пробелы.