Где вы помещаете свои поля CSS?

Если вы хотите добавить пробелы между элементами HTML (используя CSS), к какому элементу вы присоедините его?

Я регулярно в таких ситуациях:

<body>
  <h1>This is the heading</h1>
  <p>This is a paragraph</p>
  <h1>Here another heading</h1>
  <div>This is a footer</div>
</body>

Теперь, скажем, мне нужно 1 место между каждым из этих элементов, но не выше первого h1 или ниже последнего div. К каким элементам я присоединю его?

Очевидно, нет реальной технической разницы между этим:

h1, p { margin-bottom: 1em; }

... и это...

div { margin-top: 1em; }
p { margin-top: 1em; margin-bottom: 1em }

Мне интересны вторичные факторы:

  • Согласованность
  • Применимость ко всем ситуациям
  • Простота/простота
  • Простота внесения изменений

Например: в этом конкретном сценарии я бы сказал, что первое решение лучше второго, так как оно проще; вы привязываете только крайность к двум элементам в одном определении свойства. Тем не менее, я ищу более универсальное решение. Каждый раз, когда я работаю с CSS, у меня возникает ощущение, что есть хорошее правило для применения... но я не уверен, что это такое. Кто-нибудь имеет хороший аргумент?

Ответы

Ответ 1

Я стараюсь использовать нижнее поле для элементов, когда хочу, чтобы у них было место перед следующим элементом, а затем использовать класс ".last" в css для удаления поля из последнего элемента.

<body>
  <h1>This is the heading</h1>
  <p>This is a paragraph</p>
  <h1>Here another heading</h1>
  <div class="last">This is a footer</div>
</body>
div { margin-bottom: 1em; }
p { margin-bottom: 1em; }
h1 { margin-bottom: 1em; }
.last {margin-bottom: 0; }

В вашем примере, однако, это, вероятно, не так применимо, поскольку div нижнего колонтитула скорее всего будет иметь собственный класс и конкретный стиль. Тем не менее подход ".last", который я использовал, работает для меня, когда у меня есть несколько одинаковых элементов один за другим (абзацы, а что нет). Конечно, я вишневый выбрал технику из рамки "Элементы" CSS.

Ответ 2

С помощью продвинутых селекторов CSS 2 возможно другое решение, которое не будет полагаться на класс last для представления информации о макете в HTML.

В решении используются смежные селектора. К сожалению, MSIE 6 еще не поддерживает его, поэтому нежелание использовать его понятно.

h1 {
    margin: 0 0 1em;
}

div, p, p + h1, div + h1 {
    margin: 1em 0 0;
}

Таким образом, первый h1 не будет иметь верхнего поля, а любой h1, который сразу же следует за абзацем, или поле имеет верхнее поле.

Ответ 3

Если вам нужно некоторое пространство вокруг элемента, дайте ему поле. Это означает, что в этом случае не просто дайте <h1> нижнему краю, но дайте <p> верхнему краю.

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

h1, p { margin: 1em; }

<h1>...</h1>
<p>...</p>

... приведет к 1-му пространству между заголовком и абзацем.

Ответ 4

Это будет частично зависеть от особенностей того, для чего вы разрабатываете, но в этом, например, типичном блочном индексе есть своего рода грубая иерархия:

  • У вас будет один нижний колонтитул на странице.
  • У вас будет один заголовок для каждой записи.
  • У вас будет n абзацев на запись.

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

Это эскиз эскизов. То, как вы в конечном итоге назначаете свое дополнение, полностью зависит от вас, но если вы приблизитесь к нему с восходящей перспективы, вы, вероятно, будете видеть меньше сюрпризов, когда вы подберете first наиболее распространенные/обильные элементы и затем later менее распространенные.

Ответ 5

То, что Джим делает, - это ключ. Поля разрушаются между элементами, они не являются аддитивными. Если вы хотите обеспечить, чтобы было поле 1em выше и ниже абзацев и заголовков, и что над заголовком и над нижним колонтитусом имеется 1-й край, тогда ваш css должен отражать это.

Учитывая эту разметку (я добавил заголовок и поместил идентификаторы в верхний/нижний колонтитул):

<body>
  <div id="header"></div>
  <h1>This is the heading</h1>
  <p>This is a paragraph</p>
  <h1>Here another heading</h1>
  <div id="footer">This is a footer</div>
</body>

Вы должны использовать этот css:

#header {
  margin-bottom: 1em;
}

#footer {
  margin-top: 1em;
}

h1, p {
  margin: 1em 0;
}

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

Ответ 6

Я относительный новичок, но мое собственное решение для того, что, как я думаю, мы с вами придумали (изменение полей для одного тега может разобраться в расстоянии в одной части сайта, только чтобы нарушить ранее хороший интервал в другом месте?) теперь выделяет равную маржу сверху и снизу для всех тегов. Вам может потребоваться больше места выше и ниже H1, чем для H3 или ap, но в целом я думаю, что страницы выглядят хорошо с равными пробелами выше и ниже любого текста, поэтому это решение работает хорошо для меня и соответствует вашим "простым" эмпирическое правило тоже, надеюсь!

Ответ 7

Вот как это должно быть сделано:

body > * {
    margin-bottom: 1em;
}
body > *:last-child {
    margin-bottom: 0;
}

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

Единственный раз, когда это не будет работать, - это когда последний ребенок не является рендерингом. В этой ситуации вы можете рассмотреть возможность применения margin-bottom:0;, используя класс вашего последнего видимого дочернего элемента.

Ответ 8

Я с тобой согласен, что первый вариант лучше. Это вообще то, что я люблю делать. Тем не менее, есть аргумент, который следует указать, чтобы указать маркер для каждого из этих элементов и обнулить его, если вы не хотите его применять, поскольку браузеры обрабатывают поля по-разному. <p> (и, как мне кажется, тег <h1 > ), как правило, имеют значения по умолчанию, заданные браузером, если они не указаны.

Ответ 9

Я только что использовал первого ребенка и последнего ребенка. Так, например, в простом CSS:

h1{
    margin-top:10px;
    margin-bottom:10px;
}
h1:first-child{
    margin-top:0px;
}
p{
    margin:10px;
}
p:first-child{
    margin-top:0px;
}
p:last-child{
    margin-bottom:0px;
}

Это основной пример, но вы можете применить его к большему количеству элементов, и структура лучше, если использовать SASS, LESS и т.д.:)