JavaScript canvas实现流星特效


Posted in Javascript onMay 20, 2021

本文实例为大家分享了JavaScript canvas实现流星特效展示的具体代码,供大家参考,具体内容如下

1、控制透明度变化函数

function easeInQuad(curtime,begin,end,duration){
            let x = curtime/duration; //x值
            let y = x*x; //y值
            return begin+(end-begin)*y; //套入最初的公式
        }
        //用平方根构建的缓慢减速运动  核心函数:x*x + 2*x
function easeOutQuad(curtime,begin,end,duration){
            let x = curtime/duration;         //x值
            let y = -x*x + 2*x;  //y值
            return begin+(end-begin)*y;        //套入最初的公式
        }
function easeInoutQuad(curtime,begin,end,duration){
            if(curtime<duration/2){ //前半段时间
                return easeInQuad(curtime,begin,(begin+end)/2,duration/2);//改变量和时间都除以2
            }else{
                let curtime1 = curtime-duration/2; //注意时间要减去前半段时间
                let begin1 = (begin+end)/2;//初始量要加上前半段已经完成的
                return easeOutQuad(curtime1,begin1,end,duration/2);//改变量和时间都除以2
            }
}

2、流星星体光环的闪烁特效

function intervalOpcity (cur=0,start=0.3,end=0.8,dur=3) {
            if(fadeOpcity(cur,start,end,dur)===end){
                cur = 0
                let temp = start
                start = end 
                end = temp
            }
            let opcity = fadeOpcity(cur,start,end,dur)
            let color = `rgba(0,0,0,${opcity})`
            clearBgcolor(wrap)
            newParticle (wrap,[x,y],r,color)
            cur=parseFloat(cur+0.1)
            setTimeout(()=>{intervalOpcity (cur,start,end,dur)},33)
}

3、流星尾巴

function intervalMove (speed,g=0) {
            if(g===720){
                g = 360
            }
            g = g+speed
            let nextPosition = movePosition (a,g,startPosition)
            x = nextPosition[0]
            y = nextPosition[1]
            clearBgcolor(wrap1)
            for(let i =1;i<=360;i++){
                let g1 = g-i/2
                if(g1<0&&g<=360){
                    break
                }
                let g1Position = movePosition (a,g1,startPosition)
                newParticle (wrap1,[g1Position[0],g1Position[1]],r/(1+i/5),`rgba(255,200,200,0.5)`)
            }
            setTimeout(()=>{intervalMove (speed,g)},33)
        }

4、完整代码

function easeInQuad(curtime,begin,end,duration){
            let x = curtime/duration; //x值
            let y = x*x; //y值
            return begin+(end-begin)*y; //套入最初的公式
        }
        //用平方根构建的缓慢减速运动  核心函数:x*x + 2*x
        function easeOutQuad(curtime,begin,end,duration){
            let x = curtime/duration;         //x值
            let y = -x*x + 2*x;  //y值
            return begin+(end-begin)*y;        //套入最初的公式
        }
        function easeInoutQuad(curtime,begin,end,duration){
            if(curtime<duration/2){ //前半段时间
                return easeInQuad(curtime,begin,(begin+end)/2,duration/2);//改变量和时间都除以2
            }else{
                let curtime1 = curtime-duration/2; //注意时间要减去前半段时间
                let begin1 = (begin+end)/2;//初始量要加上前半段已经完成的
                return easeOutQuad(curtime1,begin1,end,duration/2);//改变量和时间都除以2
            }
        }
        function newCanvas (width,height) {
            let bodyEl = document.body
            let canvasEl = document.createElement("canvas")
            canvasEl.width = width
            canvasEl.height = height
            canvasEl.style.position = "absolute"
            bodyEl.append(canvasEl)
            let wrap = canvasEl.getContext("2d")
            return wrap
        }
        function setBgcolor (wrap,color) {
            wrap.fillStyle=color;
            wrap.fillRect(0,0,wrap.canvas.width,wrap.canvas.height);
        }
        function clearBgcolor(wrap){
            wrap.clearRect(0,0,wrap.canvas.width,wrap.canvas.height)
        } 
        function newParticle (wrap,position,r,color) {
            let x = position[0]
            let y = position[1]
            wrap.fillStyle=color;
            wrap.beginPath();
            wrap.arc(x,y,r,0,2*Math.PI);
            wrap.shadowBlur=20;
            wrap.shadowColor=`rgba(255,255,255,0.8)`;
            wrap.fill();
        }
        function fadeOpcity(cur,start,end,dur){
            let opcity = parseFloat(easeInoutQuad(cur,start,end,dur).toFixed(2)) 
            return opcity
        }
       let wrap0 = newCanvas (1000,800)
       let wrap2 = newCanvas (1000,800)
       let wrap = newCanvas (1000,800)
       let wrap1 = newCanvas (1000,800)
       
        setBgcolor (wrap0,"black")
        setBgcolor (wrap,"rgba(0,0,0,0)")
        setBgcolor (wrap1,"rgba(0,0,0,0)")
        setBgcolor (wrap2,"rgba(0,0,0,0)")
        let startPosition = [500,200]
        let r = 10
        let a = -200
        let x =  a*(1-Math.cos(0))*Math.sin(0)+startPosition[0]
        let y = a*(1-Math.cos(0))*Math.cos(0)+startPosition[1]
        function movePosition (a,g,startPosition) {
            let t = Math.PI*2/360
            let x = a*(1-Math.cos(g*t))*Math.sin(g*t)+startPosition[0]
            let y = a*(1-Math.cos(g*t))*Math.cos(g*t)+startPosition[1]
            return [x,y]
        }
        function intervalMove (speed,g=0) {
            if(g===720){
                g = 360
            }
            g = g+speed
            let nextPosition = movePosition (a,g,startPosition)
            x = nextPosition[0]
            y = nextPosition[1]
            clearBgcolor(wrap1)
            for(let i =1;i<=360;i++){
                let g1 = g-i/2
                if(g1<0&&g<=360){
                    break
                }
                let g1Position = movePosition (a,g1,startPosition)
                newParticle (wrap1,[g1Position[0],g1Position[1]],r/(1+i/5),`rgba(255,200,200,0.5)`)
            }
            setTimeout(()=>{intervalMove (speed,g)},33)
        }

        function intervalOpcity (cur=0,start=0.3,end=0.8,dur=3) {
            if(fadeOpcity(cur,start,end,dur)===end){
                cur = 0
                let temp = start
                start = end 
                end = temp
            }
            let opcity = fadeOpcity(cur,start,end,dur)
            let color = `rgba(0,0,0,${opcity})`
            clearBgcolor(wrap)
            newParticle (wrap,[x,y],r,color)
            cur=parseFloat(cur+0.1)
            setTimeout(()=>{intervalOpcity (cur,start,end,dur)},33)
        }
intervalOpcity ()
intervalMove (1)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
表单的一些基本用法与技巧
Jul 15 Javascript
ECMAScript5中的对象存取器属性:getter和setter介绍
Dec 08 Javascript
如何用js 实现依赖注入的思想,后端框架思想搬到前端来
Aug 03 Javascript
一步步教大家编写酷炫的导航栏js+css实现
Mar 14 Javascript
angular+ionic 的app上拉加载更新数据实现方法
Jan 16 Javascript
微信小程序开发之入门实例教程篇
Mar 07 Javascript
Node.js中.pfx后缀文件的处理方法
Mar 10 Javascript
vue生成token并保存到本地存储中
Jul 17 Javascript
angular2组件中定时刷新并清除定时器的实例讲解
Aug 31 Javascript
JS回调函数原理与用法详解【附PHP回调函数】
Jul 20 Javascript
解决小程序无法触发SESSION问题
Feb 03 Javascript
多个Vue项目部署到服务器的步骤记录
Oct 22 Javascript
vue使用节流函数的踩坑实例指南
vue实现同时设置多个倒计时
May 20 #Vue.js
Vue和Flask通信的实现
JavaScript实现班级抽签小程序
May 19 #Javascript
JS实现扫雷项目总结
深入浅析React中diff算法
May 19 #Javascript
Vue Element UI自定义描述列表组件
You might like
如何获得PHP相关资料
2006/10/09 PHP
php 远程图片保存到本地的函数类
2008/12/08 PHP
深入PHP nl2br()格式化输出的详解
2013/06/05 PHP
深入PHP5中的魔术方法详解
2013/06/17 PHP
汉化英文版的Dreamweaver CS5并自动提示jquery
2010/11/25 Javascript
jquery插件制作教程 txtHover
2012/08/17 Javascript
基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
2013/05/07 Javascript
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
javascript判断office版本示例
2014/04/11 Javascript
javascript在IE下trim函数无法使用的解决方法
2014/09/12 Javascript
JavaScript实现获取dom中class的方法
2015/02/09 Javascript
JQuery中ajax方法访问web服务实例
2015/07/18 Javascript
js生成随机数的过程解析
2015/11/24 Javascript
Javascript实现检测客户端类型代码封包
2015/12/03 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
如何获取元素的最终background-color
2017/02/06 Javascript
vue实现app页面切换动画效果实例
2017/05/23 Javascript
angular4 JavaScript内存溢出问题
2018/03/06 Javascript
JavaScript实现短暂提示框功能
2018/04/04 Javascript
python进阶教程之循环对象
2014/08/30 Python
Python2中的raw_input() 与 input()
2015/06/12 Python
Python装饰器入门学习教程(九步学习)
2016/01/28 Python
python里使用正则的findall函数的实例详解
2017/10/19 Python
Python selenium抓取微博内容的示例代码
2018/05/17 Python
python高效过滤出文件夹下指定文件名结尾的文件实例
2018/10/21 Python
Django框架之登录后自定义跳转页面的实现方法
2019/07/18 Python
TensorFlow MNIST手写数据集的实现方法
2020/02/05 Python
python圣诞树编写实例详解
2020/02/13 Python
老海军美国官网:Old Navy
2016/09/05 全球购物
联想台湾官网:Lenovo TW
2018/05/09 全球购物
自我评价优秀范文分享
2013/11/30 职场文书
小学生作文评语大全
2014/04/21 职场文书
学校学期工作总结
2015/08/13 职场文书
2016年教师党员承诺书范文
2016/03/24 职场文书
如何利用python实现列表嵌套字典取值
2022/06/10 Python
详解Spring Security如何在权限中使用通配符
2022/06/28 Java/Android