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

CSS如何实现羽化效果?

时间:2023-03-11 23:52:27 科技观察

最近遇到这样的问题。直接在封面上显示书名时,可能会出现标题不清晰的情况(容易被背景干扰)。为了解决这个问题,设计师提出了一个“终极”的解决方案,将书名后面的图片模糊化,这在CSS中很容易实现,只需要一个backdrop-filter.name{backdrop-filter:blur(10px);}当然,现在blur模糊了,但是边缘太“有缺陷”,导致书名和封面“格格不入”。效果如下。如果边缘可以羽化,边缘效果虚化,书名可以很好的融入背景。羽化是photoshop的术语,羽化的原理是模糊选中区域内外的连接,起到渐变的作用达到自然衔接的效果,是PS等版本处理图片的重要工具,这是设计最后的羽化效果,可以保证文字清晰可见,避免过于突兀,如下:设计人员实现这一点非常简单,只需用n橡皮擦,CSS呢?下面我们来探讨一下CSS是如何实现羽化效果的。1、羽化原理Feathering其实就是模糊边缘。在CSS中,它实际上是创建一个边缘模糊的蒙版,即需要半透明的渐变。关于面膜,这里简单介绍一下。基本语法很简单,和后台基本一致。也可以使用PNG图片、SVG图片、渐变绘制的图片,也支持多图叠加。遮蔽的原理很简单。最终效果只显示不透明部分,透明部分将不可见。让我们用半透明类比来举一个圆形的例子。这个比较简单,因为可以直接通过径向渐变来创建。比如下面有个头像,现在直接放在背景上很突兀。我们可以通过径向渐变绘制这个头像,绘制一个从不透明到透明的蒙版,达到与背景融合的效果。head{-webkit-mask:radial-gradient(closest-sidecircle,#00060%,transparent100%);}原理是这样的:最终效果如下:当然这是一个圆,万一是呢一个长方形?2.矩形的羽化原理根据上面的分析,如果要对矩形的边缘进行羽化,就需要创建这个mask。那么问题来了,如何创建这个边缘模糊的矩形呢?好像没办法直接通过gradients来实现,还需要size-adaptive(自动跟随容器大小)。如果单纯看这样一个矩形,还是很容易实现的。可以通过box-shadow.shadow{width:200px;来实现高度:200px;背景:黑色;边界半径:10px;box-shadow:005pxblack,0010pxblack,0015pxblack}根据需求,**可以加几层box-shadow**,这里是三层叠加,效果如下但是问题又来了,这样的dom是不能直接作为mask-image的,那么怎么处理呢?3.将SVGforeignObject转为图片上面说了CSS阴影可以很轻松的达到想要的效果,可惜现在还停留在dom阶段,所以需要将这个dom转为图片。在这里,您需要使用SVG中的foreignObject[1]元素。通过这个元素,可以将HTML嵌入SVG,轻松实现dom转图片的效果。原理如下:回到这里,我们只需要将上面的结果放入foreignObject元素即可。由于需要自适应大小,这里body的宽高都是100%,如下

这样,得到一个宽高适配后的SVG图片不管宽高怎么变化都是满的。别看这么多标签,这其实就是一张图片,可以直接拿来用。接下来,让我们看看如何使用它。4.矩形羽化其实上面得到的SVG可以直接作为图片资源使用,也可以正常使用,就像this.name{-webkit-mask:url('./fearher.svg')}但是,你也可以将这个SVG图像转换成内联形式,以减少资源依赖,并在转换后仍然保持自适应特性。这里推荐张新旭老师的SVG在线压缩合并工具[2]。这是转换后的样子:.name{-webkit-mask:url("data:image/svg+xml,%3Csvgxmlns='http://www.w3.org/2000/svg'%3E%3CforeignObjectwidth='100%25'height='100%25'%3E%3Cbodyclass='wrap'xmlns='http://www.w3.org/1999/xhtml'%3E%3Cstyle%3E.wrap%7Bbox-sizing:border-box;margin:0;height:100%25;padding:10px%7D.shadow%7Bheight:100%25;background:%23000;border-radius:10px;box-shadow:005px%23000,0010px%23000,0015px%23000%7D%3C/style%3E%3Cdivclass='shadow'/%3E%3C/body%3E%3C/foreignObject%3E%3C/svg%3E")}效果如下,并且因为size是动态的,所以改变title也可以完美适配。最后再对比一下。以下哪一项看起来最好?完整代码可以在以下任一链接查看:CSSfeather(juejin.cn)[3]CSSfeather(codepen.io)[4]CSSfeather(runjs.work)[5]5.综上所述,以上就是本文的全部内容。还不错的绘图技巧,最后来复习一些实现要点。羽化实际上是模糊了边缘。在CSS中,它实际上是创建一个边缘模糊的蒙版,这需要一个半透明的渐变。圆圈的边缘很好地羽化,因为可以直接绘制径向渐变。矩形的边缘稍微复杂一些,因为它们不能直接用渐变绘制。模糊边缘在CSS中很容易实现,使用box-shadow即可。dom可以通过SVGforeignObject转换成图片。将SVG转换为内联形式的好处是减少资源依赖,转换后仍然保持自适应特性。