当前位置: 首页 > Web前端 > HTML

CSS如何实现羽化效果?

时间:2023-03-27 23:27:18 HTML

欢迎关注我的公众号:前端大神最近遇到这样一个问题,书名直接显示在封面上,可能会出现书名看不清楚的情况(容易被背景干扰),如下为了解决这个问题,设计师提出了一个“极端”的解决方案,就是把书名后面的图片模糊掉。这个在css中很容易实现,只需要一个backdrop-filter.name{backdrop-filter:blur(10px);}当然现在blur模糊了,但是边缘太“断层”了,造成title和cover变得“不合时宜”。效果如下如果可以羽化边缘和虚化边缘效果,就可以将标题混合成Featheringintothebackground是photoshop的术语。羽化的原理是模糊选中区域内外的连接,起到渐变的作用,达到自然的连接效果。是PS等版本处理图片的重要工具。这是最后羽化后的设计效果,既能保证文字清晰可见,又能避免过于突兀。下面的设计师要实现这个很简单,用橡皮擦一下就可以了。CSS呢?下面我们来探讨一下CSS是如何实现羽化效果的。1、羽化原理Feathering其实就是模糊边缘。在CSS中,它实际上是创建一个边缘模糊的蒙版,即需要半透明的渐变。关于面膜,这里简单介绍一下。基本语法很简单,和后台语法基本一致。Maskimage'[position]/[size];}这里的maskimage基本和背景一样使用。它可以是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,这里是3层,效果如下但是问题又来了,这样的dom不能直接作为mask-image,那么怎么处理呢?3.将SVGforeignObject转为图片上面说了CSS阴影可以很轻松的达到想要的效果,可惜现在还停留在dom阶段,所以需要将这个dom转为图片。在这里,您需要使用SVG中的foreignObject元素。通过该元素,可以将HTML嵌入到SVG中,轻松实现dom转图片的效果。有兴趣的可以参考之前的文章绘制特殊字体的CSS、SVG和Canvas。导出CSS&SVGforeignObject实现文字空心波浪动画原理如下回到这里,我们只需要将上面的结果放到foreignObject元素中即可,因为需要自适应大小,这里body的宽高都是100%,如下所示://www.w3.org/1999/xhtml">

这样,得到一张宽高自适应的SVG图像。不管宽高怎么变,都是满的。不要看那么多标签。这个其实是一张图,可以直接拿来用。接下来,让我们看看如何使用它。4.矩形羽化其实上面得到的SVG可以直接作为图片资源,正常使用,像这样.name{-webkit-mask:url('./fearher.svg')}不过你也可以把这个SVG图片转成内联形式来减少资源依赖,之后仍然保持自己的图片转换。自适应特性这里推荐张新旭老师推荐的SVG在线压缩合并工具。这是转换后的样子。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")}效果如下,因为大小是动态的,改变标题也可以完美适配。最后,我们来对比一下。以下哪一项看起来最好看?完整代码可以在以下任意链接查看CSSfeather(codepen.io)CSSfeather(runjs.work)5.综上所述,以上就是本文的全部内容。模糊边缘,在CSS中,其实就是创建一个边缘模糊的蒙版,需要半透明的渐变圆的边缘羽化的很好,因为径向渐变可以直接画出矩形的边缘,稍微复杂一点,因为边缘模糊不能直接通过渐变画出来。用CSS很容易实现,用box-shadow就可以了。可以使用SVGforeignObject将dom转换SVG转换为内联形式的好处是减少资源依赖,转换后保持自适应特性。当然,本文最重要的一点是如何在HTML严重受限的背景下绘制一些常见的图形。以后遇到类似的,也可以考虑这个方向的需求。最后,如果觉得对你有好处和帮助,请点赞、收藏、转发???欢迎关注我的公众号:前端大侦探