CSS包含块宽度与元素宽度及边距关系不符合规范?

新手上路,请多包涵

根据css视觉格式化模型描述,

'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' = 包含块的宽度
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .parent {
            background-color: #01c1ff;
            width: 400px;
            height: 400px;
            margin: auto;
        }

        .child {
            height: 200px;
            margin-left: 150px;
            width: 200px;
            margin-right: 150px;
            background-color: #ff01c1;
        }
    </style>
</head>
<body>
    <div class="parent">
        <div class="child"></div>
    </div>
</body>
</html>

在上面的代码中,包含块宽度为400px,而child的margin-left + width + margin-right = 500px,超过了包含块的宽度,根据css规范中的描述,margin-right设置的150px应该会被忽视,变成50px使上述等式成立,但是在浏览器中查看,child的margin-right仍然为150px,并没有符合规范
image.png

按照规范,margin-right应该变为50px

阅读 577
2 个回答
'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' = width of containing block

OP你的理解会有一点问题,margin 值并不会被改变,提到的宽度是 width of containing block ,并不是当前元素的宽度

如果按照OP你的例子,其实需要把外部的 .parent 元素 width 属性调整为 fit-content 那么你就能够从 .parent 元素上看到对应 包含块 的宽度。

如果你给外部容器设置了固定的 width,那么在meathill提到的 box-sizing 的基础上会做 overflow


如果说 margin 值会被改变的,一般都是在BFC的场景中 👉 理解margin塌陷和margin合并及其解决方案

推荐问题