奇怪的渐变边框效果
在以linear-gradient
为背景的元素上应用透明边框时,会产生奇怪的效果。
注意元素的左右两边没有合适的颜色(它们有些切换),而且很奇怪。
HTML
<div class="colors"> </div>
CSS
.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); }
为什么这会在元素的左右两侧显示出奇怪的效果,我该怎么办呢?
这是小提琴: http : //jsfiddle.net/fzndodgx/3/
这是因为gradient
的起点和终点位于padding-box
的边缘,并且border
在padding-box
外呈现。 所以,边框看起来很有趣,因为在padding-box
外侧的每个边都重复background
以覆盖border-box
。
box-shadow:inset
在padding-box
呈现(就像背景一样),并在视觉上给出了和border
相同的效果,所以你可以尝试用border
代替border
:
box-shadow: inset 0 0 0 10px rgba(0,0,0,0.2); padding: 10px;
由于box-shadow
不占用任何空间,因此需要相应地增加填充。
padding-box
和border-box
插图:
解
解决这个问题最简单的方法是将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>
背景在边界之下重复。 背景仅在元素的“主体”中运行,在边界下是扩展并重复开始发生。
看到这个例子在边界上no-repeat
。
UPDATE
玩背景的position
和size
可以帮助扩大背景,然后调整它的位置。
检查这个小提琴 。
或看到片段:
.colors { padding: 10px; 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: 117%; background-position-x: 130px; }
<div class="colors"></div>
根据默认CSS盒模型的行为,渐变在填充框中开始,因此,在起始和最终颜色出现之前,渐变颜色会出现,直到渐变的任何一侧,即渐变边界所在的位置。
这个渐变(NSFW)也是如此:
它始终在左边的起始值(紫色)中无限延伸,并以最终值(橙色)向右无限延伸。 它可以继续无限地向上渐变,所以它可以。
这是我的理解为什么这是出现如此,解决scheme将使用不同的盒子模型。
background-origin
属性的默认值是padding-box
,这意味着背景的位置和大小是相对于填充框的。
由于background-clip
属性默认为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>
其他答案已经显示了如何解决这个问题,但我想我应该指出,如果你增加border-width
,很明显,背景实际上是重复的。
.colors { width: 100px; border: 100px solid rgba(0,0,0,0.2); height: 50px; background: linear-gradient(to right, #78C5D6, #459BA8, #79C267, #C5D647, #F5D63D, #F08B33, #E868A2, #BE61A5); }
会产生
如果你不想使用box-shadow
,你可以使用border-image
并调整渐变的颜色: http : //jsfiddle.net/9pcuj8bw/5/
.colors { width:100px; height: 50px; background: linear-gradient(to right, #78C5D6, #459BA8, #79C267, #C5D647, #F5D63D, #F08B33, #E868A2, #BE61A5) no-repeat; border: 10px solid; border-image: linear-gradient(to right, #0bc3b8, #068e8c, #f8c617, #ea5f24, #b2492c) 1; }
<div class="colors"></div>
它的工作正常。 你在块上使用透明边框,所以bg-color可以看到。 其线性渐变,使其左侧和右侧的纯色。 如果你使用固体边框,你可以看到适当的效果。 http://prntscr.com/7mo5jm