之前在抖音上看到了一个很漂亮的焰火效果。这会儿有时间就用canvas实现了一下。

演示地址:http://suohb.com/work/firework4.htm

先看效果:(静态图片看不太出效果,请直接查看演示地址,考验电脑CPU的时候到了)

实现原理:

焰火特效运用到的物理知识就是抛物线运动

看起来很复杂的焰火实际上就是一条条的抛物线。

从一个中心点向四周方向抛出一个质点。将质点的轨迹画出来,就是焰火效果了。

//每一个质点对象
1 var obj = {
x: x,//当前X坐标
y: y,//当前Y坐标
sx: Math.cos(deg)*curSpeed,//X轴方向速度
sy: Math.sin(deg)*curSpeed,//Y轴方向速度
len: len + level*10*Math.random(),//焰火显示长度(这么多质点连接起来)
limit: limit + level*10*Math.random(),//质点移动最大步数
color: color,//焰火颜色
level: level,//焰火等级(因为特效是二级焰火,可以做多级)
list:[{x:x,y:y}]//质点轨迹(将这些轨迹连起来就是焰火的其中一条线)
};
//向360度方向生成一批质点,形成一个焰火元素
1 function addFire(x,y,color,level){
curLevel = level ;
var lineLen = 10+level*20 + Math.random()*10,
deg ,
speed = 1 + Math.random()*level*.4 ,
len = 15 + Math.random()*level*6,
limit = len + 4 + Math.random()*level;
for(var i = 0 ; i < lineLen ; i ++){
deg = i*(Math.PI*2/lineLen)+Math.random() ;
var curSpeed = speed + Math.random();
var obj = 质点对象
list.push(obj);
}
}
//更新质点位置,并将新位置插入质点轨迹之中
1 function reviewFire(){
for(var i = 0 ; i <list.length ; i++){
let obj = list[i];
obj.x += obj.sx ;
obj.y += obj.sy ;
obj.sy += G ;//抛物运动中的重力加速度
obj.list.push({x:obj.x,y:obj.y});
obj.list = obj.list.slice(-obj.len);
}
}
//画出轨迹即可
1 function drawFire(){
cxt.clearRect(0,0,pageWidth,pageHeight);
var obj ;
for(var i = 0 ; i < list.length ; i ++){
obj = list[i] ;
cxt.beginPath();
for(var j = 0 ; j < obj.list.length ; j++){
if(i == 0)
cxt.moveTo(obj.list[j].x ,obj.list[j].y);
else{
cxt.lineTo(obj.list[j].x ,obj.list[j].y);
}
}
cxt.strokeStyle = obj.color ;
cxt.lineWidth = obj.level ;
cxt.stroke();
}
}

完整代码:

 <!doctype html>
<html>
<head>
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no" />
<title>焰火特效-长按二维码关注公众号,了解更多特效</title>
<style type="text/css">
html{
height: 100%;
}
html,body,ul,li,canvas{
margin: 0;
padding: 0;
} </style>
</head>
<body bgcolor="#000000">
<canvas id="knife"></canvas>
<img src="../images/qr.jpg" style="position:fixed;bottom:0;width:100px;height:100px;right:0;">
</body>
<script>
var canvas = document.getElementById("knife");
canvas.style.position = "absolute" ;
canvas.style.top = 0 ;
var pageWidth = window.innerWidth ;
var pageHeight = window.innerHeight ;
canvas.width = window.innerWidth ;
canvas.height = window.innerHeight ;
var cxt = canvas.getContext("2d");
var list = [] ;
var G = 0.036 ;
var colors = ["#8b008b","#ff69b4","#7fff00","#1e90ff","#00bfff","#0FF","#7cfc00","#ffd700","#ffdead","#f00"];
var curLevel = 0 ;
var curColor = 0 ; function addFire(x,y,color,level){
curLevel = level ;
var lineLen = 10+level*20 + Math.random()*10,
deg ,
speed = 1 + Math.random()*level*.4 ,
len = 15 + Math.random()*level*6,
limit = len + 4 + Math.random()*level;
for(var i = 0 ; i < lineLen ; i ++){
deg = i*(Math.PI*2/lineLen)+Math.random() ;
var curSpeed = speed + Math.random();
var obj = {
x: x,
y: y,
sx: Math.cos(deg)*curSpeed,
sy: Math.sin(deg)*curSpeed,
len: len + level*10*Math.random(),
limit: limit + level*10*Math.random(),
color: color,
level: level,
list:[{x:x,y:y}]
};
list.push(obj);
}
}
function reviewFire(){
for(var i = 0 ; i <list.length ; i++){
let obj = list[i];
obj.x += obj.sx ;
obj.y += obj.sy ;
obj.sy += G ;
obj.list.push({x:obj.x,y:obj.y});
obj.list = obj.list.slice(-obj.len);
}
}
function drawFire(){
cxt.clearRect(0,0,pageWidth,pageHeight);
var obj ;
for(var i = 0 ; i < list.length ; i ++){
obj = list[i] ;
cxt.beginPath();
for(var j = 0 ; j < obj.list.length ; j++){
if(i == 0)
cxt.moveTo(obj.list[j].x ,obj.list[j].y);
else{
cxt.lineTo(obj.list[j].x ,obj.list[j].y);
}
}
cxt.strokeStyle = obj.color ;
cxt.lineWidth = obj.level ;
cxt.stroke();
}
}
function step(){
if(curLevel == 1 && list.length == 0){
addFire(pageWidth/2,100,colors[curColor ++ % colors.length],2);
}
reviewFire();
drawFire();
requestAnimationFrame(step)
}
requestAnimationFrame(step)
addFire(pageWidth/2,100,colors[curColor ++ % colors.length],2);
</script>
</html>

了解更多特效,请关注我的微信公众号:

canvas焰火特效的更多相关文章

  1. 纯JavaScript实现HTML5 Canvas六种特效滤镜

    纯JavaScript实现HTML5 Canvas六种特效滤镜  小试牛刀,实现了六款简单常见HTML5 Canvas特效滤镜,并且封装成一个纯 JavaScript可调用的API文件gloomyfi ...

  2. 16个富有创意的HTML5 Canvas动画特效集合

    HTML5技术正在不断的发展和更新,越来越多的开发者也正在加入HTML5阵营,甚至在移动开发上HTML5的地位也是越来越重要了.HTML5中的大部分动画都是通过Canvas实现,因为Canvas就像一 ...

  3. 分享8款令人惊叹的HTML5 Canvas动画特效

    HTML5的确可以制作出非常绚丽的网页动画效果,尤其是利用HTML5 Canvas特性和HTML5 3D特性,我们更加可以欣赏到超酷的动画特效.今天我从html5tricks网站上整理了8款令人惊叹的 ...

  4. 16个非常有趣的HTML5 Canvas动画特效集合

    HTML5技术正在不断的发展和更新,越来越多的开发者也正在加入HTML5阵营,甚至在移动开发上HTML5的地位也是越来越重要了.HTML5中的大部分动画都是通过Canvas实现,因为Canvas就像一 ...

  5. 几十行js实现很炫的canvas交互特效

    几十行js实现很炫的canvas交互特效 废话不多说,先上效果图! 本篇文章的示例代码都是抄的一个叫Franks的老外在yutube上的一个教学视频,他还出了很多关于canvas的视频,十分值得学习, ...

  6. html5 canvas 粒子特效

    不知不觉就已经好久没写过博客了,自从七月正式毕业后,离开了实习了将近九个月的老东家,进了鼠厂后,做的事都是比较传统的前端活,之前在tpy的时候只管做移动h5的特效以及小游戏,再加上实习所以时间比较充裕 ...

  7. canvas百分百特效

    这个特效是别的人,非原创.原创地址 http://blog.csdn.net/lecepin/article/details/53536445 背后的水是可以动的 代码我再研究了下,下面是加了注释的代 ...

  8. canvas雪花特效-jQuery插件实现

    这是一款效果十分逼真的html5 canvas下雪场景动画特效插件.这款下雪特效是基于Jason Brown的Snowfall jquery plugin的基础上制作的.在Snowfall jquer ...

  9. canvas入门级基本用法实现雨滴下落特效

    canvas基础知识点参考各种文档,直接上代码,有非常详细注释 <!DOCTYPE html> <html> <head> <meta charset=&qu ...

随机推荐

  1. Windows Azure Platform Introduction (14) 申请海外的Windows Azure账户

    <Windows Azure Platform 系列文章目录> 本文的最后更新时间为:2017-12-27 本文介绍国内用户,注册和使用海外Azure账户. 前提: 1.需要一个有效的Wi ...

  2. Alex: 2018年对混合现实MR的展望

    原文作者:Alex Kipman, 微软操作系统工程院技术院士 Hello 大家好! 难以置信我们已经走过了2018年的头两个月了. 每年一月份我都会去巴西省亲,和我的家人欢聚一堂,度过一个美好的假日 ...

  3. ionic2+Angular web端 实现微信分享以及如何跳转回分享出去的页面

    微信分享,首先参考微信JS-SDK开发文档. step1:在启动文件index.html中引入微信js文件: <script src="http://res.wx.qq.com/ope ...

  4. NoSQL性能测试工具YCSB-Running a Workload

    写在前面 目前,在系统设计中引入了越来越多的NoSQL产品,例如Redis/ MongoDB/ HBase等,其中性能指标往往会成为权衡不同NoSQL产品的关键因素.对这些产品在性能表现和产品选择上的 ...

  5. SpringMVC+FreeMarker实现静态资源文件自动添加版本号(md5)

    近日切换java开发,开始学习springframework.在实现静态资源文件自动计算版本号的实例时,因为不熟悉框架,走了不少弯路,好在最终解决了问题.这里写篇文章记录一下实现,也希望对大家有些用处 ...

  6. Shell脚本报错:-bash: ./switch.sh: /bin/bash^M: bad interpreter: No such file or directory

    在学习shell中测试case参数命令代码如下 #!/bin/bash #switch测试 case $1 in     start)         echo 'start'     ;;      ...

  7. 项目中AppDelegate详解

    1.AppDelegate.h //模板默认引入程序需要使用“类”的框架,即UIKit.h头文件,使它包含在程序中 #import <UIKit/UIKit.h> //此处@class声明 ...

  8. 1×1卷积的用途(Network in Network)

    1×1卷积,又称为Network in Network 如果卷积的输出输入都只是一个平面,那么1x1卷积核并没有什么意义,它是完全不考虑像素与周边其他像素关系. 但卷积的输出输入是长方体,所以1x1卷 ...

  9. 阿里巴巴十年Java架构师分享,会了这个知识点的人都去BAT了

    1.源码分析专题 详细介绍源码中所用到的经典设计思想,看看大牛是如何写代码的,提升技术审美.提高核心竞争力. 帮助大家寻找分析源码的切入点,在思想上来一次巨大的升华.知其然,并知其所以然.把知识变成自 ...

  10. hdu 1207 四柱汉诺塔

    递推,汉诺塔I的变形. 这题真心没想到正确解法,越想越迷糊.这题看了别人题解过得,以后还是自己多想想,脚步太快并非好事. 贴上分析:   分析:设F[n]为所求的最小步数,显然,当n=1时,F[n]= ...