记录--CSS 如何实现羽化效果?

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

最近碰到这样一个问题,在一张封面上直接显示书名,可能会存在书名看不太清楚的情况(容易受到背景干扰),如下

为了解决这个问题,设计师提了一个“究极”方案,将书名背后的图片模糊一下,这个在 CSS 中很好实现,仅需backdrop-filter即可

.name{
  backdrop-filter: blur(10px);
}

当然,现在模糊是模糊了,但是边缘过于“断层”,导致书名和封面有些“格格不入”,效果如下

如果能够将边缘羽化一下,虚化边缘效果,就可以很好地将书名融入到背景当中

羽化是photoshop术语,羽化原理是令选区内外衔接部分虚化,起到渐变的作用从而达到自然衔接的效果,是ps及其其它版本中的处理图片的重要工具

这是设计最终羽化后的效果,既能保证文字清晰可见,又能避免太过突兀,如下

设计师实现这个很简单,用橡皮擦擦一下就可以了,那么 CSS 呢?下面来探讨一下 CSS 如何实现羽化的效果。

一、羽化的原理

羽化其实就是将边缘变得模糊,在 CSS 中其实就是创建一个边缘模糊的遮罩(mask),也就是需要一种半透明的渐变。

关于遮罩,这里简单介绍一下,基本语法很简单,和background的语法基本一致

.content{
  -webkit-mask: '遮罩图片' ;
}
/*完整语法*/
.content{
  -webkit-mask: '遮罩图片' [position] / [size] ;
}

这里的遮罩图片和背景的使用方式基本一致,可以是PNG图片、SVG图片、也可以是渐变绘制的图片,同时也支持多图片叠加。

遮罩的原理很简单,最终效果只显示不透明的部分,透明部分将不可见,半透明类推

先举个圆形的例子,这个比较简单,因为可以直接通过径向渐变创建

比如,下面有一个头像,现在直接放在背景上非常突兀

我们可以将这个头像通过径向渐变绘制出了一个从不透明到透明的遮罩,达到和背景融合的效果

.head{
  -webkit-mask: radial-gradient(closest-side circle,#000 60%, transparent 100%);
}

原理是这样的

最后效果如下

当然这是圆形的,如果是矩形的呢?

二、矩形的羽化原理

根据上面的分析,如果希望羽化矩形边缘,需要创建这一个遮罩

那么问题来了,如何创建这一个边缘模糊的矩形呢?貌似没办法直接通过渐变来实现,而且还需要是尺寸自适应的(自动跟随容器尺寸)

如果单纯看这样一个矩形,还是很容易实现的,通过box-shadow即可实现

.shadow{
  width: 200px;
  height: 200px;
 	background:black;
  border-radius:10px;
  box-shadow:0 0 5px black, 0 0 10px black, 0 0 15px black
}

根据需求,可以多叠加几层box-shadow,这里叠加了3层,效果如下

但是问题又来了,这样一个 dom 无法直接用作mask-image,那如何处理呢?

三、通过 SVG foreignObject 转换成图片

上面提到,通过 CSS 阴影可以很轻松的实现我们说需要的效果,但可惜现在还是 dom 阶段,所以需要将这个 dom 转换成图像。

在这里,需要借助 SVG 中的foreignObject元素,通过这个元素,可以将 HTML嵌入到SVG中,轻松实现 dom 转图片的效果

有兴趣的可以参考之前这几篇文章

  • CSS、SVG、Canvas对特殊字体的绘制与导出
  • CSS & SVG foreignObject 实现文字镂空波浪动画

原理如下

回到这里,我们仅需要将上面的结果放到foreignObject元素中,由于需要自适应尺寸,这里的body宽高都是100%,如下

<svg xmlns="http://www.w3.org/2000/svg">
  <foreignObject width="100%" height="100%">
    <body class="wrap" xmlns="http://www.w3.org/1999/xhtml">
      <style>
        .wrap{
          box-sizing: border-box;
          margin: 0;
          height: 100%;
          padding: 10px;
        }
        .shadow{
          height: 100%;
          background:black;
          border-radius:10px;
          box-shadow:0 0 5px black, 0 0 10px black, 0 0 15px black
        }
      </style>
      <div class="shadow"></div>
    </body>
  </foreignObject>
</svg>

这样就得到了一个宽高自适应的SVG图像,无论宽高怎么变化,都是撑满的

别看这么多标签,这其实已经是一张图片,可以直接使用,接下来看看如何运用

四、矩形的羽化

其实上面得到的 SVG可以直接当成一个图片资源,正常使用了,就像这样

.name{
  -webkit-mask: url('./fearher.svg')
}

不过,也可以将这个SVG图片转换成内联形式,减少资源依赖,转换后仍然保持自适应特性

这里推荐张鑫旭老师的SVG在线压缩合并工具

转换后就是这个样子

.name{
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3CforeignObject width='100%25' height='100%25'%3E%3Cbody class='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:0 0 5px %23000,0 0 10px %23000,0 0 15px %23000%7D%3C/style%3E%3Cdiv class='shadow'/%3E%3C/body%3E%3C/foreignObject%3E%3C/svg%3E")
}

效果如下

Kapture 2022-12-10 at 18.23.20

而且由于尺寸是动态的,换个书名也能完美适应

image-20221210221842455

最后再来对比一下,下面哪个一眼看上去效果最好

image-20221210183113086

完整代码可以查看以下任意链接

  • CSS feather (juejin.cn)
  • CSS feather (codepen.io)
  • CSS feather (runjs.work)

本文转载于:

https://juejin.cn/post/7176094306124431421

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/6320.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法 - 希尔排序

原理 首先将数组两两分组&#xff0c;分成n组数组&#xff0c;每组数组内部进行排序。再分成n/2组数组&#xff0c;每组数组内部进行排序。直至分成只剩一组&#xff0c;最后进行排序得到最后的数组。 代码 public static int[] shell(int[] arr) {int temp;for (int gra …

计算机图形学13:三维图形的几何变换

作者&#xff1a;非妃是公主 专栏&#xff1a;《计算机图形学》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、三维图形的几…

MongoDB综述【入门指南】

写这篇博客,正好是2023年4月5日15:29:31,是清明节,放假一天,我坐在我的小小租房室内,思考着没思考到啥,哈哈哈,感觉好着急啊!看完了一本《城南旧事》,但是就是不踏实,好吧~我来写一篇最近在学的一个技术 为了更优秀的自己~奥利给!! 首先,我们从最初级小白开始(因为自己也是小白…

卷麻了,00后测试用例写的比我还好,简直无地自容.....

前言 作为一个测试新人&#xff0c;刚开始接触测试&#xff0c;对于怎么写测试用例很头疼&#xff0c;无法接触需求&#xff0c;只能根据站在用户的角度去做测试&#xff0c;但是这样情况会导致不能全方位的测试APP&#xff0c;这种情况就需要一份测试用例了&#xff0c;但是不…

倾斜实景三维建模与BIM模型处理技术

倾斜实景三维建模与BIM模型处理技术 一、研究背景 ➢ 倾斜模型 ✓ 真实纹理&#xff0c;高分辨率 ✓ 真实坐标&#xff0c;高空间精度 ✓ 快速建模&#xff0c;低建模成本 ➢ BIM设计 BIM 技术作为建筑施工行业中的新技术&#xff0c;存在于建筑的全生命周期&#xff0c;服务…

机器学习算法:K近邻(k-nearest neighbors)初探

KNN的介绍和应用 KNN&#xff08;K-Nearest Neighbor&#xff09;算法是一种基于实例的学习算法&#xff0c;也是一种常见的分类算法。 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别&#xff0c;则该样本也属于这个类别。 示例 &…

Python 3 基本数据类型,包含示例演示(初学友好)

嗨害大家好鸭~ 我是芝士❤ 有好好学习python吗&#xff1f; Python学习资料电子书 点击此处跳转文末名片获取 Python3 基本数据类型 Python 中的变量不需要声明。每个变量在使用前都必须赋值&#xff0c;变量赋值以后该变量才会被创建。 在 Python 中&#xff0c;变量就是变量…

MATLAB 求解定积分和不定积分

本文主要介绍如何通过matlab 去求解常见的定积分和不定积分的结果&#xff0c;使用matlab 内置函数 int。 语法&#xff1a; Fint(表达式&#xff0c;变量&#xff0c;变量上下限) 目录 例子1 单变量不定积分 例子2 多变量不定积分 例子3 单变量定积分 例子4 定积分近似求…

软件测试高频出现面试题-2(实用)

每日面试1、自我介绍2、简单介绍最近项目你是如何开展测试工作的呢&#xff1f;3、描述在这个项目里面你主要负责哪些模块的测试&#xff1f;选中一个业务复杂的讲述你是如何测试的呢&#xff1f;1、自我介绍 主要可以从三个方面准备&#xff1a;我的基础信息&#xff0c;我的…

OBCP第八章 OB运维、监控与异常处理-常见异常处理

问题排查概述&#xff1a;数据库连接问题排查 在遇到连接问题时&#xff0c;需要清楚整个系统的架构&#xff0c;对整个连接链路进行排查。通常情况下应用连接到数据库的完整链路是从应用服务器到 OBProxy 再到 OB 集群&#xff0c;此外还可能涉及负载均衡、DNS 解析、网络等。…

49天精通Java,第24天,Java链表、散列表、HashSet、TreeSet

目录一、链表二、散列表三、HashSet四、TreeSet五、TreeSet常用方法大家好&#xff0c;我是哪吒。 一、链表 从数组中间删除一个元素开销很大&#xff0c;其原因是向数组中插入元素时&#xff0c;此元素之后的所有元素都要向后端移动&#xff0c;删除时也是&#xff0c;数组中…

大厂面试篇--2023软件测试八股文最全文档,有它直接大杀四方

前言 已经到了金三银四的黄金招聘季节了&#xff0c;还在准备面试跳槽涨薪的小伙伴们可以看看本篇文章哟&#xff0c;这里呢笔者就不多说废话了直接上干货&#xff01;答案已整理好&#xff0c;文末拿去即可&#xff01;非常好用&#xff01; 一、字节跳动测试面经篇 1、在搜…

【KNN算法详解(用法,优缺点,适用场景)及应用】

KNN算法介绍 KNN&#xff08;K Near Neighbor&#xff09;&#xff1a;k个最近的邻居&#xff0c;即每个样本都可以用它最接近的k个邻居来代表。KNN算法属于监督学习方式的分类算法&#xff0c;我的理解就是计算某给点到每个点的距离作为相似度的反馈。 简单来讲&#xff0c;…

【工具】Maven

文章目录0.Maven安装&#xff08;不使用IDEA内置&#xff09;1.Maven的作用2.Maven核心概念3.maven目录结构4.仓库5.pom文件5.1 坐标 gav5.2.packaging5.3.依赖5.4.配置属性5.5.build6.Maven生命周期7.junit 单元测试8.插件9.IDEA构建Maven10.创建javase项目11.web工程12.依赖的…

【Linux】初识动静态库/动静态链接

文章目录动静态库的基本原理认识动静态库动静态库的特性手动安装静态库动静态库的基本原理 首先&#xff0c;文件和头文件最终变成一个可执行程序需要经历以下四个步骤&#xff1a; 1&#xff09;预处理&#xff1a;预处理所要完成的有&#xff0c;头文件展开、去注释、宏替换…

【HTML系列】第四章 · 列表和表格

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

【艾特淘】淘宝做爆款的目的是什么?怎么做?

其实在淘宝上面也有很多卖家都想要去打造属于自己店铺的爆款商品。 但是又不知道淘宝做爆款商品的目的是什么&#xff0c;也不知道爆款商品到底应该要怎么做&#xff0c;我马上就来给各位卖家介绍。 我们打造爆款是为了让我们通过爆款赚钱&#xff0c;通过爆款引来的流量带动其…

计算机| 关于CPU的12个知识点(图文详解)

CPU是什么&#xff1f; CPU与计算机的关系就相当于大脑和人的关系&#xff0c;它是一种小型的计算机芯片&#xff0c;通常嵌入在电脑的主板上。 CPU的构建是通过在单个计算机芯片上放置数十亿个微型晶体管来实现。 这些晶体管使它能够执行运行存储在系统内存中的程序所需的计…

JS手写浅拷贝与深拷贝

目录 1、引言 2、深拷贝与浅拷贝介绍 2.1、概念 2.2、实现方式 3、手写代码 1、引言 要了解浅拷贝与深拷贝&#xff0c;首先要知道 堆 和 栈 的概念 堆栈&#xff1a; 就是存放数据的地方&#xff08;不管是定义的数字、字符串、对象还是数组、函数等等&#xff0c;都会在…

学习HM微博项目第10天

步骤&#xff1a;发微博12-表情键盘06-点击表情 -> 发微博13-表情键盘07-插入表情和封装textView -> 发微博14-表情键盘08-长按表情 -> 发微博15-表情键盘09-最近表情 -> 发微博16-表情键盘10-最近表情完善 发微博12-表情键盘06-点击表情 APP的演示动画&#xff…