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 相关文章推荐
再谈ie和firefox下的document.all属性
Oct 21 Javascript
javascript 子窗体父窗体相互传值方法
May 31 Javascript
非常强大的 jQuery.AsyncBox 弹出对话框插件
Aug 29 Javascript
服务器端的JavaScript脚本 Node.js 使用入门
Mar 07 Javascript
js保留小数点后几位的写法
Jan 03 Javascript
JavaScript实现瀑布流布局
Jun 28 Javascript
浅谈javascript中的call、apply、bind
Mar 06 Javascript
关于iframe跨域POST提交的方法示例
Jan 15 Javascript
JS对象创建的几种方式整理
Feb 28 Javascript
从Vuex中取出数组赋值给新的数组,新数组push时报错的解决方法
Sep 18 Javascript
Vue循环遍历选项赋值到对应控件的实现方法
Jun 22 Javascript
微信小程序实现下拉加载更多商品
Dec 29 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实现把MySQL数据库导出为.sql文件实例(仿PHPMyadmin导出功能)
2014/05/10 PHP
将二维数组转为一维数组的2种方法
2014/05/26 PHP
用 JSON 处理缓存
2007/04/27 Javascript
javascript appendChild,innerHTML,join性能比较代码
2009/08/29 Javascript
document.createElement()用法及注意事项(ff下不兼容)
2013/03/13 Javascript
jquery中的常用事件bind、hover、toggle等示例介绍
2014/07/21 Javascript
原生JS实现响应式瀑布流布局
2015/04/02 Javascript
解读Bootstrap v4 sass设计
2016/05/29 Javascript
JS for循环中i++ 和 ++i的区别介绍
2016/07/20 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
2016/11/03 Javascript
Bootstrap实现导航栏的2种方式
2016/11/28 Javascript
vue cli使用绝对路径引用图片问题的解决
2017/12/06 Javascript
vue 录制视频并压缩视频文件的方法
2018/07/27 Javascript
js代码规范之Eslint安装与配置详解
2018/09/08 Javascript
Vue组件间通信 Vuex的用法解析
2019/08/05 Javascript
VUE DEMO之模拟登录个人中心页面之间数据传值实例
2019/10/31 Javascript
javascript实现贪吃蛇小游戏
2020/07/28 Javascript
vue 在methods中调用mounted的实现操作
2020/08/07 Javascript
jQuery+ajax实现文件上传功能
2020/12/22 jQuery
[26:40]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第一局
2016/02/25 DOTA
[52:36]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python简单线程和协程学习心得(分享)
2017/06/14 Python
python Flask实现restful api service
2017/12/04 Python
Python实现识别图片内容的方法分析
2018/07/11 Python
python处理multipart/form-data的请求方法
2018/12/26 Python
python 读取Linux服务器上的文件方法
2018/12/27 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
2020/07/14 Python
乐高奥地利官方商店:LEGO Shop AT
2019/07/16 全球购物
电厂厂长岗位职责
2014/01/02 职场文书
政法干警核心价值观心得体会
2014/09/11 职场文书
党员四风问题对照检查材料思想汇报
2014/09/16 职场文书
免职证明样本
2014/10/23 职场文书
小班教师个人总结
2015/02/05 职场文书
毕业论文指导老师意见
2015/06/04 职场文书
(开源)微信小程序+mqtt,esp8266温湿度读取
2021/04/02 Javascript
python pandas 解析(读取、写入)CSV 文件的操作方法
2022/12/24 Python