子元素上的边距移动父元素

Rob*_*nik 387 css xhtml nested margin

我有div()包含另一个div(孩子).Parent是body没有特定CSS样式的第一个元素.当我设置

.child
{
    margin-top: 10px;
}
Run Code Online (Sandbox Code Playgroud)

最终的结果是我的孩子的顶部仍然与父母对齐.我的父母向下移动10px,而不是让孩子向下移动10px.

我的目标DOCTYPEXHTML Transitional.

我在这里错过了什么?

编辑1
我的父母需要有严格定义的尺寸,因为它的背景必须从上到下显示在它下面(像素完美).因此,设置垂直边距是不行的.

编辑2
此行为在FF,IE和CR上是相同的.

vdb*_*oor 460

在DIV中具有边距的Child元素中找到替代方法您还可以添加:

.parent { overflow: auto; }
Run Code Online (Sandbox Code Playgroud)

要么:

.parent { overflow: hidden; }
Run Code Online (Sandbox Code Playgroud)

这可以防止边距崩溃.边框和填充也是如此.因此,您还可以使用以下内容来防止上边距崩溃:

.parent {
    padding-top: 1px;
    margin-top: -1px;
}
Run Code Online (Sandbox Code Playgroud)

按流行要求更新: 折叠边距的重点是处理文本内容.例如:

<style type="text/css">
    h1, h2, p, ul {
        margin-top: 1em;
        margin-bottom: 1em;
    }
</style>

<h1>Title!</h1>
<div class="text">
    <h2>Title!</h2>
    <p>Paragraph</p>
</div>
<div class="text">
    <h2>Title!</h2>
    <p>Paragraph</p>
    <ul>
        <li>list item</li>
    </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

因为浏览器会折叠边距,所以文本会按照您的预期显示,并且<div>包装器标签不会影响边距.每个元素确保它周围有间距,但间距不会加倍.边缘<h2>并且<p>不会相加,而是相互滑动(它们会崩溃).对于<p><ul>元素也是如此.

可悲的是,有了现代设计,当你明确地想要一个容器时,这个想法会让你感到害怕.这在CSS中称为新的块格式化上下文.这个overflow或边缘技巧会给你这个.

  • 我想知道为什么这对任何人都有好处.这个"特征"的意图是什么. (39认同)
  • 你能举个例子吗?假设我有div作为背景.有h1,h2和p.现在我想将h1向下移动一点,这样它就不会接近背景div的上边缘,但是不会扩展h1元素本身.我想加上上边距.这是显而易见的.但是当我这样做时,光荣的背景决定随之而来.这是一个功能.这有助于h1,h2和p之间的间距.帮我看看你在说什么. (7认同)
  • @MuhammadUmer,这与文本内容有关。例如,一系列`&lt;h2&gt;`、`&lt;p&gt;`、`&lt;ul&gt;` 这样就不会出现奇怪的间隙或“双”边距。 (4认同)
  • 我希望它能增加更多的利润.在我的发展生涯中,崩溃的利润率是迄今为止最烦人的事情.如果我把2个div放在一起,边距为:margin:5px 10px;`id期望2个div从顶部开始5 px,20px从顶部开始不是5 px而它们之间是10px.如果我想在他们之间10 px id指定`margin:5px 5px;`.老实说,我希望有一个根本规则可以阻止所有边缘崩溃.我讨厌我必须将纸张上的边距加倍,让他们真正做到我想要的屏幕上的东西.这个最重要的事情......真是一场灾难 (3认同)
  • 这花了我半天时间,这是我认为很好的解释https://www.smashingmagazine.com/2019/07/margins-in-css/#parent-first-last-child-element。`display: flow-root` 看起来像是另一个选项。 (3认同)

Ben*_*mes 47

这是正常行为(至少在浏览器实现中).保证金不会影响孩子相对于父母的位置,除非父母有填充,在这种情况下,大多数浏览器会将孩子的边距添加到父母的填充中.

要获得所需的行为,您需要:

.child {
    margin-top: 0;
}

.parent {
    padding-top: 10px;
}
Run Code Online (Sandbox Code Playgroud)

  • 向父项添加边框也会影响子项的边距,请尝试`.parent {border:solid 1px;}` (3认同)
  • 谢啦.我在规范中找到了它:http://www.w3.org/TR/CSS2/box.html (3认同)
  • 就像费耶拉所说的那样 - 如果需要高利润,这不是真正的解决方案.vdboor的答案更适合. (3认同)
  • 边距不会添加到填充中......它单独应用。但视觉效果是一样的。 (2认同)
  • 如果您想要最高利润怎么办……?不是真正的解决方案。 (2认同)

Eja*_*jaz 19

虽然所有的答案都解决了这个问题,但它们会带来权衡/调整/妥协等

  • floats,你必须浮动元素
  • border-top,这会向父母推送至少1px向下,然后应该通过-1px向父元素本身引入边距来调整.当父母已经拥有margin-top相对单位时,这可能会产生问题.
  • padding-top,与使用相同的效果 border-top
  • overflow: hidden,当父级应显示溢出内容时,不能使用,如下拉菜单
  • overflow: auto,为父元素引入滚动条,该元素具有(有意)溢出的内容(如阴影或工具提示的三角形)

可以使用CSS3伪元素解决此问题,如下所示

.parent::before {
  clear: both;
  content: "";
  display: table;
  margin-top: -1px;
  height: 0;
}
Run Code Online (Sandbox Code Playgroud)

https://jsfiddle.net/hLgbyax5/1/

  • 实际上,"margin-top:-1px"和"height:0"似乎都是不必要的.在Chrome中测试过.但最佳解决方案. (3认同)

小智 12

display:inline-block为child元素添加样式


Geo*_*DRA 8

父元素不能为空,至少放在&nbsp;子元素之前.

  • 是的,有时只有这可以帮助...或者更好地输入这样的内容:**&lt;div style='width:0;height:0'&gt; &lt;/div&gt;** (3认同)

erd*_*ter 6

这对我有用

.parent {
padding-top: 1px;
margin-top: -1px;
}

.child {
margin-top:260px;
}
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/97fzwuxh/


小智 5

为了防止“div parent”使用“div child”的边距:
在父级中使用这些css:

  • 漂浮
  • 填充
  • 边界
  • 溢出