Должен ли интервал между родительским и дочерним контейнерами принадлежать родительскому или дочернему?

Я изо всех сил пытаюсь определить, где в моем CSS должны быть отступы/поля, чтобы сохранить разделение между родительскими и дочерними контейнерами. Например, если у вас есть родитель div с двумя вложенными дочерними элементами, и вам нужно иметь ровный интервал 10px между дочерними элементами, а также иметь дочерние элементы на расстоянии 10px от родителя; тогда бы вы добавили отступ к родительскому div {padding:10px}, а затем просто добавили бы 10px отступа между дочерними элементами? Или вы бы оставили родителя в 0 дополнении, а дети определили бы, какое разделение им нужно друг от друга, а также от своих родителей?

Вот исходная скрипта, показывающая оба примера, и фрагмент, показывающий то же самое

.parent1 { /*spaces itself from its children*/
    display: inline-block;
    padding: 10px;
    font-size: 0;
    border: 1px solid red;
}
.child1 {
    display: inline-block;
    margin-right: 10px;
    font-size: 12pt;
    border: 1px solid blue;
}
.child2 {
    display: inline-block;
    font-size: 12pt;
    border: 1px solid green;
}
.parent2 { /*has not spacing from its children*/
    display: inline-block;
    font-size: 0;
    border: 1px solid red;
}
.child3 {
    display: inline-block;
    margin: 10px;
    font-size: 12pt;
    border: 1px solid blue;
}
.child4 {
    display: inline-block;
    margin-right: 10px;
    font-size: 12pt;
    border: 1px solid green;
}
<div class="parent1">
    <div class="child1">child1</div>
    <div class="child2">child2</div>
</div>
<br/>
<br/>
<div class="parent2">
    <div class="child3">child3</div>
    <div class="child4">child4</div>
</div>


person johntrepreneur    schedule 28.03.2012    source источник


Ответы (4)


Для меня это зависит полностью от семантического значения рассматриваемых узлов - что является родительским, что является дочерним?

Родитель «хочет» пространство внутри него, чтобы его содержимое не выходило за его границы (заполнение)? Или дети «хотят» дистанции между собой и своим родителем (маржа)?

Ответы на эти вопросы основаны на цели, которой служит каждый узел (я хорошо разбираюсь в семантической разметке и избегаю презентационной разметки).

В вашем случае, не зная дальнейшего смысла, похоже, что дети хотят быть в 10px от всего, поэтому я бы дал им margin: 10px; со всех сторон. Схлопывание полей между двумя дочерними элементами оставило бы там только зазор в 10 пикселей, и они были бы на расстоянии 10 пикселей от всего остального, что их окружало.

person Stephen P    schedule 29.03.2012
comment
Интересный ответ. Так что мой случай довольно простой. Мой родитель — это основной раздел содержимого макета страницы (с боковыми панелями и верхним/нижним колонтитулом). Тогда мои дочерние элементы будут просто всеми div, которые я позиционирую внутри, и есть несколько вложенных div (дочерних элементов внутри дочерних элементов). Должен ли основной div содержимого иметь отступы внутри, чтобы дочерние div не касались друг друга (при условии, что это то, что я хочу, и оно должно быть согласованным)? Или я должен убедиться, что все разные непосредственные дочерние элементы используют одни и те же поля/отступы, чтобы держаться на расстоянии от прикосновения к краям родительского элемента div основного содержимого? - person johntrepreneur; 29.03.2012
comment
Кажется, повторение и склонность к ошибкам позволяют всем детям повторять это, предполагая одинаковое расстояние, поэтому в этом случае я бы выбрал интервал для родителя. Единственный недостаток от размещения его на родительском элементе (о котором я могу думать) заключается в том, что могут возникнуть обстоятельства, когда я хочу уменьшить расстояние между родителем и каким-то странным дочерним элементом, и в этом случае мне не повезло. Мысли? - person johntrepreneur; 29.03.2012
comment
То, как я работаю, не будет повторяться или подвержено ошибкам, потому что я мог бы сделать всех этих дочерних элементов, скажем, <div class="section"> и иметь единый стиль, который говорит .section { margin: 10px; } (или div.section, точнее, цель). Также могут быть такие вещи, как <div class="tips section">, так что это все еще раздел и получает поля, но получает другие стили, потому что это также .tips - person Stephen P; 30.03.2012
comment
После полного редизайна рассматриваемых страниц я пришел к выводу, что вы правы и все зависит от рассматриваемых узлов. Я начал с родителя по умолчанию, но часто приходилось переключать его в зависимости от ситуации. - person johntrepreneur; 01.04.2012

Обычно я использую отступы в родительском контейнере. Затем отступ между детьми. Например, если бы у меня был ul с 10 дочерними элементами li, я бы добавил 10px padding к ul, 10px margin-bottom к li и 0px margin-bottom к li:last-of-type...

Я не знаю, это зависит от ситуации и вашей интерпретации, я думаю. В моем примере, поскольку я считаю, что пространство между ul и li принадлежит ul, я делаю его отступом ul. Пространство между lis принадлежит им, поэтому я делаю его их поля.

Не большая помощь, да?

person João Paulo Macedo    schedule 29.03.2012
comment
Кроме того, когда вы добавляете отступы к родительскому контейнеру, вы всегда будете уверены, что каждый добавленный вами дочерний элемент будет выровнен там, где вы хотите (при условии, что вы не добавляете поля к дочерним элементам для той же цели). - person João Paulo Macedo; 29.03.2012

Атрибут поля CSS находится снаружи, тогда как отступ находится внутри блока DIV. Я не уверен, что это то, что вы хотите - задокументировано здесь:

Когда использовать поля и отступы в CSS

Я только что проверил, и атрибут поля также работает внутри вложенного DIV. Так что это альтернатива прокладке.

Однако ЕСЛИ позиция в классе абсолютна, заполнение не должно иметь значения. Но если вы используете абсолютные позиции, все DIV должны иметь абсолютные позиции, чтобы избежать потенциального конфликта, и вам нужно будет знать минимальный размер экрана клиента (абсолютный может быть плохой идеей).

ПРИМЕЧАНИЕ. Если какой-либо из ваших клиентов все еще использует IE5, в этом браузере есть ошибка заполнения, которая должна была быть исправлена ​​в IE6. http://forums.devshed.com/css-help-116/css-padding-inside-absolute-div-70789.html

person A B    schedule 28.03.2012
comment
Спасибо за объяснение, но я знаю разницу между ними. Что я пытаюсь понять, так это то, является ли лучшей практикой CSS предоставление интервала между родителем и дочерним элементом от родителя с помощью заполнения, или лучше обеспечить интервал от дочерних элементов с помощью заполнения/маржи. Либо возможно, если вы посмотрите на скрипку, но я предпочитаю то, что лучше всего. - person johntrepreneur; 29.03.2012
comment
Если вас беспокоят вертикальные поля на ваших страницах, отступы должны быть в родительском элементе. Я наблюдал это. seifi.org/css/ css.flepstudio.org/en/css-box- model/ doctype.com/margin-child-element-moves-parent-element reference.sitepoint.com/css/collapsingmargins Если вы пытаетесь получить такой контроль на уровне пикселей над тем, что находится на странице, тогда отступы и/или поля в родительском элементе имели бы смысл. Наличие полей в дочернем элементе может привести к перемещению родителя. - person A B; 29.03.2012

Привет всем, я не эксперт по HTML, я учусь, так что я узнал из веб-индустрии, поэтому я делюсь от имени этого.

По моему Padding — это внутреннее пространство элемента, а margin — внешнее пространство элемента.

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

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

или посмотрите ваш обновленный пример скрипта, который я играл с полями в дочернем контейнере, потому что, когда я использовал отступы в родительском контейнере, я скорректировал его ширину и высоту, но когда я использовал поля, мне не нужно настраивать родительский контейнер, см. демо: - < href="http://jsfiddle.net/WSTv6/1/" rel="nofollow">http://jsfiddle.net/WSTv6/1/

и можете узнать больше о полях и отступах

person Shailender Arora    schedule 29.03.2012