我有一个包含另一个
.child
{
margin-top: 10px;
}
最终结果是我的子元素顶部仍与父元素对齐,而不是子元素向下移动10像素,而是父元素向下移动了10像素。我的 DOCTYPE 设置为 XHTML Transitional。
我在这里错过了什么?
编辑1: 我的父元素需要有严格定义的尺寸,因为它有一个必须从顶部到底部显示的背景(完美像素)。 因此,在其上设置垂直边距是不可行的。
编辑2: 此行为在 FF、IE 和 CR 上都相同。
我有一个包含另一个
.child
{
margin-top: 10px;
}
最终结果是我的子元素顶部仍与父元素对齐,而不是子元素向下移动10像素,而是父元素向下移动了10像素。在 Child elements with margins within DIVs 找到了一个替代方案。你还可以添加:
.parent { overflow: auto; }
.parent { overflow: hidden; }
这可以防止边距折叠。边框和填充也具有相同的功能。 因此,您还可以使用以下内容来防止顶部边距折叠:
.parent {
padding-top: 1px;
margin-top: -1px;
}
2021更新:如果您愿意放弃对IE11的支持,您还可以使用新的CSS结构display: flow-root
。 有关块格式化上下文的完整详细信息,请参见MDN Web Docs。
按照普遍要求更新: 折叠边距的整个重点在于处理文本内容。例如:
h1, h2, p, ul {
margin-top: 1em;
margin-bottom: 1em;
outline: 1px dashed blue;
}
div { outline: 1px solid red; }
<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>
<div>
包装标签不影响外边距。每个元素都确保周围有间距,但不会重复计算间距。 <h2>
和 <p>
的外边距不会相加,而是互相滑动(它们会折叠)。 <p>
和 <ul>
元素也是如此。overflow
或 margin 技巧即可实现。<h2>
、<p>
、<ul>
标签就不会出现奇怪的间隙或“双倍”边距。 - vdboordiv
放在一起,使用 margin: 5px 10px;
,我期望这两个 div
之间有 20px 的距离,而不是只有 10px 。如果我想要它们之间有 10px 的距离,我会指定 margin: 5px 5px;
。我真的希望有一个根规则可以停止所有外边距的折叠。我讨厌我必须在纸上将边距的大小加倍,才能让它们在屏幕上做出我想要的效果。而这个顶部的东西... 真是一场灾难。 - JL Griffin这是正常行为(至少在浏览器实现中是如此)。除非父元素具有填充,否则margin不会影响子元素相对于其父元素的位置,大多数浏览器将子元素的margin添加到父元素的padding中。
要获得所需的行为,您需要:
.child {
margin-top: 0;
}
.parent {
padding-top: 10px;
}
.parent {border: solid 1px;}
。 - o.k.w虽然所有的答案都解决了问题,但它们都伴随着权衡/调整/妥协,例如:
floats
,您必须浮动元素border-top
,这会使父级元素向下至少1像素,然后应该通过向父元素本身引入-1px
外边距进行调整。当父元素已经具有相对单位的margin-top
时,这可能会创建问题。padding-top
,与使用border-top
具有相同的效果overflow: hidden
,不能用于需要显示溢出内容的父元素,例如下拉菜单overflow: auto
,为有意超出内容(如阴影或工具提示的三角形)的父元素引入滚动条可以通过使用CSS3伪元素来解决此问题,如下所示
.parent::before {
clear: both;
content: "";
display: table;
margin-top: -1px;
height: 0;
}
margin-top: -1px
和height: 0
似乎都是不必要的。但这是最好的解决方案。 - NinjaFart.parent:after...
来修改答案,使其适用于最后一个元素的底部边距。 - Ejaz将样式display:inline-block
添加到子元素
父元素不能是空的,至少要在子元素前加上
。
这是我用过的方法
.parent {
padding-top: 1px;
margin-top: -1px;
}
.child {
margin-top:260px;
}
使用以下代码向意外移动的div前添加一个没有内容的:first-child:
.parent:before
{content: '';position: relative;height: 0px;width: 0px;overflow: hidden;white-space: pre;}
::before
在IE8中不受支持)。
margin-top
,则父元素将调整其位置以折叠冗余的边距。为什么?就是这样。<style type="text/css">
div {position: relative;}
.parent {background-color: #ccc;}
.child {margin-top: 40px;}
</style>
<div class="parent"><!--This div moves 40px too-->
<div class="child">Hello world!</div>
</div>
white-space
属性来模拟内容。<style type="text/css">
div {position: relative;}
.parent {background-color: #ccc;}
.child {margin-top: 40px;}
.fix {position: relative;white-space: pre;height: 0px;width: 0px;overflow: hidden;}
</style>
<div class="parent"><!--This div won't move anymore-->
<div class="fix"></div>
<div class="child">Hello world!</div>
</div>
position: relative;
确保修复位置正确。 white-space: pre;
使您不需要添加任何内容(如空格)到修复。 height: 0px;width: 0px;overflow: hidden;
确保您永远看不到修复。
您可能需要添加line-height: 0px;
或max-height: 0px;
以确保在古老的IE浏览器中高度实际上为零(我不确定)。如果不起作用,您还可以在旧版IE浏览器中将<!--dummy-->
添加到其中。
简而言之,您只需使用CSS即可执行所有这些操作(这消除了向HTML DOM树添加实际子元素的必要性):
<style type="text/css">
div {position: relative;}
.parent {background-color: #ccc;}
.child {margin-top: 40px;}
.parent:before {content: '';position: relative;height: 0px;width: 0px;overflow: hidden;white-space: pre;}
</style>
<div class="parent"><!--This div won't move anymore-->
<div class="child">Hello world!</div>
</div>
overflow: hidden;
。 - Yeti玩转父元素的显示
.parent{
display: inline-block;
width: 100%;
}
.parent{ display: flex; }