当前位置: 首页 > 科技观察

绝妙的技巧和淫秽的聪明才智!不规则边框生成方案

时间:2023-03-19 23:44:18 科技观察

本文将介绍一个用SVG滤镜给各种不规则图形添加边框的技巧。本文完整DEMO,可以点击这里:透明和SVGfeMorphology滤镜生成不规则边框【1】需求背景,给不规则图形添加边框在我们日常开发中,经常会遇到一些非矩形非圆形的图形图案.类似如下:不规则图形示例使用纯CSS,加上一些技巧,是可以做出上面的图形的,当然这只是第一步的要求。紧接着,可能会有要求给上面的图形加上边框。这时候CSS就很难做了。尝试使用阴影添加边框。第一种方法,我们可以尝试使用drop-shadow给不规则的图形添加外阴影。下面以一个箭头图形为例,使用CSS来实现。其中一种方式如下:"";position:absolute;width:32px;height:64px;top:0;right:-32px;background:linear-gradient(-45deg,transparent0,transparent22px,#f4971422px,#f49714100%),linear-gradient(-135deg,transparent0,transparent22px,#f4971422px,#f49714100%);background-size:32px32px;background-repeat:no-repeat;background-position:0bottom,0top;}}no有边框的不规则图形我们可以给不规则图形加上阴影通过向.arrow-button添加阴影来显示图形。效果如下:.arrow-button{...filter:drop-shadow(0px0px2px#000);...}drop-shadow实现的带有阴影边框的不规则图形Drop-shadowscheme的局限性使用的局限性drop-shadow方案是drop-shadow只能对不规则的图形产生阴影,没有Blurredborder效果不能产生阴影。上面的图形加上drop-shadow的效果如下,比我们想要的没有模糊边框的实体还是差了一点:drop-shadow实现的带有阴影边框的不规则图形使用SVGfeMorphologyfilter添加边框。我们也可以换个思路,复制一个原始图形,然后放大一点改变边框的颜色,然后将两个图形叠加在一起,生成一个不规则的带边框的图形。CSS也有放大元素的能力transform:scale(),但是实现一个原始图形本身的代码可能已经很复杂了,再添加一个可能显得不够优雅,所以我们不得不另辟蹊径,寻找其他类似的实现。在这里,我们尝试使用SVG的feMorphology过滤器为不规则形状添加边框。如果你对SVG滤镜不太了解,可以快速浏览一下我的词条:有趣!强大的SVG滤镜[2]简单介绍一下feMorphology滤镜。feMorphology过滤器是形态过滤器。它的输入源通常是图形的alpha通道,对其进行两次操作可以腐蚀(变薄)或膨胀(变厚)源图形。使用属性运算符来确定是腐蚀还是膨胀效果。用属性radius来表示效果的程度,可以理解为描边的大小。operator:erodecorrosionmode,dilate为扩张模式,默认为eroderadius:strokesize,接受一个数字,表示在该模式下效果的程度,默认为0我们简单的给文字加上这个filter看看效果:

NormalText

NormalText

NormalText

p{font-size:64px;}.dilate{filter:url(#dilate);}.erode{filter:url(#erode);}效果如下:最左边是普通文本,中间是扩张模式,右边是腐蚀模式。看效果,很容易理解:借用feMorphology的扩展能力,给不规则的图形添加边框。利用feMorphology的扩展能力,我们可以提前准备一个SVGfeMorphologyfilter。它的作用就是上面说的:复制一个原始图形,然后放大一点更改为边框的颜色,然后将两个图形叠加在一起生成带边框的不规则图形,并且SVG滤镜可以很方便的通过CSSFilter的url方式引入不同的图形,复用性非常高。这个过滤器的简单代码如下:/feMorphology>简析这段SVG滤镜代码:1.以原图不透明部分为输入,采用dilate扩展方式,度数为radius="1",并生成比原图大1px的A黑块2.使用feMerge将黑块与原图叠加。我们仍然在上面的.arrow-button中添加一个CSS滤镜filter:url(#outline),引入我们创建的SVG滤镜Mirror:.arrow-button{...filter:url(#outline);...}url是CSS过滤器属性的关键字之一,而url模式是CSS过滤器提供的能力之一,允许我们引入特定的SVG过滤器,这大大增强了CSS中过滤器的能力。看效果:SVG滤镜实现带边框的不规则图形哇,这下成功了,通过feMorphology滤镜,我们成功给不规则图形添加了边框效果,我可以控制滤镜radius="1"来控制大小的边界。然后将上面的滤镜应用到各种不规则图形上,看看效果:SVG滤镜实现的带边框的不规则图形效果还不错,就是颜色偏黑。如果我们想让边框的颜色变成其他颜色,有什么办法吗?使用feFlood和feComposite更改边框颜色。通过feFlood和feComposite这两个SVG滤镜,可以为生成的tile赋予不同的颜色。代码如下:通过feFlood中的flood-color="green"可以控制图片的颜色生成的边框(块),这里设置为绿色。应用于每个图形的效果如下:带边框的不规则图形,可以通过SVG滤镜改变颜色至此,我们就实现了通过SVG滤镜给不规则图形添加不同颜色的边框。完整的DEMO可以点这里:transparent配合SVGfeMorphologyfilter生成不规则边框[3]总结一个简单的总结:使用drop-shadow给不规则图形添加阴影,但是不可以给不规则图形添加阴影。没有模糊边界的实体使用feMorphologySVG滤镜为不规则图形添加边界效果。通过控制radius="1",可以调整边框的大小。使用feMorphology借助feFlood和feComposite滤镜,通过CSSFilter改变边框颜色url方式可以快速将SVG滤镜引入到HTML元素中,如filter:url(#outline)值得注意的是,由于height和width图不是1:1,feMorphology的dilate模式不会根据元素的高和宽等比例扩张,所以生成的border不一定到处都是统一的,feMorphology的radius属性可以传入两个值,用空格隔开,分别代表横向和纵向的展开尺寸,实际使用中可以微调一下。最后,这篇文章更多的是提供一个生成不规则边框的思路。当然,这种情况下,大部分还是会以切图为主,但多了解一个可行的方法也不是坏事。好了,本文到此结束,一个简单的tip,希望对你有所帮助:)有什么问题或者建议可以多交流,原创文章,文笔有限,知识匮乏,如有文章如有不准确之处,万网告知。参考文献[1]transparentwithSVGfeMorphologyfilter生成不规则边框:https://codepen.io/Chokcoco/pen/ExZPpQq[2]有意思!强大的SVG滤镜:https://github.com/chokcoco/cnblogsArticle/issues/27[3]Transparent配合SVGfeMorphology滤镜生成不规则边框:https://codepen.io/Chokcoco/pen/ExZPpQq