如何通过 CSS 写出火焰效果

今天的小技巧是使用纯 CSS 生成火焰,逼真一点的火焰。

Posted in HTML / CSS onMarch 24, 2021

在 CodePen 上输入关键字CSS Fire,能找到这样的:

如何通过 CSS 写出火焰效果

或者这样的:

如何通过 CSS 写出火焰效果

我们希望,仅仅使用 CSS ,效果能再更进一步吗?能不能是这样子:

如何通过 CSS 写出火焰效果

如何实现

嗯,我们需要使用filter+mix-blend-mode的组合来完成。

很多 CSS 华而不实的效果都是filter+mix-blend-mode,很有意思,但是业务中根本用不上,当然多了解了解总没坏处。

如上图,整个蜡烛的骨架, 除去火焰的部分很简单,掠过不讲。主要来看看火焰这一块如何生成,并且如何赋予动画效果。

Step 1: filter blur && filter contrast

模糊滤镜叠加对比度滤镜产生的融合效果。

单独将两个滤镜拿出来,它们的作用分别是:

  1. filter: blur(): 给图像设置高斯模糊效果。
  2. filter: contrast(): 调整图像的对比度。

但是,当他们“合体”的时候,产生了奇妙的融合现象。

先来看一个简单的例子:

如何通过 CSS 写出火焰效果

仔细看两圆相交的过程,在边与边接触的时候,会产生一种边界融合的效果,通过对比度滤镜把高斯模糊的模糊边缘给干掉,利用高斯模糊实现融合效果。

利用上述filter blur & filter contrast,我们要先生成一个类似火焰形状的三角形。(略去过程)

这里类似火焰形状的三角形的具体实现过程,在这篇文章有详细的讲解:你所不知道的 CSS 滤镜技巧与细节

如何通过 CSS 写出火焰效果

父元素添加filter: blur(5px) contrast(20),会变成这样:

如何通过 CSS 写出火焰效果

Step 2: 火焰粒子动画

看着已经有点样子了,接下来是火焰动画,我们先去掉父元素的filter: blur(5px) contrast(20),然后继续 。

这里也是利用了filter的融合效果,我们在上述火焰中,利用 SASS随机均匀分布大量大小不一的圆形棕色 div ,隐匿在火焰三角内部,大概是这样:

如何通过 CSS 写出火焰效果

接下来,我们再利用 SASS,给中间每个小圆赋予一个从下往上逐渐消失的动画,并且均匀赋予不同的animation-delay,看起来会是这样:

如何通过 CSS 写出火焰效果

OK,最重要的一步,我们再把父元素的filter: blur(5px) contrast(20)打开,神奇的火焰效果就出来了:

如何通过 CSS 写出火焰效果

Step 3: mix-blend-mode 润色

当然,上述效果已经很不错了。经过各种尝试,调整参数,最后我发现加上mix-blend-mode: screen混合模式,效果更好,得到头图上面的最终效果如下:

如何通过 CSS 写出火焰效果

完整源码在我的 CodePen 上:https://codepen.io/Chokcoco/pen/jJJbmz

另外一些效果

当然,掌握了这种方法后,这种生成火焰的技巧也可以迁移到其他效果去。下图是我鼓捣到另外一个小 Demo,当 hover 到元素的时候,产生火焰效果:

如何通过 CSS 写出火焰效果

CodePen Demo -- Hover Fire

嗯,这些其实都是对滤镜及混合模式的一些搭配运用。按照惯例,肯定有人会留言喷了,整这些花里胡哨的有什么用,性能又不好,业务中敢上不把你的腿给打骨折。

于我而言,虚心接受各种批评质疑及各种不同的观点,当然我是觉得搞技术一方面是实用,另一方面是兴趣使然,自娱自乐。希望喷子绕道~

回到正题,了解了这种黏糊糊湿答答的技巧后,还可以折腾出其他很多有意思的效果,当然可能需要更多的去尝试,如下面使用一个标签实现的滴水效果:

如何通过 CSS 写出火焰效果

CodePen Demo -- 单标签实现滴水效果

值得注意的细节点

动画虽然美好,但是具体使用的过程中,仍然有一些需要注意的地方:

CSS 滤镜可以给同个元素同时定义多个,例如filter: blur(5px) contrast(150%) brightness(1.5),但是滤镜的先后顺序不同产生的效果也是不一样的;

也就是说,使用filter: blur(5px) contrast(150%) brightness(1.5)filter: brightness(1.5) contrast(150%) blur(5px)处理同一张图片,得到的效果是不一样的,原因在于滤镜的色值处理算法对图片处理的先后顺序。

滤镜动画需要大量的计算,不断的重绘页面,属于非常消耗性能的动画,使用时要注意使用场景。记得开启硬件加速及合理使用分层技术;blur()混合contrast()滤镜效果,设置不同的颜色会产生不同的效果,这个颜色叠加的具体算法暂时没有找到很具体的规则细则,使用时比较好的方法是多尝试不同颜色,观察取最好的效果;细心的读者会发现上述效果都是基于黑色底色进行的,动手尝试将底色改为白色,效果会大打折扣。最后

本文只是简单的介绍了整个思路过程,许多 CSS 代码细节,调试过程没有展现出来。主要几个 CSS 属性默认大家已经掌握了大概,阅读后可以自行去了解补充更多细节:

  • filter
  • mix-blend-mode
HTML / CSS 相关文章推荐
a标签的css样式四个状态
Mar 09 HTML / CSS
CSS3 渐变(Gradients)之CSS3 线性渐变
Jul 08 HTML / CSS
详解CSS3 用border写 空心三角箭头 (两种写法)
Sep 29 HTML / CSS
Web前端绘制0.5像素的几种方法
Aug 11 HTML / CSS
纯CSS打造(无图像无js)的非常流行的讲话(语音)气泡效果
Dec 28 HTML / CSS
一款纯css3实现的圆形旋转分享按钮旋转角度可自己调整
Sep 02 HTML / CSS
使用CSS3配合IE滤镜实现渐变和投影的效果
Sep 06 HTML / CSS
css3 media 响应式布局的简单实例
Aug 03 HTML / CSS
CSS3下的渐变文字效果实现示例
Mar 02 HTML / CSS
HTML5 canvas实现雪花飘落特效
Mar 08 HTML / CSS
HTML5上传文件显示进度的实现代码
Aug 30 HTML / CSS
HTML+CSS实现导航条下拉菜单的示例代码
Aug 02 HTML / CSS
Html5移动端div固定到底部实现底部导航条的几种方式
Mar 09 #HTML / CSS
HTML5拖拽文件上传的示例代码
Mar 04 #HTML / CSS
html5使用window.postMessage进行跨域实现数据交互的一次实战
Feb 24 #HTML / CSS
Canvas在超级玛丽游戏中的应用详解
Feb 06 #HTML / CSS
Html5移动端网页端适配(js+rem)
Feb 03 #HTML / CSS
使用HTML和CSS实现的标签云效果(附demo)
Feb 03 #HTML / CSS
canvas版人体时钟的实现示例
Jan 29 #HTML / CSS
You might like
1982年日本摄影师镜头下的中国孩子 那无忧无虑的童年
2020/03/12 杂记
一些常用的php简单命令代码集锦
2007/09/24 PHP
fleaphp crud操作之find函数的使用方法
2011/04/23 PHP
PHP和C#可共用的可逆加密算法详解
2015/10/26 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
2016/03/25 PHP
php对象工厂类完整示例
2018/08/09 PHP
掌握PHP垃圾回收机制详解
2019/03/13 PHP
将HTMLCollection/NodeList/伪数组转换成数组的实现方法
2011/06/20 Javascript
javascript中sort() 方法使用详解
2015/08/30 Javascript
jQuery 1.9.1源码分析系列(十三)之位置大小操作
2015/12/02 Javascript
AngularJS控制器controller正确的通信的方法
2016/01/25 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
BootStrap轻松实现微信页面开发代码分享
2016/10/21 Javascript
Bootstrap3 datetimepicker控件使用实例
2016/12/13 Javascript
从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
2017/04/13 Javascript
微信小程序获取位置展示地图并标注信息的实例代码
2019/09/01 Javascript
使用Python的Supervisor进行进程监控以及自动启动
2014/05/29 Python
Python使用Paramiko模块编写脚本进行远程服务器操作
2016/05/05 Python
python用reduce和map把字符串转为数字的方法
2016/12/19 Python
Python编程实现的图片识别功能示例
2017/08/03 Python
python先序遍历二叉树问题
2017/11/10 Python
解决phantomjs截图失败,phantom.exit位置的问题
2018/05/17 Python
关于django 数据库迁移(migrate)应该知道的一些事
2018/05/27 Python
django主动抛出403异常的方法详解
2019/01/04 Python
如何在python开发工具PyCharm中搭建QtPy环境(教程详解)
2020/02/04 Python
享誉全球的多元化时尚精品购物平台:Farfetch发发奇(支持中文)
2017/08/08 全球购物
趣味运动会活动方案
2014/02/12 职场文书
大学班级计划书
2014/04/29 职场文书
党员对照检查材料思想汇报(党的群众路线)
2014/09/24 职场文书
庆七一宣传标语
2014/10/08 职场文书
2014年审计工作总结
2014/11/17 职场文书
工资证明范本
2015/06/12 职场文书
给领导敬酒词
2015/08/12 职场文书
2019秋季运动会口号
2019/06/25 职场文书
将MySQL的表数据全量导入clichhouse库中
2022/03/21 MySQL
古见同学有交流障碍症 第二季宣传CM公开播出
2022/04/11 日漫