Когда использовать CSS и отступы в CSS [закрыто]

2357

При написании CSS, есть ли конкретное правило или руководство, которое следует использовать при принятии решения, когда использовать marginи когда использовать padding?

Алекс Ангас
источник
Используйте paddingна <a>тегах , если вы хотите увеличить фокусируемую область .
Джош Хабдас

Ответы:

1586

TL; DR: по умолчанию я использую поле везде, кроме случаев, когда у меня есть рамка или фон, и я хочу увеличить пространство внутри этого видимого поля.

Для меня самое большое различие между отступом и полем состоит в том, что вертикальные поля автоматически сжимаются, а отступы - нет.

Рассмотрим два элемента, один над другим, каждый с отступом 1em. Этот отступ считается частью элемента и всегда сохраняется.

Таким образом, вы получите содержимое первого элемента, за которым следует заполнение первого элемента, затем дополнение второго, а затем содержимое второго элемента.

Таким образом, содержание двух элементов в конечном итоге будет 2emразделено.

Теперь замените этот отступ с полем 1em. Поля считаются находящимися вне элемента, а поля соседних элементов будут перекрываться.

Таким образом, в этом примере вы получите содержимое первого элемента, за которым следует 1emобъединенное поле, за которым следует содержимое второго элемента. Таким образом, содержание этих двух элементов только 1emотдельно.

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

Два других больших различия заключаются в том, что отступы включены в область щелчка и цвет фона / изображения, но не в поле.

div.box > div { height: 50px; width: 50px; border: 1px solid black; text-align: center; }
div.padding > div { padding-top: 20px; }
div.margin > div { margin-top: 20px; }
<h3>Default</h3>
<div class="box">
  <div>A</div>
  <div>B</div>
  <div>C</div>
</div>

<h3>padding-top: 20px</h3>
<div class="box padding">
  <div>A</div>
  <div>B</div>
  <div>C</div>
</div>

<h3>margin-top: 20px; </h3>
<div class="box margin">
  <div>A</div>
  <div>B</div>
  <div>C</div>
</div>

черный
источник
51
+1 При оформлении типографики и последовательностей абзацев, заголовков и списков почти всегда лучше размещать элементы с полями из-за смежного поведения коллапса.
Пит Б
17
Почему вертикальные поля разрушаются, а горизонтальные - нет? Это может сбить с толку многих людей
Маркос Перейра
16
Вертикальные поля сворачиваются только для блочных элементов. Для встроенных блочных элементов поля добавляются как вертикально, так и горизонтально. Поэтому я не уверен, что проблема заключается в том, что горизонтальные поля не разрушаются на элементах блока, так как они в любом случае заполняют свой контейнер.
Майк
2
«Почему вертикальные поля разрушаются, а горизонтальные - нет?» нет механизма для того, чтобы элементы блока располагались рядом друг с другом без использования поплавков - поля которых никогда не сжимаются (даже по вертикали) или абсолютного позиционирования, где явно нет свертывания, или встроенного блока, который использует другую модель, в которой он рассматривается inline и content (пробелы, текст) важны, или другие вещи, такие как таблицы, flexbox, столбцы, где разрыв между столбцами имеет особое поведение. Таким образом, короче говоря, нет места, где можно было бы использовать горизонтальное разрушение полей, даже если это возможно
thomasrutter
5
Также вы должны принять к сведению, что заполнение включено в общую ширину / высоту элемента, когда используется вместе с ним, box-sizing: border-box;поэтому, если у вас есть width: 100px; padding-left: 20px;общая ширина, все равно будет 100px, но область для содержимого будет уменьшена на 20px, в отличие от того, box-sizing: content-box;где padding является отдельным при вычислении ширины содержимого что делает вашу общую ширину 120px в поле содержимого;
Джомар Севильо
1495

Поля находятся снаружи элементов блока, а отступы - внутри.

  • Используйте поле, чтобы отделить блок от вещей за его пределами
  • Используйте отступы, чтобы отодвинуть содержимое от краев блока.

введите описание изображения здесь

Джон Бокер
источник
63
Тем не менее, правильный ответ - @pavon ниже. поля смежных элементов перекрываются, тогда как отступы не перекрываются. т.е. полное разделениеpadding(A) + padding(B) + max(margin(A), margin(B))
некромант
9
Вот хорошая практика: используйте сплошную красную рамку, чтобы проверить отступы и поля. Иногда мы можем испортить такие вещи, как <a>, например , текст, окруженный отступами и полями. Используйте этот трюк, чтобы проверить, сколько места мы можем щелкнуть.
p3nchan
589

Лучшее, что я видел, объясняя это примерами, диаграммами и даже представлением «попробуй сам», здесь .

Диаграмма ниже, я думаю, дает мгновенное визуальное понимание разницы.

введите описание изображения здесь

Следует помнить одну вещь: совместимые со стандартами браузеры ( исключение IE - исключение ) отображают только часть содержимого с заданной шириной, поэтому следите за этим в расчетах компоновки. Также обратите внимание на то, что в рамочной рамке видится возвращение с поддержкой Bootstrap 3 .

Скотт
источник
3
w3.org/TR/CSS2/box.html#box-dimensions и изображение с w3 w3.org/TR/CSS2/images/boxdim.png
JP Hellemons
91

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

Сравните элементы блока с картинами, висящими на стене:

  • Окно браузера похоже на стену.
  • Содержание так же , как на фотографии.
  • Маржа точно так же как пространство стены между фреймами картинами.
  • Обивка точно так же как циновки вокруг фотографии.
  • Граница точно так же как границы на раме.

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

1 Эта модель по умолчанию может быть изменена с помощью box-sizingатрибута .

stvnrynlds
источник
На самом деле я не согласен с тем, box-sizing: border-boxчтобы сделать «пространство для контента меньше». Вот скрипка с 2 полями, где, если я продолжал заполнять то же самое и добавлял «Active», а затем «Deactivate» при наведении, это не имело значения, если бы я использовал box-sizing. Это все равно расширит коробку. Мне нужно было максимально увеличить отступ до самого длинного поля, а затем использовать метод проб и ошибок, чтобы найти подходящую комбинацию для других слов, входящих
vapcguy
3
Эй, vapcguy, спасибо за ваш вклад. Мое утверждение обычно верно, когда для элемента объявлена ​​ширина или высота, в то время как на элемент с необъявленными размерами это не влияет border-box(см .: jsfiddle.net/8yravLmL/1 ). Я сделаю свой ответ более нюансированным, чтобы избежать путаницы.
stvnrynlds
86

MARGIN против PADDING :

  1. Маржа используется в элементе для создания расстояния между этим элементом и другими элементами страницы. Где отступ используется для создания расстояния между контентом и границей элемента.

  2. Margin не является частью элемента, где padding является частью элемента.

Пожалуйста, обратитесь к изображению ниже, извлеченному из Margin Vs Padding - CSS Properties

Margin vs Padding

Тухид Рахман
источник
Ссылка на границу, а не довольно расплывчатое: «Маржа находится снаружи элементов блока, а отступ - внутри». снаружи / внутри чего? И снаружи / внутри предполагает статическое положение, а не то, что это влияет на размер содержащего элемента. Этот ответ прояснил это для меня.
nicodemus13
51

С https://www.w3schools.com/css/css_boxmodel.asp

Объяснение различных частей:

  • Содержимое - содержимое поля, в котором отображается текст и изображения.

  • Заполнение - очищает область вокруг содержимого. Прокладка прозрачная

  • Граница - граница, которая проходит вокруг отступов и содержимого

  • Маржа - очищает область за пределами границы. Поля прозрачные

Иллюстрация блочной модели CSS

Пример из жизни (поиграйте, изменив значения): https://www.w3schools.com/css/tryit.asp?filename=trycss_boxmodel

Pulkit Anchalia
источник
1
Спасибо. Одна картинка стоит тысячи слов!
Catbuilts
33

Вот некоторый HTML- код, который демонстрирует, как paddingи как marginвлияет кликабельность, так и фоновое заполнение Объект получает клики для своего отступа, но клики в области полей объекта переходят к его родителю.

$(".outer").click(function(e) {
  console.log("outer");
  e.stopPropagation();
});

$(".inner").click(function(e) {
  console.log("inner");
  e.stopPropagation();
});
.outer {
  padding: 10px;
  background: red;
}

.inner {
  margin: 10px;
  padding: 10px;
  background: blue;
  border: solid white 1px;
}
<script src="http://code.jquery.com/jquery-latest.js"></script>

<div class="outer">
  <div class="inner" style="position:relative; height:0px; width:0px">

  </div>
</div>

Фрэнк Швитерман
источник
1
Вы можете запустить подобный код на jsfiddle: jsfiddle.net/fschwiet/y74Nz/3
Фрэнк Швитерман,
31

Суть полей в том, что вам не нужно беспокоиться о ширине элемента.

Например , когда вы даете что - то {padding: 10px;}, вы должны уменьшить ширину элемента на 20px , чтобы сохранить " подгонку » и не мешать другим элементам вокруг него.

Поэтому я обычно начинаю с использования набивок, чтобы получить всеpacked , а затем использую поля для незначительных изменений.

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

pixeltocode
источник
28

Поле очищает область вокруг элемента (вне границы), но отступ очищает область вокруг содержимого (внутри границы) элемента.

введите описание изображения здесь

это означает, что ваш элемент не знает о своих внешних полях, поэтому, если вы разрабатываете динамические веб-элементы управления, я рекомендую использовать отступы против margin, если вы можете.

обратите внимание, что иногда вы должны использовать маржу.

Мохаммад Голахи
источник
24

Хорошо знать разницу между marginи padding. Вот некоторые отличия:

  • Margin - это внешнее пространство элемента, а padding - это внутреннее пространство элемента.

  • Поля - это пространство за границей элемента, а отступы - это пространство внутри границы элемента.

  • Margin принимает значение auto:, margin: autoно вы не можете установить отступы на auto.

  • Для поля можно указать любое число, но отступы должны быть неотрицательными.

  • Когда вы создаете стиль элемента, это также влияет на отступы (например, цвет фона), но не на поля.

MAChitgarha
источник
18

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

Алекс
источник
15

Усовершенствованная маржа против объяснения

Неуместно использовать paddingдля размещения содержимого в элементе; вы должны использовать marginна дочерний элемент вместо этого. Старые браузеры, такие как Internet Explorer, неверно истолковали блочную модель, за исключением случаев, когда она использовалась, marginчто прекрасно работает в Internet Explorer 4 .

Есть два исключения при использовании padding является целесообразным использование:

  1. Он применяется к встроенному элементу, который не может содержать дочерние элементы, такие как элемент ввода.

  2. Вы компенсируете очень разнообразную ошибку браузера, которую поставщик * кашляет * Mozilla * кашель * отказывается исправлять и уверен (если вы регулярно проводите обмены с редакторами W3C и WHATWG), что у вас должно быть работающее решение и это решение не повлияет на стилизацию чего-либо другого, кроме ошибки, которую вы компенсируете.

Когда у вас есть элемент шириной 100%, padding: 50px;вы получаете эффект width: calc(100% + 100px);. Так marginкак не добавляется в widthэто не будет причиной неожиданных проблем компоновки при использовании marginна child elementsвместоpadding непосредственно на элементе.

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

Джон
источник
Интересно! У вас есть ссылка на эту ошибку поставщика?
Алекс Ангас
1
@AlexAngas Надеюсь, Википедия работает на вас? ru.wikipedia.org/wiki/Internet_Explorer_box_model_bug
Джон,
14

Сначала давайте посмотрим, каковы различия и какова каждая ответственность:

1) Margin

Свойства CSS CSS используются для создания пространства вокруг элементов.
Свойства поля устанавливают размер пустого пространства за пределами границы. С CSS у вас есть полный контроль над полями.
Существуют CSS-свойства для установки полей для каждой стороны элемента (сверху, справа, снизу и слева).


2) Заполнение

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

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

Маржа и отступы

Это изображение от codemancers показывает, как границы и границы становятся все вместе, и как рамки границ и поля контента делают их разными.

Также они определяют каждый раздел, как показано ниже:

  • содержание - это определяет область содержимого поля, в котором находится фактический контент, такой как текст, изображения или, возможно, другие элементы.
  • Заполнение - это очищает основной контент от содержащего его поля.
  • бордюр - это окружает как контент, так и отступы.
  • Маржа - эта область определяет прозрачное пространство, которое отделяет ее от других элементов.
Алиреза
источник
Этот ответ, похоже, скопирован и вставлен откуда-то еще. Включенная ссылка от "codemancers" не имеет ничего общего с ответом.
Алекс Ангас
2
Алекс, ПОС и часть из ответа , который выделен из codemancers является, пожалуйста , убедитесь , что о вещах , прежде чем оставить комментарий и проголосовать
Алирезу
8

Я всегда использую этот принцип:

изображение модели коробки

Это блочная модель из функции проверки элементов в Firefox. Это работает как лук:

  • Ваш контент находится посередине.
  • Отступы - это пространство между вашим контентом и краем тега, внутри которого оно находится.
  • Граница и ее характеристики
  • Поле - это пространство вокруг тега.

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

Увеличенный отступ увеличит пространство между вашим контентом и ящиком, в котором он находится.

Ни один из них не будет увеличивать или уменьшать размер поля, если для него установлено определенное значение.

Bjamse
источник
6

Прибыль

Маржа обычно используется для создания пространства между самим элементом и его окружением.

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

набивка

Я обычно использую, когда у меня есть элемент внутри границы, <div> или что-то подобное, и я хочу уменьшить его размер, но в то же время я хочу сохранить расстояние или поле между другими элементами вокруг него.

Итак, вкратце, это ситуативно; это зависит от того, что вы пытаетесь сделать.

Мостафа Усама
источник
1

Маржа находится за пределами поля, а отступы - внутри коробки.

saurabhgoyal795
источник
Это не отвечает на вопрос.
TylerH
@TylerH он спрашивал об этом только ??? (когда использовать margin и когда использовать padding?)
saurabhgoyal795
Да, это то, что он спросил. Как этот ответ, когда использовать каждый?
TylerH