好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

js canvas实现随机粒子特效

本文实例为大家分享了js canvas随机粒子特效的具体代码,供大家参考,具体内容如下

前言

canvas实现前端的特效美术

结果展示

代码

html

?

<!DOCTYPE html>

< html lang = "en" >

< head >

     < meta charset = "UTF-8" >

     < meta http-equiv = "X-UA-Compatible" content = "IE=edge" >

     < meta name = "viewport" content = "width=device-width, initial-scale=1.0" >

     < title >Document</ title >

</ head >

< body >

     < script src = "./main.js" ></ script >

</ body >

</ html >

main.js

?

/*         

*粒子化类构造

     *类功能:

     *1.初始化。创建画布,规定粒子属性等;

     *2.创建图像并且进行绘制

     *3.区域颜色定义

     *4.粒子移动和偏射角度

*/

 

// 生成粒子

let Particle = function (context, options){

     let random = Math.random();

     this .context = context;

     // 在画布里的x坐标

     this .x = options.x;

     // 在画布里的y坐标

     this .y = options.y;

     // 取随机数的1/2,对角度进行随机放大

     this .s = 0.5 + Math.random();

     // this.s = 1 + Math.random();

     // 粒子运动的变化角度

     this .a = 0;

     // 宽度

     this .w = window.innerWidth;

     // 高度

     this .h = window.innerHeight;

     // 半径

     this .radius = options.radius || 0.5 + Math.random() * 10;

     // 颜色

     this .color = options.color || "#E5483F" ;

     // console.log(this.color);

     // 指定3秒后调用;

     // 如果粒子的半径大于0.5,加入新的粒子。

     setTimeout( function (){

         if ( this .radius > 0.5){

             particles.push(

                 new Particle(context, {

                   x: this .x,

                   y: this .y,

                   color: this .radius / 2 > 1 ? "#d6433b" : "#FFFFFF" ,

                   radius: this .radius / 2.2 })

             );

         }

     }.call(Particle), 3000);

};

 

// 渲染图像

Particle.prototype.render = function () {

         //从(0,0)开始新的路径;

         this .context.beginPath();

         // 创建曲线弧

         this .context.arc( this .x, this .y, this .radius, 0, 2 * Math.PI);

         // 绘图的线条宽度

         this .context.lineWidth = 2;

         //颜色填充

         this .context.fillStyle = this .color;

         // 填充当前图像的路径

         this .context.fill();

         // 返回初始点,并且绘制线条到初始位置

         this .context.closePath();

};

 

Particle.prototype.swapColor = function () {

     // 排除白色

     if ( this .color != "#FFFFFF" ) {

         // 判断左右界面,并且赋颜色的值

         if ( this .x < this .w / 2) {

             // 左半边

             this .color = "#36fcfa" ;           

         } else {

             // 右半边

             this .color = "#E5483F" ;           

         }

         }

    

};

 

Particle.prototype.move = function () {

     // 颜色定义

     this .swapColor();

 

     // 横坐标按照cos角度进行变换,并且对其进行随机数放大;

     // 偏射角度以便两个半界分开

     this .x += Math.cos( this .a) * this .s;

     this .y += Math.sin( this .a) * this .s;

 

     // this.y += Math.cos(this.a) * this.s;

     // this.x += Math.sin(this.a) * this.s;

     // 在变化后,对随机角度进行再重取;

     this .a += Math.random() * 0.8 - 0.4;

 

     // 判断全为0,粒子横坐标无移动;

     if ( this .x < 0 || this .x > this .w - this .radius) {

       return false ;

     }

     // 粒子纵坐标无移动;

     if ( this .y < 0 || this .y > this .h - this .radius) {

       return false ;

     }

 

     // 重新绘制图像

     this .render();

 

     return true ; 

};

 

 

let canvas = document.createElement( 'canvas' );

canvas.width = window.innerWidth - 20;

canvas.height = window.innerHeight - 30;

document.body.insertBefore(canvas, null );

let context = canvas.getContext( '2d' );

 

const conf = {

     frequency: 50,

     x: canvas.width,

     y: canvas.height

};

 

let particles = [],

     frequency = conf.frequency;

 

setInterval( function (){

     popolate();

}.bind( null ), frequency);

 

function popolate(){

     particles.push(

         new Particle(context, {

           x: conf.x / 2,

           y: conf.y / 2

         })

     );

 

     return particles.length;

}

 

function clear() {

     context.globalAlpha = 0.04;

     context.fillStyle = '#000042' ;

     context.fillRect(0,0,canvas.width, canvas.height);

     context.globalAlpha = 1;

}

 

function update(){

     particles = particles.filter(p => p.move());

     clear();

     requestAnimationFrame(arguments.callee);

}

 

update();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/u013362192/article/details/115222568

dy("nrwz");

查看更多关于js canvas实现随机粒子特效的详细内容...

  阅读:33次