圆角渐变的边框

342 阅读2分钟

1. 需求UI设计

最外层有个圆角渐变的边框

image.png

2. 问题

乍一看挺简单,直接用border-image实现渐变效果, border-radius 实现圆角效果就行了

border-image: linear-gradient(360deg, rgba(159, 231, 253.4700044989586, 0.5), rgba(159, 231, 253, 0), rgba(160, 231, 253, 0)) 1 1;
border-radius: 10px;

实际上,渐变的效果可以出来,但是圆角就没有了。使用border-image的时候,border-radius不起作用。

搜索一下,解决方式大概有三种: 1是使用clip-path 切一圈,使边框看起来像圆角: clip-path: inset(0px round 10px); 2使用所谓“巧妙”的方式: 用两个容器(其中一个可以使伪类),一个内部的一个外部的,用内部的盖住外部的,将外部的背景色伪装成边框。 3使用背景图片。

解决方式1: 边框很粗,并且只有外部是圆角,丑陋

解决方式2: 麻烦且背景不透明

只能用3了。 3的问题不是技术上的,是人事上的,UI大哥忙,而且觉得蓝湖上有css代码,你怎么就画不出来?

3. 实现

用svg画一个。

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<defs>
 <linearGradient id="grad1" x1="0%" y1="0%" x2="0%" y2="100%">
   <stop offset="0%" style="stop-color:rgba(159, 231, 253);stop-opacity:0" />
   <stop offset="100%" style="stop-color:rgb(159, 231, 253);stop-opacity:0.5" />
 </linearGradient>
</defs>
<rect width="450" height="506" style="fill:rgba(0,0,255,0);stroke-width:1;stroke:url(#grad1)" rx="10" ry="10" />
</svg>

把代码保存为 border.svg 然后找到这个在线压缩svg的工具 传上去,把base64编码拷出来 加个背景图片,搞定

background:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9InJnYmEoMTU5LDIzMSwyNTMpIiBzdG9wLW9wYWNpdHk9IjAiLz48c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiM5ZmU3ZmQiIHN0b3Atb3BhY2l0eT0iLjUiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48cmVjdCB3aWR0aD0iNDUwIiBoZWlnaHQ9IjUwNiIgcng9IjEwIiByeT0iMTAiIGZpbGw9InRyYW5zcGFyZW50IiBzdHJva2U9InVybCgjYSkiLz48L3N2Zz4=") no-repeat center;

4. 总结

svg的写法跟html+css还挺像。看似简单的东西上面都可能有坑。