效果预览

在线演示

按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。

https://codepen.io/comehope/pen/xJdVxx

可交互视频

此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。

请用 chrome, safari, edge 打开观看。

https://scrimba.com/p/pEgDAM/cP6LRSk

源代码下载

本地下载

每日前端实战系列的全部源代码请从 github 下载:

https://github.com/comehope/front-end-daily-challenges

代码解读

定义 dom,容器中包含 3 个元素,每个元素代表组成火焰的 1 个火苗:

  1. <div class="flame">
  2. <span></span>
  3. <span></span>
  4. <span></span>
  5. </div>

居中显示:

  1. body {
  2. margin: 0;
  3. height: 100vh;
  4. display: flex;
  5. align-items: center;
  6. justify-content: center;
  7. background: linear-gradient(black, maroon);
  8. }

定义容器尺寸:

  1. .flame {
  2. width: 10em;
  3. height: 12em;
  4. font-size: 24px;
  5. }

画出火苗:

  1. .flame {
  2. position: relative;
  3. }
  4. .flame span {
  5. position: absolute;
  6. width: 5em;
  7. height: 5em;
  8. background: radial-gradient(
  9. orangered 20%,
  10. rgba(255, 69, 0, 0) 70%
  11. );
  12. border-radius: 50%;
  13. bottom: 0;
  14. }

用变量画出多个火苗,其中 --particles 是火苗的数量:

  1. .flame {
  2. --particles: 3;
  3. }
  4. .flame span {
  5. left: calc((var(--n) - 1) * 5em / var(--particles));
  6. }
  7. .flame span:nth-child(1) {
  8. --n: 1;
  9. }
  10. .flame span:nth-child(2) {
  11. --n: 2;
  12. }
  13. .flame span:nth-child(3) {
  14. --n: 3;
  15. }

修改混合模式,使火苗重叠的部分变亮:

  1. .flame span {
  2. mix-blend-mode: screen;
  3. }

增加火焰升腾的动画效果:

  1. .flame span {
  2. animation: rise 1s ease-in infinite;
  3. }
  4. @keyframes rise {
  5. from {
  6. transform: translateY(0) scale(1);
  7. filter: opacity(0);
  8. }
  9. 25% {
  10. filter: opacity(1);
  11. }
  12. to {
  13. transform: translateY(-10em) scale(0);
  14. filter: opacity(0);
  15. }
  16. }

用变量设置火苗升起的延时时间,使火苗陆续升起:

  1. .flame span {
  2. animation-delay: calc(var(--rnd) * 1s);
  3. }
  4. .flame span:nth-child(1) {
  5. --n: 1;
  6. --rnd: 0.1234;
  7. }
  8. .flame span:nth-child(2) {
  9. --n: 2;
  10. --rnd: 0.3456;
  11. }
  12. .flame span:nth-child(3) {
  13. --n: 3;
  14. --rnd: 0.6789;
  15. }

接下来用 d3 来批量处理 dom。
引用 d3 库:

  1. <script src="https://d3js.org/d3.v5.min.js"></script>

用 d3 为 css 中的 --particles 变量赋值:

  1. const COUNT_OF_PARTICLES = 3;
  2. d3.select('.flame')
  3. .style('--particles', COUNT_OF_PARTICLES);

用 d3 创建 dom 中的火苗元素:

  1. d3.select('.flame')
  2. .style('--particles', COUNT_OF_PARTICLES)
  3. .selectAll('span')
  4. .data(d3.range(COUNT_OF_PARTICLES))
  5. .enter()
  6. .append('span');

用 d3 为火苗元素的 css 中的 --n 和 --rnd 变量赋值:

  1. d3.select('.flame')
  2. .style('--particles', COUNT_OF_PARTICLES)
  3. .selectAll('span')
  4. .data(d3.range(COUNT_OF_PARTICLES))
  5. .enter()
  6. .append('span')
  7. .style('--n', (d) => d + 1)
  8. .style('--rnd', () => Math.random());

删除掉 dom 中的火苗元素,删除掉 css 中的变量声明。

最后,把火苗元素设置为 100 个,形成火焰效果:

  1. const COUNT_OF_PARTICLES = 100;

大功告成!

原文地址:https://segmentfault.com/a/1190000015740846

如何用 CSS 和 D3 创作火焰动画的更多相关文章

  1. 如何用 CSS 和 D3 创作旋臂粒子动画

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/xJrOqd 可交互视频 ...

  2. 前端每日实战:89# 视频演示如何用 CSS 和 D3 创作旋臂粒子动画

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/xJrOqd 可交互视频 此视频是可 ...

  3. 如何用 CSS 和 D3 创作一个无尽的六边形空间

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/NBvrWL 可交互视频 此视频是可 ...

  4. 如何用纯 CSS 和 D3 创作一艘遨游太空的宇宙飞船

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/oMqNmv 可交互视频 ...

  5. 前端每日实战:96# 视频演示如何用纯 CSS 和 D3 创作一艘遨游太空的宇宙飞船

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/oMqNmv 可交互视频 此视频是可 ...

  6. 如何用纯 CSS 和 D3 创作一只扭动的蠕虫

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/QBQJMg 可交互视频 ...

  7. 前端每日实战:133# 视频演示如何用 CSS 和 GSAP 创作有多个关键帧的连续动画

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/eLMKJG 可交互视频 此视频是可 ...

  8. 前端每日实战:134# 视频演示如何用 CSS 和 GSAP 创作一个树枝发芽的 loader

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/LJmpXZ 可交互视频 此视频是可 ...

  9. 用 CSS 实现酷炫的动画充电效果

    巧用 CSS 实现酷炫的充电动画 循序渐进,看看只使用 CSS ,可以鼓捣出什么样的充电动画效果. 画个电池 当然,电池充电,首先得用 CSS 画一个电池,这个不难,随便整一个: 欧了,勉强就是它了. ...

随机推荐

  1. Leetcode:环形链表2

    题目 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 解答 这道题真的很巧妙,首先我们有了环形链表1这道题的铺垫,就能方便的判断有无环了,但是题目要求我们找到环形链表的 ...

  2. mysql5.7日志时间戳(log_timestmaps)与系统时间不一致问题以及日志报Got an error reading communication packets情况分析

    一.mysql安装后error_log日志时间戳默认为UTC(如下图),因此会造成与系统时间不一致,与北京时间相差8个小时. 解决errro_logs时间戳与linux系统时间不一致问题 step1: ...

  3. 4.高级数据过滤 ---SQL

    一.AND操作符 要通过不止一个列进行过滤,可以使用A ND操作符给WHERE子句附加条件. SELECT prod_id, prod_price, prod_name FROM Products ; ...

  4. [Android]解决 Could not read entry xxx from cache taskArtifacts.bin

    Bug 出现 事情是这样的,昨天早晨我正做着项目,坐在我旁边的小伙伴呼唤了我一下,说项目运行不起来了. 我纳闷着,前天的时候还好好的,怎么过了一晚就出问题了.我问他是不是改了什么配置,或者添加了什么东 ...

  5. python 4学习 list 和 tuple

    list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: >>> ...

  6. 【转载】Ubuntu16.04安装最新版nodejs

    安装最新版nodejs 更新ubuntu软件源 sudo apt-get update sudo apt-get install -y python-software-properties softw ...

  7. Spring Task ABC

    配置说明 <task:annotation-driven scheduler="xxxScheduler" /> <task:scheduler id=" ...

  8. XML文件的一些操作

    XML 是被设计用来传输和存储数据的, XML 必须含有且仅有一个 根节点元素(没有根节点会报错) 源码下载 http://pan.baidu.com/s/1ge2lpM7 好了,我们 先看一个 XM ...

  9. Jquery3

    动画 动画动画效果一:show(时间),hide(时间)说明:时间的单位为毫秒方法toggle(时间):使用动画切换显示与隐藏动画效果二:slideDown(时间),slideUp(时间)切换:sli ...

  10. js之深度克隆、简易克隆

    一.js中的对象 谈到对象的克隆,必定要说一下对象的概念. js中的数据类型分为两大类:原始类型和对象类型. (1)原始类型包括:数值.字符串.布尔值.null.undefined(后两个是特殊的原始 ...