17 Модуль 4 Коробки и раскладка 14 мин урок 17 из 25

Поток документа и display

Почему одни элементы занимают всю строку, а другие стоят рядом, что делает inline-block и чем display: none отличается от visibility: hidden.

Что ты научишься делать

  • Объяснишь, почему заголовок занимает всю строку, а ссылка — нет
  • Поймёшь, какие свойства не действуют на строчные элементы
  • Сверстаешь горизонтальное меню без флексов — и почувствуешь, зачем они нужны

#Поток: элементы становятся в очередь

Пока ты ничего не задал, браузер расставляет элементы сам, сверху вниз и слева направо. Это называется нормальный поток.

Как именно элемент встаёт в этот поток, зависит от значения display. По умолчанию оно у каждого тега своё, и его-то мы и будем менять.

#Блочные и строчные

Блочные (block)Строчные (inline)
Примерыdiv, p, h1, section, ulspan, a, strong, em, img
ЗанимаютВсю доступную ширинуРовно столько, сколько нужно содержимому
НачинаютсяС новой строкиПродолжают текущую строку
width, heightРаботаютНе работают
Вертикальные margin, paddingРаботаютPadding рисуется, но не раздвигает строку
Горизонтальные отступыРаботаютРаботают
Почему у span не работает ширина
В песочницу

#inline-block: компромисс

display: inline-block берёт лучшее от обоих: элемент остаётся в строке рядом с соседями, но при этом слушается width, height и вертикальных отступов.

Это классический способ сделать кнопку из ссылки: a строчный, а кнопке нужны отступы.

CSSСсылка-кнопка
.btn {  display: inline-block;  padding: 12px 24px;  background: #6544e0;  color: #fff;  border-radius: 999px;  text-decoration: none;}

#Основные значения display

ЗначениеЧто делает
blockЗанимает всю ширину, начинается с новой строки
inlineЖивёт внутри строки, размеры не задаются
inline-blockВ строке, но с размерами и отступами
noneЭлемента нет вообще: он не занимает места
flexДелает элемент флекс-контейнером — двадцатый урок
gridДелает элемент грид-контейнером — двадцать первый урок
list-itemКак блок, но с маркером списка

#none, hidden и прозрачность

Три способа «спрятать» элемент — и все три разные.

СпособЗанимает место?Читает голосовая программа?Кликается?
display: noneНетНетНет
visibility: hiddenДаНетНет
opacity: 0ДаДаДа
Атрибут hiddenНетНетНет
Класс .visually-hiddenПочти нетДаДа
CSSСпрятать глазами, оставить для голоса
/* Текст не виден, но программа чтения его прочитает.   Нужен для подписей к иконкам и невидимых заголовков. */.visually-hidden {  position: absolute;  width: 1px;  height: 1px;  margin: -1px;  overflow: hidden;  clip-path: inset(50%);  white-space: nowrap;}

#overflow: что делать с тем, что не влезло

Если содержимое больше блока, по умолчанию оно просто вылезает наружу. overflow задаёт другое поведение.

Четыре варианта overflow
В песочницу

#Меню без флексов: почувствуй боль

Задача простая: поставить пункты меню в строку. Флексов у нас пока нет — сделаем на inline-block.

Меню на inline-block
В песочницу

Работает — но с оговорками. Разметку пришлось писать без переносов строк, иначе появятся зазоры. Прижать последний пункт вправо нечем. Выровнять пункты разной высоты по центру — тоже. Расстояние между ними задаётся отступами у каждого, а не одним свойством.

Всё это решает одна строка display: flex. Через три урока ты вернёшься к этому меню и перепишешь его за минуту.

Где спотыкаются почти все

Заданы width и height строчному элементу

Почему Свойства просто игнорируются. Человек видит, что «CSS не работает», и начинает искать ошибку не там.

Как надо Добавь display: inline-block или display: block — и размеры заработают.

Элемент спрятан через opacity: 0

Почему Он остаётся на месте: перекрывает клики и читается голосовой программой.

Как надо Действительно спрятать — display: none. Спрятать только визуально, оставив для голоса, — класс .visually-hidden.

Между inline-block элементами появились зазоры

Почему Переносы строк в разметке браузер считает пробелами и рисует их.

Как надо Не бороться, а перейти на флексы. Там пробелы между элементами не появляются вовсе.

overflow: hidden поставлен «чтобы не вылезало»

Почему Обрезается не только лишнее: пропадают тени, всплывающие подсказки и выпадающие меню внутри блока.

Как надо Сначала разберись, почему содержимое не помещается. Обрезка — крайняя мера.

Нормальный поток normal flow
Порядок, в котором браузер расставляет элементы по умолчанию: сверху вниз, слева направо.
Блочный элемент block
Занимает всю ширину строки, начинается с новой строки, слушается размеров.
Строчный элемент inline
Живёт внутри строки, размеры к нему не применяются.
inline-block inline-block
В строке, но с размерами и вертикальными отступами.
overflow overflow
Что делать с содержимым, которое не помещается: показать, обрезать или прокручивать.

Проверь себя

  1. Почему <code>width: 300px</code> не действует на <code>&lt;span&gt;</code>?

    Строчный элемент занимает столько места, сколько нужно содержимому. Чтобы задать размеры, поменяй <code>display</code>.

  2. Чем <code>display: none</code> отличается от <code>visibility: hidden</code>?

    <code>none</code> убирает элемент из потока полностью, <code>hidden</code> оставляет пустое место на его размер.

  3. Какой способ спрятать текст оставит его доступным голосовой программе?

    Приём с размером 1×1 пиксель и обрезкой убирает текст с экрана, но оставляет его в дереве доступности.

  4. Откуда берётся зазор между элементами <code>inline-block</code>?

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

  5. Что произойдёт при <code>overflow: auto</code>, если содержимое помещается?

    <code>auto</code> показывает полосу только при необходимости. <code>scroll</code> рисует её всегда.

Задание

Горизонтальное меню без флексов

Собери меню в строку, не используя display: flex и grid. Условия:

  • пункты стоят в одну строку;
  • маркеры списка убраны;
  • у ссылок внутренние отступы не меньше 10px по вертикали и 16px по горизонтали;
  • ссылки без подчёркивания;
  • при наведении у ссылки меняется фон.
Открыть в песочнице
    Подсказка 1

    Чтобы вертикальные отступы у ссылки заработали, ей тоже нужен display: inline-block.

    Подсказка 2

    Маркеры убираются у самого списка: .menu { list-style: none; padding: 0; }

    Показать решение
    HTMLindex.html
    <ul class="menu"><li><a href="#">Главная</a></li><li><a href="#">Меню</a></li><li><a href="#">О нас</a></li><li><a href="#">Контакты</a></li></ul>
    CSSstyle.css
    .menu {  padding: 0;  list-style: none;}.menu li {  display: inline-block;}.menu a {  display: inline-block;  padding: 10px 16px;  color: #333;  text-decoration: none;  border-radius: 8px;}.menu a:hover {  background: #eceaff;}

    Проверь себя