• 售前

  • 售后

热门帖子
入门百科

js canvas实现随机粒子特效

[复制链接]
散粉的火把煌 显示全部楼层 发表于 2021-10-26 12:53:19 |阅读模式 打印 上一主题 下一主题
本文实例为各人分享了js canvas随机粒子特效的详细代码,供各人参考,详细内容如下
媒介
canvas实现前端的特效美术
效果展示

代码
html
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.     <title>Document</title>
  8. </head>
  9. <body>
  10.     <script src="./main.js"></script>
  11. </body>
  12. </html>
复制代码
main.js
  1. /*         
  2. *粒子化类构造
  3.     *类功能:
  4.     *1.初始化。创建画布,规定粒子属性等;
  5.     *2.创建图像并且进行绘制
  6.     *3.区域颜色定义
  7.     *4.粒子移动和偏射角度
  8. */
  9. // 生成粒子
  10. let Particle = function(context, options){
  11.     let random = Math.random();
  12.     this.context = context;
  13.     // 在画布里的x坐标
  14.     this.x = options.x;
  15.     // 在画布里的y坐标
  16.     this.y = options.y;
  17.     // 取随机数的1/2,对角度进行随机放大
  18.     this.s = 0.5 + Math.random();
  19.     // this.s = 1 + Math.random();
  20.     // 粒子运动的变化角度
  21.     this.a = 0;
  22.     // 宽度
  23.     this.w = window.innerWidth;
  24.     // 高度
  25.     this.h = window.innerHeight;
  26.     // 半径
  27.     this.radius = options.radius || 0.5 + Math.random() * 10;
  28.     // 颜色
  29.     this.color = options.color || "#E5483F";
  30.     // console.log(this.color);
  31.     // 指定3秒后调用;
  32.     // 如果粒子的半径大于0.5,加入新的粒子。
  33.     setTimeout(function(){
  34.         if(this.radius > 0.5){
  35.             particles.push(
  36.                 new Particle(context, {
  37.                   x: this.x,
  38.                   y: this.y,
  39.                   color: this.radius / 2 > 1 ? "#d6433b" : "#FFFFFF",
  40.                   radius: this.radius / 2.2 })
  41.             );
  42.         }
  43.     }.call(Particle), 3000);
  44. };
  45. // 渲染图像
  46. Particle.prototype.render = function() {
  47.         //从(0,0)开始新的路径;
  48.         this.context.beginPath();
  49.         // 创建曲线弧
  50.         this.context.arc(this.x, this.y, this.radius, 0, 2 * Math.PI);
  51.         // 绘图的线条宽度
  52.         this.context.lineWidth = 2;
  53.         //颜色填充
  54.         this.context.fillStyle = this.color;
  55.         // 填充当前图像的路径
  56.         this.context.fill();
  57.         // 返回初始点,并且绘制线条到初始位置
  58.         this.context.closePath();
  59. };
  60. Particle.prototype.swapColor = function() {
  61.     // 排除白色
  62.     if (this.color != "#FFFFFF") {
  63.         // 判断左右界面,并且赋颜色的值
  64.         if (this.x < this.w / 2) {
  65.             // 左半边
  66.             this.color = "#36fcfa";            
  67.         } else {
  68.             // 右半边
  69.             this.color = "#E5483F";            
  70.         }
  71.         }
  72.    
  73. };
  74. Particle.prototype.move = function() {
  75.     // 颜色定义
  76.     this.swapColor();
  77.     // 横坐标按照cos角度进行变换,并且对其进行随机数放大;
  78.     // 偏射角度以便两个半界分开
  79.     this.x += Math.cos(this.a) * this.s;
  80.     this.y += Math.sin(this.a) * this.s;
  81.     // this.y += Math.cos(this.a) * this.s;
  82.     // this.x += Math.sin(this.a) * this.s;
  83.     // 在变化后,对随机角度进行再重取;
  84.     this.a += Math.random() * 0.8 - 0.4;
  85.     // 判断全为0,粒子横坐标无移动;
  86.     if (this.x < 0 || this.x > this.w - this.radius) {
  87.       return false;
  88.     }
  89.     // 粒子纵坐标无移动;
  90.     if (this.y < 0 || this.y > this.h - this.radius) {
  91.       return false;
  92.     }
  93.     // 重新绘制图像
  94.     this.render();
  95.     return true;  
  96. };
  97. let canvas = document.createElement('canvas');
  98. canvas.width = window.innerWidth - 20;
  99. canvas.height = window.innerHeight - 30;
  100. document.body.insertBefore(canvas, null);
  101. let context = canvas.getContext('2d');
  102. const conf = {
  103.     frequency: 50,
  104.     x: canvas.width,
  105.     y: canvas.height
  106. };
  107. let particles = [],
  108.     frequency = conf.frequency;
  109. setInterval(function(){
  110.     popolate();
  111. }.bind(null), frequency);
  112. function popolate(){
  113.     particles.push(
  114.         new Particle(context, {
  115.           x: conf.x / 2,
  116.           y: conf.y / 2
  117.         })
  118.     );
  119.     return particles.length;
  120. }
  121. function clear() {
  122.     context.globalAlpha = 0.04;
  123.     context.fillStyle = '#000042';
  124.     context.fillRect(0,0,canvas.width, canvas.height);
  125.     context.globalAlpha = 1;
  126. }
  127. function update(){
  128.     particles = particles.filter(p => p.move());
  129.     clear();
  130.     requestAnimationFrame(arguments.callee);
  131. }
  132. update();
复制代码
以上就是本文的全部内容,盼望对各人的学习有所帮助,也盼望各人多多支持草根技能分享。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作