身体元素没有边距,但孩子的边距会影响身体的边距[重复]

Posted

技术标签:

【中文标题】身体元素没有边距,但孩子的边距会影响身体的边距[重复]【英文标题】:Body element has no margin but children's margin affects body's margin [duplicate] 【发布时间】:2019-11-05 21:38:57 【问题描述】:
    正文有边距:0 p 标签有 margin-top: 100px;

为什么p标签会影响body的margin-top?

我预计 margin-top:100px 只会影响 p 标签。

/////////////////////////////////////// ////////

我想知道为什么我应该使用 padding-top 而不是 margin-top?

边距在元素周围创造额外的空间。相比之下,填充在元素内创建了额外的空间。

在这种情况下,p 标签位于正文中,因此边距和内边距应该看起来相同

https://stackblitz.com/edit/react-lktg4q?file=style.css

html, body 
  margin: 0;
  height: 100%;


h1, p 
  font-family: Lato;
  margin: 0;
  margin-top:100px;


#root 
  background: blue;
  height: 100vh;

      <div>
        <Hello name=this.state.name />
        <p>
          Start editing to see some magic happen :)
        </p>
      </div>

【问题讨论】:

如您所见,您已为h1p 应用了margin-top 如果你想要的只是顶部保持蓝色,请将 margin-top 替换为 padding-top 据我了解,您需要通过身体的蓝色。为此,您需要申请padding-top 这是H1 margin-top的效果,你可以将margin-top替换为padding-top 【参考方案1】:

应用padding-top 而不是margin-top

html,
body 
  margin: 0;
  height: 100%;


h1,
p 
  font-family: Lato;
  margin: 0;
  padding-top: 100px;


#root 
  background: blue;
  height: 100vh;
<div id="root">
  <div>
    <h1>Hello React!</h1>
    <p>Start editing to see some magic happen :)</p>
  </div>
</div>

【讨论】:

【参考方案2】:

我已经更新了你的代码。

StackBlitz

【讨论】:

如果 OP 也想要 margin-top:100pxh1 怎么办? 我想知道为什么要使用 padding-top 而不是 margin-top? 您应该在此答案中添加更多内容,而不是单个 URL。如果 StackBlitz 示例被删除,此答案将失效。【参考方案3】:

看看这个,

#root 
  background: blue;
  height: 100vh;

我可以说你想要你的身体的背景颜色,因为#root 是父元素并且没有元素可以成为它的父元素,你可以将#root css 添加到你的html, body css ,

html, body 
  margin: 0;
  height: 100vh;
  background: blue;


h1, p 
  font-family: Lato;
  margin: 0;
  margin-top:100px;

现在来到页面上的滚动,滚动是因为margin-top:100px。您可以通过两种方式解决此问题。

第一种方式,

如果margin-top:100px 是整个应用程序中的固定布局,那么

html, body 
  margin: 0;
  height: calc(100vh-100px); //minus your margin from viewport height will eliminate scroll
  background: blue;
 

第二种方式,

margin-top 替换为padding-top,因为填充包含在元素高度中,而边距不包含。

h1, p 
  font-family: Lato;
  margin: 0;
  padding-top:100px;

【讨论】:

【参考方案4】:

这就是margin collapsing的效果。根据那个 MDN 页面:

父母和第一个/最后一个孩子

如果没有边框、内边距、内联部分、创建的块格式上下文或将块的上边距与其第一个子块的上边距分开的间隙;或者没有边框、填充、内联内容、高度、最小高度或最大高度来将块的边距底部与其最后一个子块的边距底部分开,然后这些边距折叠。折叠的边距最终在父级之外。

有很多方法可以尝试解决它。但是理解这个概念是实现它的一步。

在您的情况下,正文中第一个元素的边距(即h1)会影响正文的边距。如果您希望在第一个 h1 上没有边距,您可以添加此 (see it on this jsfiddle):

h1:first-child 
  margin-top: 0;

假设正文中的第一个元素是h1

【讨论】:

补充阅读:bitsofco.de/collapsible-margins

以上是关于身体元素没有边距,但孩子的边距会影响身体的边距[重复]的主要内容,如果未能解决你的问题,请参考以下文章

元素边距推送父元素[重复]

边距引导网格问题

孩子与其父母之间的边距顶部[重复]

RecyclerView 中最后一个子项的边距/填充

子元素的边距[重复]

CSS:仅在边距内的背景颜色