d3.js 实现烟花鲜果
今天在d3.js官网上看到了一个烟花的DEMO,是canvas制作的,于是我想用d3.js来实现它,js代码只有几行。好了废话不多说,先上图。

1 js 类
因为烟花要有下落的效果,所以里面用到了一些简单的数学和物理知识来模拟重力,
class Firework {
constructor() {
this._heightLimit = [100,200];
this._width = 1288;
this._svg = null;
this._tempObj = {};
this._colors = d3.scaleLinear().domain([0,1,2,3,4,5]).range(['#f00','#ff0','#f0f','#0ff','#0f0'])
this.initSvg();
}
initSvg() {
this._svg = d3.select('body').append('svg');
this._width = window.innerWidth;
}
randomPosition() {
setInterval(() => {
let x = Math.floor(Math.random() * (this._width - 200) + 100);
let y = Math.floor(Math.random() * (this._heightLimit[1] - this._heightLimit[0]) + this._heightLimit[0]);
let v = Math.random() * 20 + 40;
let c = Math.random() * 4;
this.renderFire(x,y,v,c)
}, Math.floor(Math.exp(-Math.random()) * 800))
}
renderFire(x,y,v,c) {
let stamp = new Date().getTime();
let temp = d3.range(18).map(d => {
return {
cx: x + 1 * Math.sin(Math.PI * d / 9),
cy: y - 1 * Math.cos(Math.PI * d / 9),
vx: v * Math.sin(Math.PI * d / 9),
vy: - v * Math.cos(Math.PI * d / 9)
}
})
let t = 0;
this._tempObj[stamp] = setInterval(() => {
let cutStamp = new Date().getTime();
for(var i=0; i<18; i++) {
this._svg.append('circle')
.attr('cx', temp[i].cx + temp[i].vx * t / 8)
.attr('cy', t * t / 16 + temp[i].vy * t / 8 + temp[i].cy)
.attr('r', 6)
.attr('fill', this._colors(c))
.attr('fill-opacity', 1)
.transition()
.duration(300)
.attr('fill-opacity', 0)
.on('end', function() {
d3.select(this).remove();
})
}
if(cutStamp - stamp > 2000){
clearInterval(this._tempObj[stamp])
}
t ++;
}, 40)
}
start() {
this.randomPosition();
}
}
2 css 代码
* {
padding:;
margin:;
}
body {
width: 100vw;
height: 100vh;
background: #000000;
}
.container {
width: 100vw;
height: 100vh;
position: relative;
}
img {
width: 100vw;
height: 80vh;
}
svg {
position: absolute;
top:;
left:;
width: 100vw;
height: 100vh;
}
3 html 代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>$Title$</title>
<link rel="stylesheet" type="text/css" href="css/base.css"/>
<script type="text/javascript" src="js/d3.v4.js"></script>
<script type="text/javascript" src="js/base.js"></script>
</head>
<body>
<div class="container">
<img src="img/bg.jpg">
</div>
<script>
var firework = new Firework();
firework.start()
</script>
</body>
</html>
是不是很简单
想预览或者下载demo的人请移步至原文
原文地址 1
d3.js 实现烟花鲜果的更多相关文章
- D3.js学习(七)
上一节中我们学会了如何旋转x轴标签以及自定义标签内容,在这一节中,我们将接触动画(transition) 首先,我们要在页面上添加一个按钮,当我们点击这个按钮时,调用我们的动画.所以,我们还需要在原来 ...
- D3.js学习(一)
从今天开始我将和大家一起学习D3.js(Data-Driven Documents),由于国内关于D3的学习资料少之又少,所以我觉得很有必要把自己学习过程记录下来,供同学们参考,如果文章有有哪些表达有 ...
- D3.js学习记录
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- D3.js部署node环境开发
总结一段D3.js部署node环境的安装过程 准备阶段: 首先电脑上要安装node环境,这个阶段过滤掉,如果node环境都不会装,那就别玩基于node环境搞的其他东西了. 搭建环境: 我在自己的F:系 ...
- d3.js读书笔记-1
d3.js入门 d3入门 D3是一个强大的数据可视化工具,它是基于Javascript库的,用于创建数据可视化图形.在生成可视化图形的过程中,需要以下几步: 把数据加载到浏览器的内存空间: 把数据绑定 ...
- 【 D3.js 进阶系列 — 6.1 】 缩放的应用(Zoom)
缩放(Zoom)是另一种重要的可视化操作,主要是使用鼠标的滚轮进行. 1. zoom 的定义 缩放是由 d3.behavior.zoom() 定义的. var zoom = d3.behavior.z ...
- [资料搜集狂]D3.js数据可视化开发库
偶然看到一个强大的D3.js,存档之. D3.js 是近年来十分流行的一个数据可视化开发库. 采用BSD协议 源码:https://github.com/mbostock/d3 官网:http://d ...
- D3.js 用层画条形图
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 【 D3.js 入门系列 --- 3 】 做一个简单的图表!
前面说了几节,都是对文字进行处理,这一节中将用 D3.js 做一个简单的柱形图. 做柱形图有很多种方法,比如用 HTML 的 div 标签,或用 svg . 推荐用 SVG 来做各种图形.SVG 意为 ...
随机推荐
- 使用Jasypt对SpringBoot配置文件加密
# **前言** 在日前安全形势越来越严重的情况下,让我意识到在项目中存在一个我们经常忽略的漏洞,那就是我们的项目的配置文件中配置信息的安全,尤其是数据库连接的用户名和密码的安全.所以这里我们就需要对 ...
- node 删除和复制文件或文件夹
[toc] 创建时间:2019-08-12 注意:在win10,v10.16.1 环境运行无问题 首先引入相关包(会在使用处具体说明): const fs = require('fs') const ...
- 有一个时间插件引发的关于 newDate().setMonth() 的问题
项目中遇到一个时间插件的BUG,查看源码之后发现是因为setMonth()的问题,使用了之后会某些月份会出现月份加一的问题, 查阅资料后发现 setMonth()其实是设置与当前时间天数相同的月份, ...
- 项目构建分析和 webpack 优化实践
加入新公司一个月,最近接手在做一个 chrom 浏览器插件的项目,开发过程中发现项目打包的时间很长,足足有30多秒,这是让人很难接受的,而且构建的显示了几条包体积过大的提示信息: 可以看到,打包后有三 ...
- Sqlmap过waf命令tamper各脚本的适用环境
0x00 相信很多小伙伴和我一样感同身受,站上明明有注入可是被万恶的WAF拦截了或者过滤了,这时候就需要用到SQLMAP强大的tamper了. 0x01 使用方法--tamper xxx.py apo ...
- 【I'm Telling the Truth】【HDU - 3729】 【匈牙利算法,DFS】
思路 题意:该题主要说几个同学分别说出自己的名次所处区间,最后输出可能存在的未说谎的人数及对应的学生编号,而且要求字典序最大. 思路:刚刚接触匈牙利算法,了解的还不太清楚,附一个专门讲解匈牙利算法的博 ...
- 从零开始一起学习SLAM | 用四元数插值来对齐IMU和图像帧
视觉 Vs. IMU 小白:师兄,好久没见到你了啊,我最近在看IMU(Inertial Measurement Unit,惯性导航单元)相关的东西,正好有问题求助啊 师兄:又遇到啥问题啦? 小白:是这 ...
- MYSQL--存储引擎、数据类型、约束条件、
存储引擎: 不同的数据应该有不同的处理机制 mysql存储引擎 Innodb:默认的存储引擎 查询速度相比于myisam慢 但是更安全 myisam:mysql老版本用的存储引擎 memory:内 ...
- vue-cli+v-charts实现移动端可视化图表
v-charts是饿了么团队开源的一款基于Vue和Echarts的图表工具,在使用 echarts 生成图表时,经常需要做繁琐的数据类型转化.修改复杂的配置项,v-charts 的出现正是为了解决这个 ...
- 微服务架构 - 网关 Spring Cloud Gateway
Spring Cloud Gateway 工作原理 客户端向 Spring Cloud Gateway 发出请求,如果请求与网关程序定义的路由匹配,则将其发送到网关 Web 处理程序,此处理程序运行特 ...