Можно ли вообще отключить коллапс маржи? Единственные решения, которые я нашел (под названием «uncollapsing»), влекут за собой использование 1px border или 1px padding. Я считаю это неприемлемым: посторонний пиксель усложняет вычисления без веской причины. Есть ли более разумный способ отключить это сокращение полей?
203
margin-bottom
margin-top
Ответы:
Существует два основных типа обрушения маржи:
Использование отступов или бордюров предотвратит коллапс только в последнем случае. Кроме того, любое значение,
overflow
отличное от его default (visible
), примененного к родителю, предотвратит коллапс. Таким образом, обаoverflow: auto
иoverflow: hidden
будут иметь одинаковый эффект. Возможно, единственное отличие при использованииhidden
- это непреднамеренное последствие скрытия контента, если родитель имеет фиксированную высоту.Другие свойства, которые после применения к родителю могут помочь исправить это поведение:
float: left / right
position: absolute
display: inline-block / flex
Вы можете проверить их все здесь: http://jsfiddle.net/XB9wX/1/ .
Я должен добавить, что, как обычно, Internet Explorer является исключением. В частности, в IE 7 поля не сворачиваются, когда для родительского элемента указана какая-то компоновка, например
width
.Источники: статья Sitepoint, Свертывание полей
источник
overflow: auto
может привести к появлению полос прокрутки в родительском элементе, а не к переполнению содержимого в соответствии сoverflow: visible
.flex
отличное от значения по умолчанию, также отключит коллапс маржиДля этого вы также можете использовать старый добрый микрофиксон.
Смотрите обновленную скрипку: http://jsfiddle.net/XB9wX/97/
источник
:before
и:after
элементами. Теперь я добавил это правило к моей таблице стилей:div:before, div:after{content: ' '; display: table;}
. Фантастика. Внезапно вещи начинают вести себя как ожидалось.Насколько мне известно, одним из хитрых приемов отключения сворачивания полей, который не оказывает визуального воздействия, является установка отступа родительского элемента в
0.05px
:Заполнение больше не равно 0, поэтому свертывание больше не происходит, но в то же время заполнение достаточно мало, чтобы визуально оно округлялось до 0.
Если требуется какое-то другое заполнение, тогда применяют заполнение только к «направлению», в котором, например, не требуется сворачивание полей
padding-top: 0.05px;
.Рабочий пример:
Изменить: изменил значение с
0.1
на0.05
. Как отметил Крис Морган в комментарии ниже, и из этого небольшого теста кажется, что действительно Firefox принимает во внимание0.1px
отступы. Хотя,0.05px
похоже , делает свое дело.источник
*{padding-top:0.1px}
, Мы уверены, что он работает во всех браузерах?0.05px
Я бы предпочел, чтобы это был конкретный выбор, а не случайный номер обмана браузера0.01px
.overflow:hidden
предотвращает разрушение полей, но не лишено побочных эффектов, а именно ... скрывает переполнение.Помимо этого и того, что вы упомянули, вы просто должны научиться жить с этим и учиться на этот день, когда они действительно полезны (приходит каждые 3-5 лет).
источник
overflow: auto
хорошо использовать, чтобы предотвратить скрытое переполнение и все же предотвратить падение полей.overflow:auto;
заставил мою область контента получить полосу прокрутки на некоторых страницах.На самом деле, есть один, который работает безупречно:
дисплей: гибкий; flex-direction: столбец;
источник
<div>
внутри.container
, в противном случае.container
будет контролировать бокс-модель своих детей. Например, встроенные элементы станут блочными элементами полной ширины; если у них есть маржа, они также будут обесценены.Каждый браузер на основе webkit должен поддерживать свойства
-webkit-margin-collapse
. Есть также подвойства, чтобы установить его только для верхнего или нижнего поля. Вы можете присвоить ему значения свернуть (по умолчанию), отбросить (устанавливает для поля значение 0, если есть соседнее поле) и разделить (предотвращает сжатие поля).Я проверял, что это работает на версиях Chrome и Safari 2014 года. К сожалению, я не думаю, что это будет поддерживаться в IE, потому что он не основан на webkit.
Прочитайте Apple Safari CSS Reference для полного объяснения.
Если вы заглянете на страницу расширений CSS веб-набора Mozilla , они перечислят эти свойства как собственные и рекомендуют не использовать их. Это потому, что они, скорее всего, не собираются переходить на стандартный CSS в ближайшее время, и только браузеры на основе webkit будут поддерживать их.
источник
Я знаю, что это очень старая статья, но я просто хотел сказать, что использование flexbox для родительского элемента отключило бы свертывание полей для его дочерних элементов.
источник
У меня была похожая проблема с коллапсом полей из-за того, что родитель
position
установил относительное значение. Вот список команд, которые вы можете использовать, чтобы отключить сжатие полей.ЗДЕСЬ ИГРА ДЛЯ ТЕСТИРОВАНИЯ
Просто попробуйте присвоить любой
parent-fix*
класс кdiv.container
элементу, или любой классchildren-fix*
кdiv.margin
. Выберите тот, который соответствует вашим потребностям лучше всего.когда
div.absolute
с красным фоном будет расположен в самом верху страницы.div.absolute
будет располагаться в той же координате Y, что иdiv.margin
Вот jsFiddle с примером, который вы можете редактировать
источник
В более новом браузере (исключая IE11) используется простое решение для предотвращения коллапса родительско-дочерних полей
display: flow-root
. Тем не менее, вам по-прежнему нужны другие методы для предотвращения разрушения соседних элементов.ДЕМО (до)
ДЕМО (после)
источник
Для вашей информации вы можете использовать сетку, но с побочными эффектами :)
источник