Схлопывание внешних отступов — CSS

Отступы margin-top и margin-bottom иногда объединяются в один, с размером равным наибольшему из них (или размеру одного, если они равны). Это поведение известно как схлопывание внешних отступов (margin collapsing). Обратите внимание, что отступы плавающих и абсолютно позиционированных элементов никогда не схлопываются.

Схлопывание внешних отступов происходит в трёх случаях:

Соседние элементы (siblings)

Схлопываются отступы соседних элементов (за исключением случая, когда к последнему элементу применено свойство clear).

Родительский и первый/последний дочерние элементы

Если отсутствуют границы (border), внутренние отступы (padding), строчное содержимое (inline/inline-block) или промежуток для отделения margin-top родительского элемента, от margin-top одного или нескольких его дочерних элементов/блоков или отсутствуют границы (border), внутренние отступы (padding), строчное содержимое (inline/inline-block),

height, min-height или max-height для отделения отступов margin-bottom родительского блока от margin-bottom отступов одного или нескольких его дочерних элементов/блоков, то внешние отступы схлопываются. Схлопнутые отступы заканчиваются за пределами родительского элемента.

Пустые блоки

Если отсутствуют границы (border), внутренние отступы (padding), строчное содержимое (inline/inline-block), height или min-height для отделения margin-top верхнего отступа этого блока от его margin-bottom

нижнего отступа, то верхние и нижние внешние отступы этого блока схлопываются.

На заметку:

  • Более сложное схлопывание отступов (более, чем двух) происходит, когда описанные случаи сочетаются.
  • Эти правила применяются даже к отступам, равным 0, поэтому отступ первого/последнего дочернего элемента заканчивается за пределами его родителя (согласно правилу выше) независимо от того, равен ли отступ родителя нулю.
  • При использовании отрицательных отступов, размер схлопнутого отступа вычисляется, как сумма наибольшего положительного и наименьшего отрицательного (наибольшего по модулю) отступа.
  • Если все отступы отрицательные, размер схлопнутого отступа равен наименьшему (наибольшему по модулю) отступу. Это относится как к вложенным элементам, так и к соседним.
  • Внешние отступы плавающих и абсолютно позиционируемых элементов никогда не схлопываются.

HTML

<p>Нижний отступ этого абзаца схлопнулся …</p>
<p>… с верхним отступом этого абзаца, объеденив отступы между ними в один, равный <code>1.2rem</code>.</p>
<div>Этот родительский элемент содержит два абзаца!
  <p>Этот абзац имеет отступ <code>.4rem</code> между ним и текстом выше.</p>
  <p>Нижний отступ этого абзаца схлопывается с отступом родителя, принимая значение <code>2rem</code>.</p>
</div>
<p>Этот абзац имеет отступ <code>2rem</code> от элемента выше.</p>

CSS

div {
  margin: 2rem 0;
  background: lavender;
}
p {
  margin: .4rem 0 1.2rem 0;
  background: yellow;
}

Результат

SpecificationStatusComment
CSS Level 2 (Revision 1)
Определение ‘margin collapsing’ в этой спецификации.
РекомендацияInitial definition

  • CSS Reference (en-US)

Found a content problem with this page?

  • Edit the page on GitHub.
  • Report the content issue.
  • View the source on GitHub.
Want to get more involved?

Learn how to contribute.

This page was last modified on by MDN contributors.

Как лучше задавать отступы в потоке модулей и элементов?

Сегодняшний совет — особенный: я хочу поспорить с другим советчиком и поделиться альтернативной точкой зрения на управление отступами в ЦСС.

Вёрстка слева направо и сверху вниз

В своём совете Игорь Петров предлагает управлять вертикальными отступами, задавая только нижние отступы элементам:

Вёрстка слева направо и сверху вниз

/* Внутри текстовой полосы
   отступ после абзаца равен 36 пк,
   отступ после перечня равен 54 пк */
.
textBox p { margin-bottom: 36px; } .textBox ul { margin-bottom: 54px; }

Здесь и в примерах ниже мы считаем, что отступы элементов ранее были сброшены в ноль

По моему опыту, такая система вёрстки быстро обрастает исключениями. Представьте, что после картинок должен быть отступ в 72 пикселя, но подписи должны стоять на расстоянии в 18 пикселей. Приходится «подтягивать» подпись к картинке отрицательным отступом вверх:

.textBox img {
  margin-bottom: 72px;
}
.textBox img + .caption {
  margin-top: -54px;
}

Мы не только добавили исключение, изменив направление отступа, но и ввели магическую константу: почему именно 54, откуда взялось это число?

Мне кажется, что проблема не в направлении отступов, а в том, что мы делаем отступы свойством

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

Если запретить элементам контролировать отступы и начать задавать отступы отношениям между ними, код станет проще и нагляднее:

Можно смотреть на это как на полуапроши и кернинг. Полуапроши в буквах задают базовые отступы букв от любых соседних. Если грамотно их задать, если есть грамотная система, то буква будет хорошо смотреться рядом с большинством других.

Потом навешивается кернинг — особые отступы в конкретных отдельных парах, исключения.

/* Отступ по умолчанию.
   Что бы ни шло после картинки,
   отступ между ней и следующим элементом
   будет равен 72 пк */
.textBox img + * {
  margin-top: 72px;
}
/* Особый отступ в отдельной паре.
   Если после картинки идёт подпись,
   она получает уменьшенный отступ */
.textBox img + .caption {
  margin-top: 18px;
}

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

Можно смотреть на это как на полуапроши и кернинг. Полуапроши в буквах задают базовые отступы букв от любых соседних.

Если грамотно их задать, если есть грамотная система, то буква будет хорошо смотреться рядом с большинством других.

Потом навешивается кернинг — особые отступы в конкретных отдельных парах, исключения.

Этот же подход работает и в случае, когда отступы явно задаются через специальный элемент‑обёртку, например, .rows или .stack:

Было

/* Элементы внутри .rows и .stack
   считаем «этажами», после которых
   идёт отступ в 72 пк */
.rows > *:not(:last-child) {
  margin-bottom: 72px;
}
/* Аналогичные стили, но с отменой
   отступа у последнего элемента */
.stack > * {
  margin-bottom: 72px;
}
.stack > *:last-child {
  margin-bottom: 0;
}

Стало

.rows > * + * {
  margin-top: 72px;
}
.stack > * + * {
  margin-top: 72px;
}

Ещё по теме

  • Margin considered harmful

  • Axiomatic CSS and Lobotomized Owls

  • The Stack

P. S. Это был совет о веб‑разработке. Хотите знать всё о коде, тестах, фронтенд‑разработке, цеэсэсе, яваскрипте, рельсах и джейде? Присылайте вопросы.

Веб‑разработка

Отправить

Поделиться

Поделиться

Запинить

Твитнуть

Свежак

html — свойство CSS для заполнения текста внутри div

спросил

Изменено 1 год, 3 месяца назад

Просмотрено 209 тысяч раз

Есть ли способ добавить элементу div отступ ВНУТРИ его границы? Например, в настоящее время весь текст внутри моего основного 9Элемент 0011 div

идет прямо к краю границы элемента. Я хотел бы, как правило, на этом сайте, чтобы между текстом и границей было не менее 10-20 пикселей.

Вот снимок экрана, иллюстрирующий, что у меня сейчас есть:

  • html
  • css
1

Искомое свойство CSS — padding. Проблема с отступами заключается в том, что они добавляются к ширине исходного элемента, поэтому, если у вас есть div шириной 300 пикселей и вы добавляете к нему отступы в 10 пикселей, ширина теперь будет 320 пикселей (10 пикселей слева и 10 пикселей слева). право).

Чтобы предотвратить это, вы можете добавить box-sizing: border-box; к div, это заставляет его поддерживать назначенную ширину, даже если вы добавляете отступы. Таким образом, ваш CSS будет выглядеть так:

 div {
    box-sizing: граница-коробка;
    отступ: 10 пикселей;
}
 

вы можете узнать больше о размерах блоков и их общей поддержке браузерами здесь:

https://www.paulirish.com/2012/box-sizing-border-box-ftw/

Здесь я вижу много ответов что вы вычитаете из ширины div и/или используете box-sizing, но все, что вам нужно сделать, это применить дополнение к дочерним элементам рассматриваемого div. Так, например, если у вас есть такая разметка:

 <дел>
    

Найти агентов

Все, что вам нужно сделать, это применить этот CSS:

 #text {
    отступ: 10 пикселей;
}
 

Вот скрипт, показывающий разницу: https://jsfiddle. net/CHCVF/2/

Или, что еще лучше, если у вас есть несколько элементов и вам не хочется присваивать им один и тот же класс, вы можете сделать примерно так:

 .container * {
    отступ: 5px 10px;
}
 

Который выберет все дочерние элементы и назначит им нужные отступы. Вот скрипка в действии: https://jsfiddle.net/CHCVF/3/

4

Просто используйте div { padding: 20px; } и вычтите 40px из исходной ширины div .

Как указал Филип Уиллс, вы также можете использовать box-sizing вместо вычитания 40px :

 div {
    отступ: 20 пикселей;
    -moz-box-sizing: рамка-бокс;
    box-sizing: граница-коробка;
}
 

-moz-box-sizing для Firefox.

3

Padding — это способ добавить отступ внутри Div.
Просто используйте

 div { padding-left: 20px; }
 

И чтобы сохранить размер, вам нужно будет -20 пикселей от исходной ширины Div.

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.

html — заполнение внутри DIV

спросил

Изменено 7 лет, 4 месяца назад

Просмотрено 5к раз

Почему добавление некоторых отступов влияет на элементы вне блока DIV? Заполнение не должно создавать пространство между границей DIV и содержимым внутри это? Как вы можете создать это пространство, не затрагивая элементы за пределами блока DIv?

  • HTML
  • CSS
0

Как вы можете создать это пространство, не затрагивая элементы за пределами DIv-бокс?

Используйте box-sizing: border-box

Из MDN:

бордюр-бокс Свойства ширины и высоты включают отступы и граница, но не граница.

Причина, по которой это свойство должно быть установлено, заключается в том, что по умолчанию значение для box-sizing равно content-box . Снова из MDN:

content-box Это стиль по умолчанию, указанный в стандарте CSS. Свойства ширины и высоты измеряются, включая только содержимое, но не отступы, границы или поля.

Если вы указали контент высота или ширина , тогда дополнение будет размещено вокруг . Это сдвигает границу наружу. Это сдвигает границу наружу. Это отталкивает близлежащие элементы.

Вы можете изменить его, уменьшив высоту и/или ширину для компенсации или используя свойство box-sizing , чтобы сделать высоту и ширину вместо определения расстояния между внешними краями границы. внешних краев содержимого.

Попробуйте заглянуть в box-sizing свойство. ..

Сегодня текущие версии всех браузеров используют исходную «ширину или высота + отступ + граница = фактическая ширина или высота «блочной модели». С box-sizing: border-box;, мы можем изменить модель коробки на ту, что была когда-то «причудливый» способ, когда указанные ширина и высота элемента не затронуты отступами или границами. Это оказалось настолько полезным в адаптивный дизайн, который нашел свое применение в стилях сброса.

Значение, которое вам нужно, это border-box :

 .class {
    box-sizing: граница-коробка;
}
 

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.