Фиксированная высота и absolute для текстовых блоков

  1. Не задавайте текстовым блокам фиксированную высоту #

    Почему? #

    При увеличении количества текста он вывалится наружу и может наложиться на нижележащие элементы.

    Как это увидеть? #

    Можно отредактировать исходный HTML, а можно выполнить в консоли браузера такую команду:

    document.body.contentEditable = true

    После этого вы сможете отредактировать любой текст на странице.

    Добавим текст:

    При фиксированной ширине текст выпадает из родительского блока
    При фиксированной высоте текст не может растянуть блок и вываливается.
    А как надо? #

    Решение зависит от того, что нужно сделать. Если у блока по макету есть минимальная высота, но контента недостаточно, чтобы его растянуть, используйте min-height:

    • Плохо
      .container {
        height: 150px;
        padding: 10px;
      }
    • Хорошо
      .container {
        min-height: 150px;
        padding: 10px;
      }
    С min-height текст не выпадает из родителя

    min-height позволит добиться соответствия макету, а при добавлении контента блок просто вырастет вниз.

    Ещё это может быть полезно как временное решение, чтобы разложить блоки по макету, до того, как будет стилизовано содержимое, после этого min-height убирается.

    Если же контента достаточно, min-height не нужен, достаточно задать стили для текста и padding для блока, и его размеры будут определяться содержимым.

    Если у блока есть явные границы, padding нужно задавать со всех сторон, чтобы при добавлении текста он не упёрся в края:

    Подопытная кнопка с минимальной шириной и высотой

    Изменим текст:

    Не хватает паддингов слева и справа
    Не хватает вертикальных паддингов
    Все паддинги на месте, добавление текста ничего не ломает

  2. Не используйте absolute для позиционирования текстовых блоков #

    Почему? #

    При абсолютном позиционировании блок не влияет на размеры родителя. При увеличении количества текста он не сможет растянуть родительский блок и вывалится наружу.

    Как это увидеть? #

    Как и в предыдущем случае, можно отредактировать исходный HTML или использовать команду в консоли:

    document.body.contentEditable = true

    После чего добавить текст в интересующий элемент.

    Абсолютно спозиционированный элемент не растягивает родителя
    Абсолютно спозиционированный элемент не может растянуть родительский блок.
    А как надо? #

    В этом случае лучше перенести position:absolute на картинку и добавить min-height, чтобы блок не схлопывался по высоте текста (иначе может вывалиться картинка):

    • Плохо
      .block {
        position: relative;
        display: flex;
        width: 600px;
        padding: 20px;
      }
      .block__content {
        position: absolute;
      }
      .block__img {
        margin-left: auto;
      }
    • Хорошо
      .block {
        position: relative;
        width: 600px;
        min-height: 350px;
        padding: 20px;
      }
      .block__content {
        z-index: 1;
      }
      .block__img {
        position: absolute;
        top: 20px;
        right: 20px;
      }
    min-height не даёт блоку схлопнуться, если текста мало
    Проверяем с коротким текстом: min-height не даёт блоку схлопнуться.
    Длинный текст растягивает блок
    Проверяем с длинным текстом: текст растягивает блок, и ничего не выпадает.

Итого

  • Не задавайте текстовым блокам фиксированную высоту, лучше использовать min-height.
  • По возможности, не используйте absolute для позиционирования текстовых блоков. Если текст должен наползать на картинку, абсолютное позиционирование лучше задать картинке.