CSS中的边距和填充有什么区别?

What is the difference between margin and padding in CSS?

提问人:Alex Angas 提问时间:2/3/2010 最后编辑:TylerHAlex Angas 更新时间:11/7/2023 访问量:989854

问:

和在CSS中有什么区别?什么时候应该使用其中之一?marginpadding

CSS 填充 边距

评论


答:

1579赞 John Boker 2/3/2010 #1

边距位于块元素的外侧,而填充位于内侧。

  • 使用边距将块与其外部的事物分开
  • 使用填充将内容从块的边缘移开。

enter image description here

评论

13赞 p3nchan 7/16/2015
这里有一个很好的做法:使用红色实心边框检查填充和边距。有时,我们可能会搞砸一些东西,比如 ,它包含一些文本,周围有填充和边距。使用此技巧来检查我们可以单击多少空间。<a>
19赞 alex 2/3/2010 #2

需要注意的一件事是,当自动折叠边距惹恼您时(并且您没有在元素上使用背景颜色),使用填充会更容易。

35赞 pixeltocode 2/3/2010 #3

关于边距的问题是,您无需担心元素的宽度。

就像当你给一些东西时,你必须将元素的宽度减少 20px 以保持“适合”,并且不会打扰它周围的其他元素。{padding: 10px;}

因此,我通常首先使用填充来获取所有内容,然后使用边距进行细微调整。packed

另一件需要注意的事情是,填充在不同的浏览器上更加一致,IE不能很好地处理负边距。

35赞 Frank Schwieterman 2/9/2010 #4

以下是一些 HTML,演示了如何影响可点击性和背景填充。对象接收到其填充的单击,但单击对象边距区域会转到其父项。paddingmargin

$(".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赞 Frank Schwieterman 10/13/2012
您可以在 JSFIDDLE 上运行类似的代码: jsfiddle.net/fschwiet/y74Nz/3
622赞 Scott 5/5/2011 #5

我见过的最好的用例子、图表,甚至“自己试一试”的观点来解释这一点。

我认为下图可以立即直观地了解差异。

enter image description here

要记住的一件事是,符合标准的浏览器(IE 怪癖是一个例外)仅将内容部分呈现为给定的宽度,因此在布局计算中要跟踪这一点。另请注意,在 Bootstrap 3 的支持下,边框框在某种程度上卷土重来

评论

6赞 JP Hellemons 10/10/2012
w3.org/TR/CSS2/box.html#box-dimensions 和图片来自 W3 w3.org/TR/CSS2/images/boxdim.png
1801赞 7 revs, 6 users 47%Black #6

填充和边距之间最大的区别是垂直边距会自动折叠,而填充则不会。

考虑两个元素,一个在另一个之上,每个元素的填充为 。此填充被视为元素的一部分,并始终保留。1em

您将最终获得第一个元素的内容,然后是第一个元素的填充,然后是第二个元素的填充,然后是第二个元素的内容。

因此,这两个元素的内容最终将分开。2em

现在将该填充替换为边距。边距被视为在元素之外,相邻项的边距将重叠。1em

在第二个示例中,您将得到第一个元素的内容,后跟组合边距,然后是第二个元素的内容。所以这两个元素的内容只是分开的。1em1em

当您知道要说元素周围的间距时,无论它旁边是什么元素,这都非常有用。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>

默认情况下,我在任何地方都使用边距,除非我有边框或背景并希望增加该可见框内的空间。

评论

61赞 Pete B 11/8/2013
+1 在设置段落、标题和列表的排版和短序列样式时,由于相邻的边距折叠行为,几乎总是最好用边距间隔元素。
25赞 Marcos Pereira 12/18/2014
为什么垂直边距会塌陷,而水平边际不会?这可能会让很多人感到困惑
23赞 Mike 2/17/2015
只有块元素的垂直边距才会折叠。对于内联块元素,边距在垂直和水平方向上均相加。因此,我不确定水平边距不会在块元素上折叠是否是一个问题,因为它们无论如何都会填充它们的容器。
7赞 thomasrutter 4/13/2015
“为什么垂直边距会折叠,而水平边距不会?” 没有机制可以在不使用浮点数的情况下将块元素并排放置 - 浮点数的边距无论如何都不会折叠(即使是垂直的)或绝对定位,其中显然没有折叠,或者内联块,它使用不同的模型,它被认为是内联和内容(空格, text) 是重要的,或者其他东西,如表格、弹性框、列,其中列之间的间隙具有特殊行为。因此,简而言之,即使可能,也无法使用水平边距折叠
12赞 Jomar Sevillejo 11/9/2015
此外,您应该注意,填充包含在元素的总宽度/高度中,当与元素一起使用时,如果有,则总宽度仍将为 100px,但内容区域会减少 20px,这与填充在计算内容宽度时是分开的,这使得您的总宽度在 content-box 中为 120px;box-sizing: border-box;width: 100px; padding-left: 20px;box-sizing: content-box;
92赞 Touhid Rahman 5/21/2013 #7

边距填充

  1. 边距在元素中用于在该元素与页面的其他元素之间创建距离。其中填充用于在元素的内容和边框之间创建距离。

  2. 边距不是元素的一部分,而填充是元素的一部分。

请参考以下从边距与填充 - CSS 属性中提取的图像

Margin vs Padding

评论

0赞 nicodemus13 5/15/2014
引用边框,而不是相当模糊的“边距在块元素的外部,而填充在内部”。外部/内部表示静态位置,而不是影响包含元素的大小。这个答案为我澄清了这一点。
133赞 stvnrynlds 12/17/2013 #8

你的问题有更多的技术解释,但如果你想要一种方法来考虑边距和填充,这个类比可能会有所帮助。

将块元素想象成挂在墙上的相框:

  • 照片就是内容
  • 垫子就是填充物
  • 框架造型是边界
  • 墙就是视口
  • 两个帧之间的间距是边距

考虑到这一点,一个好的经验法则是,当您想要将一个元素与墙上的其他元素间隔开来时,使用边距,并在调整元素本身的外观时使用填充。边距不会改变元素的大小,但填充会使元素变大1.


1 您可以使用 box-sizing 属性更改此行为。

评论

1赞 vapcguy 3/3/2015
实际上,我不同意“缩小内容空间”。这是一个带有 2 个框的小提琴,如果我继续填充相同的内容并添加“活动”,然后在悬停时添加“停用”,那么我是否使用 .它仍然会扩大盒子。我必须将填充最大化到框可以扩展到的最长长度,然后通过反复试验为进入框的其他单词想出一个匹配的组合,使每个单词保持相同的宽度:jsfiddle.net/navyjax2/ngzqqjahbox-sizing: border-boxbox-sizing
3赞 stvnrynlds 5/14/2015
嘿 vapcguy,感谢您的输入。当为元素声明宽度或高度时,我的说法通常是正确的,而具有未声明尺寸的元素实际上不受(请参阅:jsfiddle.net/8yravLmL/1)的影响。我会让我的答案更加细致入微,以避免混淆。border-box
1赞 Wolf 2/22/2023
这个比喻很好,但当你说两帧之间的距离是边距时,我认为这不太正确。距离由各自边距的总和决定。查看 jsfiddle.net/9g0eL1mn/4
0赞 stvnrynlds 12/16/2023
是的!这是一个类比,总有例外。即使在您的示例中,如果您使用 s 而不是 s,垂直边距也会折叠,并且您的定义将不正确。它不会是各自利润的总和,而是两个利润中较大的一个。最初的问题询问了边距和填充之间的区别,从单个元素的角度来看,我认为我的答案即使不是详尽无遗的,也很有用。divspan
31赞 Mohammad Golahi 8/1/2014 #9

边距清除元素周围的区域(边框外),而填充清除元素内容周围的区域(边框内)。

enter image description here

这意味着您的元素不知道其外部边距,因此,如果您正在开发动态 Web 控件,我建议尽可能使用填充与边距。

请注意,有时您必须使用保证金。

评论

2赞 Black 8/19/2020
“请注意,有时您必须使用保证金”这就是问题所在。这些时间是什么时候?
18赞 John 12/30/2015 #10

高级边距与填充解释

不宜用于将元素中的内容间隔开来;您必须改用 on the child 元素。较旧的浏览器(如 Internet Explorer)误解了盒子模型,除非在 Internet Explorer 4 中完美运行。paddingmarginmargin

使用时有两种例外情况:padding

  1. 它应用于不能包含任何子元素(如输入元素)的内联元素。

  2. 您正在补偿一个高度杂乱的浏览器错误,供应商*咳嗽* Mozilla *咳嗽* 拒绝修复,并且确定(在某种程度上,您与 W3C 和 WHATWG 编辑定期交流)您必须有一个有效的解决方案,并且该解决方案不会影响您正在补偿的错误以外的任何内容的样式。

当你有一个 100% 的宽度元素时,你有效地得到了 .由于没有添加到元素中,因此当您使用 on 而不是直接在元素上使用时,它不会导致意外的布局问题。padding: 50px;width: calc(100% + 100px);marginwidthmarginchild elementspadding

因此,如果您执行这两件事之一,请不要向元素添加填充,而是向其直接子元素添加填充,以确保您将在所有浏览器中获得预期的行为。

评论

0赞 Alex Angas 1/18/2016
有趣!你有那个供应商错误的链接吗?
1赞 John 2/22/2016
@AlexAngas希望维基百科对你有用吗?en.wikipedia.org/wiki/Internet_Explorer_box_model_bug
48赞 MAChitgarha 6/14/2016 #11

很高兴知道 和 之间的区别。以下是一些区别:marginpadding

  • 边距是元素的外部空间,而填充是元素的内部空间

  • 边距是元素边框外的空间,而填充是元素边框内的空间。

  • Margin 接受 auto: 的值,但不能将 padding 设置为 auto。margin: auto

    提示:您可以使用该技巧使元素在其父级内居中(甚至垂直)。例如,请参阅我的其他答案

  • 边距可以设置为任意数字,但填充必须为非负数。

  • 当您设置元素样式时,填充也会受到影响(例如背景颜色),但边距不会受到影响。

58赞 Pulkit Anchalia 11/3/2016 #12

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

不同部分的说明:

  • 内容 - 显示文本和图像的框的内容

  • 填充 - 清除内容周围的区域。填充是透明的

  • 边框 - 围绕填充和内容的边框

  • 边距 - 清除边界外的区域。边距是透明的

Illustration of CSS box model

实时示例(通过更改值进行操作):https://www.w3schools.com/css/tryit.asp?filename=trycss_boxmodel

评论

0赞 TylerH 11/7/2023
这重复了 stackoverflow.com/questions/2189452/...以及其他答案,并且是仅链接的内容。
14赞 Alireza 5/24/2017 #13

首先,让我们看看有什么区别,每个职责是什么:

1) 边距 CSS 边距

属性用于在元素周围生成空间。
margin 属性设置 边境。使用 CSS,您可以完全控制边距。
有 用于设置元素每侧边距的 CSS 属性 (上、右、下和左)。


2) 填充

CSS 填充属性用于在内容周围生成空间。
填充清除内容周围的区域(边框内) 一个元素。
使用 CSS,您可以完全控制填充。那里 是用于为元素的每一侧设置填充的 CSS 属性 (上、右、下和左)。

因此,简单地说,边距是元素周围的空间,而填充是元素一部分的内容周围的空间。

Margin and Padding

这张来自 codemancers 的图片显示了边距和边框是如何被分割的,以及边框和内容框是如何使其不同的。

此外,他们定义每个部分如下:

  • 内容 - 这定义了实际内容(如文本、图像或其他元素)所在的框的内容区域。
  • 填充 - 这将清除其包含框中的主要内容。
  • 边框 - 这围绕着内容和填充。
  • 边距 - 此区域定义了一个透明空间,将其与其他元素分隔开来。

评论

1赞 Alex Angas 6/2/2017
这个答案似乎是从其他地方复制和粘贴的。来自“codemancers”的包含链接与答案无关。
2赞 Alireza 6/2/2017
亚历克斯,突出显示的答案中的图片和部分内容来自代码术士,请在发表评论和投票之前确定这些事情
10赞 Mostafa Osama 3/3/2018 #14

边缘

边距通常用于在元素本身及其周围环境之间创建空间。

例如,我在构建导航栏时使用它,使其粘在屏幕边缘并且没有白色间隙。

填充

我通常在边框内有一个元素或类似的东西时使用,我想减小它的大小,但当时我想保持它周围其他元素之间的距离或边距。<div>

简而言之,这是情境性的;这取决于你想做什么。

11赞 Bjamse 3/24/2018 #15

我总是使用这个原则:

box model image

这是 Firefox 中 inspect 元素功能的盒子模型。它像洋葱一样工作:

  • 您的内容位于中间。
  • 填充是内容与标记边缘之间的空间 里面。
  • 边框及其规格
  • 边距是标记周围的空间。

因此,更大的边距将在包含内容的框周围腾出更多空间。

较大的填充将增加您的内容与其所在的框之间的空间。

如果框设置为特定值,它们都不会增加或减少框的大小。

-3赞 saurabhgoyal795 3/29/2018 #16

边距在框外,填充在框内

评论

0赞 TylerH 4/5/2018
这并不能回答这个问题。
0赞 saurabhgoyal795 4/6/2018
@TylerH他问起这件事???(何时使用边距,何时使用填充?
0赞 TylerH 4/6/2018
是的,他就是这么问的。这如何回答何时使用每个?