解
解决此问题的最简单方法是将background-origin
属性的值设置为border-box
。
.colors {
width: 100px;
border: 10px solid rgba(0, 0, 0, 0.2);
height: 50px;
background: linear-gradient(to right, #78C5D6, #459BA8, #79C267, #C5D647, #F5D63D, #F08B33, #E868A2, #BE61A5);
background-origin: border-box;
}
<div class="colors"></div>
出现上述问题的原因
以下是background
确定此情况下背景渐变显示方式的相关属性:
现在结合所有这三个,我们可以看到必须重复尽可能多的边界,以便即使在边界下方也要显示边界,并且边界的起始位置在盒子的边界之后。这意味着必须以循环方式重复背景,以填满左侧边框下方的区域。因此,左边框的颜色为渐变的右端,反之亦然。
通过将其更改为border-box
,我们使背景相对于边界框定位。此设置也会影响背景图像的大小,其原因将在下面详细说明。
为什么不起作用box-sizing: border-box
?
设置box-sizing
为asborder-box
不会带来任何更改,因为该属性仅影响框的大小。它对以下内容绝对没有影响:
- 渐变图像的大小(实际计算逻辑如下所述)
- 渐变图像的起点(或位置)
- 重复背景图片
梯度的大小如何计算?
根据W3C规范,以下是在未提供明确尺寸(默认值为auto
)时如何计算图像尺寸的方法。
如果图像既没有固有宽度也没有固有高度,则将其大小确定为“包含”
请注意它是如何谈论图像的大小而不是盒子的大小。从本质上讲,无论框的大小如何,contain
当图像本身没有固有高度时(该CSS梯度不会像其他图像一样),背景图像的大小将根据关键字的定义计算)。
的定义contain
如下:
将图像缩放,同时保留其固有的宽高比(如果有),以最大尺寸进行缩放,以使其宽度和高度都可以适合背景定位区域。
后台定位区域定义如下(在background-origin
属性定义下):
对于渲染为单个框的元素,指定背景定位区域
因此,当图像没有固有高度时(在这种情况下background-size
也没有),图像的大小将等于background-origin
的值(在我们的情况下为padding-box
)。
这就是为什么即使将box-sizing
as设置border-box
都无效的原因。
注意:引用文字中的重点都是我的
如果您明确地将设置background-size
为框的大小,您会注意到在右侧而不是左侧如何解决该问题。这是因为现在图像足够大,无法在右边框下重复,但是其起点仍在左边框之后。
.colors {
width: 100px;
border: 10px solid rgba(0, 0, 0, 0.2);
height: 50px;
background: linear-gradient(to right, #78C5D6, #459BA8, #79C267, #C5D647, #F5D63D, #F08B33, #E868A2, #BE61A5);
background-size: 110px 60px;
}
.colors-2 {
width: 100px;
border: 10px solid rgba(0, 0, 0, 0.2);
height: 50px;
background: linear-gradient(to right, #78C5D6, #459BA8, #79C267, #C5D647, #F5D63D, #F08B33, #E868A2, #BE61A5);
box-sizing: border-box;
background-size: 100px 50px;
}
<div class="colors">
</div>
<div class="colors-2">
</div>