潜在问题#1
最后一个边距没有被折叠,而是被忽略了。
overflow
属性仅适用于内容,而不适用于填充或边距。
规范中的说明如下:
11.1.1 溢出: overflow
属性
此属性指定当块级容器元素的内容溢出元素的框时是否裁剪该内容。
现在让我们看一下CSS Box Model:
![enter image description here](https://istack.dev59.com/K3nfO.webp)
来源: W3C
overflow
属性仅限于内容框区域。如果内容溢出其容器,则应用 overflow
。但是 overflow
不会进入填充或边距区域(除非当然有更多的内容跟随)。
潜在问题 #2
潜在问题 #1 的问题在于它似乎只适用于弹性盒子或网格布局环境。例如,在标准块布局中,最后一个边距似乎不会折叠。因此,也许允许 overflow
覆盖边距/填充,无论规范中说什么。
div {
height: 150px;
overflow: auto;
width: 600px;
background: orange;
white-space: nowrap;
}
span {
background: blue;
color: #fff;
padding: 50px;
margin: 0 30px;
display: inline-block;
}
<div class="container">
<span>Item 1</span>
<span>Item 2</span>
<span>Item 3</span>
<span>Item 4</span>
</div>
因此,问题可能与“过度约束”的元素有关。
10.3.3 正常流中的块级非替换元素
其他属性的使用值必须遵循以下限制:
margin-left
+ border-left-width
+ padding-left
+ width
+
padding-right
+ border-right-width
+ margin-right
= 包含块的宽度
如果 width
不是 auto
,且 border-left-width
+ padding-left
+
width
+ padding-right
+ border-right-width
(加上任何不是 auto
的 margin-left
或 margin-right
)大于包含块的宽度,则对于以下规则,任何 margin-left
或 margin-right
的 auto
值将被视为零。
如果上述所有值的计算值均不为 auto
,则这些值被称为“过度约束”,其中一个使用值必须与其计算值不同。如果包含块的 direction
属性具有值 ltr
,则忽略 margin-right
的指定值,并计算该值以使等式成立。 如果 direction
的值为 rtl
,则会对 margin-left
进行相同的处理
(已加重)
根据CSS可视化格式模型,元素可能会被“过度约束”,因此右边距会被抛弃。
可能的解决方法
可以在最后一个元素上使用右侧的 边框,而不是使用 margin 或 padding:
li:last-child {
border-right: 30px solid orange;
}
ul {
list-style-type: none;
padding: 0;
margin: 0;
display: flex;
height: 100px;
overflow: auto;
width: 600px;
background: orange;
}
ul li {
background: blue;
color: #fff;
padding: 90px;
margin: 0 30px;
white-space: nowrap;
flex-basis: auto;
}
li:last-child {
border-right: 30px solid orange;
}
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
</ul>
另一种解决方案使用伪元素而非边距或填充。
在 flex 容器上的伪元素被渲染为 flex 项。容器中的第一项是 ::before,最后一项是 ::after。
ul::after {
content: "";
flex: 0 0 30px;
}
ul {
list-style-type: none;
padding: 0;
margin: 0;
display: flex;
height: 100px;
overflow: auto;
width: 600px;
background: orange;
}
ul li {
margin: 0 30px;
background: blue;
color: #fff;
padding: 90px;
white-space: nowrap;
flex-basis: auto;
}
ul::after {
content: "";
flex: 0 0 30px;
}
ul::before {
content: "";
flex: 0 0 30px;
}
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
</ul>
content-box
。 - Akanshborder-left: 10vw solid transparent;
解决了我所有的问题,谢谢! - Alexandre Daubricourt