根据CSS视觉格式模型中的描述
'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' = 包含块的宽度
当margin
和width
都不是,auto
并且它们的和大于包含块的宽度时,margin-right
将被忽略,并计算值以使等式成立
.parent {
background-color: #01c1ff;
width: 400px;
height: 400px;
margin: auto;
}
.child {
height: 200px;
margin-left: 150px;
width: 200px;
margin-right: 150px;
background-color: #ff01c1;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div class="parent">
<div class="child"></div>
</div>
</body>
</html>
这段代码中,对于child来说,包含块的宽度是400px,而width
++的margin-left
和margin-rigth
是500px。根据描述,margin-right
最终应该设置为50px才能使等式成立。
但是在浏览器中检查时发现margin-right并没有设置为50px,而是依然是150px。
在正常流程中:
当这些值都不为
auto
,但它们的总和超出了包含块的宽度,则必须做出一些让步。根据CSS2.1 规范 §10.3.3:这部分在理论上是正确的。
但你的代码中实际发生的事情如下
你写道:
width: 400px
但实际上,浏览器并不会重新计算
margin-right
来解决这个问题,而是直接让子元素溢出到父元素的宽度之外。这是允许的,因为:
因此,规范给出了一个公式,当其中一个值为时,该公式可用于修复过度约束的布局。
auto
但是如果都不是
auto
,浏览器就会尊重您所写的内容,即使它破坏了规则。尝试一下这个:
如果您希望布局按照规范所暗示的方式进行调整,请将一个值设置为
auto
,例如:现在,浏览器将计算
margin-right
50px 以适应该方程!