【发布时间】:2021-02-16 02:50:37
【问题描述】:
根据 css 规范,我发现以下代码的行为与预期不符。
<style>
div {width: 300px; border: 1px solid black;}
.child{width: 400px; border: 1px solid red;}
</style>
<body>
<div class="container">
<p class="child">some text</p>
</div>
</body>
css 规范中的视觉格式化模型: https://www.w3.org/TR/CSS22/visudet.html#blockwidth
给出以下约束方程,其中左侧的属性引用包含块的子元素:
'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' = 包含的宽度阻止
它进一步指出: 如果以上所有的计算值都不是“auto”,则这些值被称为“过度约束”,并且使用的值之一必须与其计算值不同。如果包含块的'direction'属性的值为'ltr',则忽略'margin-right'的指定值并计算该值以使相等。
分解 w3 规范中的声明
来自 w3: "如果以上所有的计算值都不是 'auto',则这些值被称为“过度约束”"
child 中与 width 相关的所有属性都具有除 auto 以外的值,因此该元素被过度约束。
等式是
0+ 1 + 0 + 400 + 0 + 1 + 0 = 300
来自 w3: “其中一个使用的值必须与其计算值不同。” 和 "'margin-right' 的指定值被忽略,并计算该值以使相等。"
所以这意味着我们必须调整 margin-right 来给出方程:
0+ 1 + 0 + 400 + 0 + 1 + -102 = 300
我们希望在 chrome 开发者工具中看到 -102px 的边距
但是我得到以下信息:
并且没有-ve右边距?
我基本上想了解 chrome 为子元素计算的尺寸如何满足 css 规范,而不分配 -ve 右边距。
【问题讨论】:
标签: css