Куда вы помещаете свои CSS-поля?[закрыто]
Вопрос
Когда вы хотите добавить пробел между элементами HTML (используя CSS), к какому элементу вы его прикрепляете?
Я регулярно попадаю в подобные ситуации:
<body>
<h1>This is the heading</h1>
<p>This is a paragraph</p>
<h1>Here's 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 }
Что меня интересует, так это вторичные факторы:
- Последовательность
- Применимость ко всем ситуациям
- Легкость / Простота
- Простота внесения изменений
Например:в данном конкретном случае я бы сказал, что первое решение лучше второго, поскольку оно проще;вы только прикрепляете margin-bottom к двум элементам в одном определении свойства.Тем не менее, я ищу решение более общего назначения.Каждый раз, когда я работаю с CSS, у меня возникает ощущение, что есть хорошее эмпирическое правило, которое нужно применять...но я не уверен, что это такое.У кого-нибудь есть веские аргументы?
Решение
Я обычно использую нижнее поле для элементов, когда хочу, чтобы у них было пространство перед следующим элементом, а затем использую класс ".last" в css, чтобы удалить поле из последнего элемента.
<body>
<h1>This is the heading</h1>
<p>This is a paragraph</p>
<h1>Here's 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-фреймворка "Elements".
Другие советы
Используя продвинутые селекторы CSS 2, было бы возможно другое решение, которое не зависит от класса last
чтобы ввести информацию о макете в HTML.
В решении используется смежные селекторы.К сожалению, MSIE 6 пока не поддерживает его, так что нежелание им пользоваться вполне объяснимо.
h1 {
margin: 0 0 1em;
}
div, p, p + h1, div + h1 {
margin: 1em 0 0;
}
Таким образом, первый h1
не будет иметь верхнего предела, в то время как любой h1
который следует непосредственно за абзацем или вставкой имеет верхнее поле.
Если вам нужно немного места вокруг элемента, выделите для него поле.Это означает, что в данном случае не стоит просто давать <h1>
нижний предел, но дает <p>
верхнее поле.
Помните, что когда два элемента расположены рядом по вертикали и между ними нет границы или отступа, их поля сворачиваются.Это означает, что учитывается только большее из двух полей - они не суммируются.Итак , это:
h1, p { margin: 1em; }
<h1>...</h1>
<p>...</p>
...это привело бы к появлению пробела в 1ем между заголовком и абзацем.
Отчасти это будет зависеть от специфики того, для чего вы разрабатываете, но в этих вещах есть своего рода грубая иерархия, скажем, в типичном индексе блога:
- У вас будет один нижний колонтитул на странице.
- У вас будет по одному заголовку на каждый запись.
- У вас будет n абзацев на запись.
Устанавливайте пробелы для своих абзацев, зная, что иногда они будут располагаться последовательно - вам нужно беспокоиться о том, как они будут выглядеть в виде серии.Оттуда отрегулируйте свои заголовки так, чтобы они учитывали границы между записями.Наконец, отрегулируйте расстояние между нижним колонтитулом и основной частью, чтобы нижняя часть страницы выглядела прилично.
Это миниатюрный набросок.Как вы в конечном итоге назначите заполнение, полностью зависит от вас, но если вы подойдете к этому с точки зрения "снизу вверх", вы, вероятно, увидите меньше сюрпризов по мере настройки Первый наиболее распространенные / обильные элементы, а затем позже менее распространенные из них.
Точка зрения, которую высказывает Джим, является ключевой.Поля между элементами сжимаются, они не являются аддитивными.Если вы хотите убедиться, что над и под абзацами и заголовками есть поле в 1 элемент, а также что под верхним и над нижним колонтитулами есть поле в 1 элемент, то ваш css должен отражать это.
Учитывая эту разметку (я добавил заголовок и разместил идентификаторы в верхнем / нижнем колонтитуле):
<body>
<div id="header"></div>
<h1>This is the heading</h1>
<p>This is a paragraph</p>
<h1>Here's 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;
}
Теперь порядок ваших элементов не имеет значения.Если вы используете два последовательных заголовка или начинаете страницу с абзаца вместо заголовка, она все равно будет отображаться с тем отступом, который вы сделали.
Я относительный новичок, но мое собственное решение проблемы, с которой, я думаю, столкнулись и вы, и я (изменение полей для одного тега может привести к увеличению интервала в одной части сайта, только чтобы нарушить ранее хороший интервал в другом месте?), Теперь заключается в том, чтобы выделить равные поля сверху и снизу для всех тегов.Возможно, вам захочется больше места над и под буквой H1, чем для буквы H3 или p, но в целом я думаю, что страницы хорошо смотрятся с равными пробелами над и под любым заданным фрагментом текста, так что это решение хорошо работает для меня и, надеюсь, соответствует вашему "простому эмпирическому правилу"!
Вот как это должно быть сделано:
body > * {
margin-bottom: 1em;
}
body > *:last-child {
margin-bottom: 0;
}
Теперь вам не нужно беспокоиться о том, какой элемент является первым, а какой последним, и вам не нужно всегда помещать специальный класс в ваш последний элемент.
Единственный раз, когда это не "сработает", - это когда последний дочерний элемент не отображается.В этой ситуации вы могли бы рассмотреть возможность подачи заявления margin-bottom:0;
использование класса для вашего последнего видимого дочернего элемента.
Я склонен согласиться с вами, что первый вариант лучше.Обычно это то, чем мне нравится заниматься.Однако есть аргумент, что вам следует указать поле для каждого из этих элементов и обнулить его, если вы не хотите его применять, поскольку все браузеры обрабатывают поля по-разному.У <p> (и, я думаю, у тега <h1> тоже) обычно будут поля по умолчанию, заданные браузером, если они не указаны.
Я только что использовал first-child и last-child.Так, например, в обычном 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 и т.д. :)