Схлопывание внешних отступов — CSS
Отступы margin-top и margin-bottom иногда объединяются в один, с размером равным наибольшему из них (или размеру одного, если они равны). Это поведение известно как схлопывание внешних отступов (margin collapsing). Обратите внимание, что отступы плавающих и абсолютно позиционированных элементов никогда не схлопываются.
Схлопывание внешних отступов происходит в трёх случаях:
- Соседние элементы (siblings)
Схлопываются отступы соседних элементов (за исключением случая, когда к последнему элементу применено свойство
clear
).- Родительский и первый/последний дочерние элементы
Если отсутствуют границы (border), внутренние отступы (padding), строчное содержимое (inline/inline-block) или промежуток для отделения
margin-top
родительского элемента, отmargin-top
одного или нескольких его дочерних элементов/блоков или отсутствуют границы (border), внутренние отступы (padding), строчное содержимое (inline/inline-block),
,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; }
Результат
Specification | Status | Comment |
---|---|---|
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.
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
Вот снимок экрана, иллюстрирующий, что у меня сейчас есть:
- html
- css
Искомое свойство 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.
Padding — это способ добавить отступ внутри Div.
Просто используйте
div { padding-left: 20px; }
И чтобы сохранить размер, вам нужно будет -20 пикселей от исходной ширины Div.
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google Зарегистрироваться через Facebook Зарегистрируйтесь, используя электронную почту и парольОпубликовать как гость
Электронная почтаТребуется, но не отображается
Опубликовать как гость
Электронная почтаТребуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.
html — заполнение внутри DIV
спросил
Изменено 7 лет, 4 месяца назад
Просмотрено 5к раз
Почему добавление некоторых отступов влияет на элементы вне блока DIV? Заполнение не должно создавать пространство между границей DIV и содержимым внутри это? Как вы можете создать это пространство, не затрагивая элементы за пределами блока DIv?
- HTML
- CSS
Как вы можете создать это пространство, не затрагивая элементы за пределами 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 Зарегистрируйтесь, используя электронную почту и парольОпубликовать как гость
Электронная почтаТребуется, но никогда не отображается
Опубликовать как гость
Электронная почтаТребуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.