JavaScript动画特效——Canvas粒子动画

这次,将制作飘雪的效果,如果用CSS动画样式来做的话,可以想象,那是有多么难。所以就用JavaScript来制作。

Canvas官方教程,很详细http://canvas.migong.org/category/canvas-animation

要使用Canvas,则需要在HTML中插入相应的DOM结构:

<canvas id="myCanvas" width="1000" height="600">Your brower does not support the Canvas element.</canvas>

上面英文的意思是:“你的浏览器不支持Canvas元素”。这样在浏览器不支持Canvas时就会显示这句话。此外,设置页面的背景颜色,以及Canvas的宽度和高度,让其充满整个浏览器屏幕:

            body{
                background:#0c0c0c;
                margin: 0;
                padding: 0;
            }
            html, body{
                height: 100%;
                width: 100%;
            }
            #myCanvas{
                height: 100%;
                width: 100%;
                display: block;
            }

之后,就开始写 JavaScript 代码:

var canvas=document.getElementById("myCanvas");  //获取Canvas元素
var context=canvas.getContext("2d"); //返回一个对象,该对象提供了用于在画布上绘图的方法和属性

接下来,创建一个数组保存所有雪花的信息:

var particles = []; //为粒子创建一个数组
for (var i = 0; i < 500; i++)   //生成500个雪花
{
    particles.push({ //设置雪花的初始 x,y 的位置,x,y 方向上的速度,以及雪花的大小、颜色
        x: Math.random() * window.innerWidth,
        y: Math.random() * window.innerHeight,
        vx: (Math.random() * 1 - 0.5),  // (-0.5,0.5)范围
        vy: (Math.random() * 1 + 0.5),  // (0.5,1.5)范围
        size: 2 + Math.random() * 2,
        color: '#' + ('00000' + (Math.random() * 0x1000000<<0).toString(16)).slice(-6)
    });
}

上面我们生成了500个雪花粒子,每个雪花粒子都包含:x坐标、y坐标、x方向速度、y方向速度、大小值、颜色。每组数据是一个字典,再push到数组中。


上面代码只是设置了雪花的基本信息。接着,我们要让雪花显示出来:首先,用clearRect()把画布清空。接着,绘制每一朵雪花。先计算每朵雪花移动后的x和y的位置,包含了超出浏览器边界的判断。设置好每个雪花的颜色后,使用 context 的beginPath()方法开始雪花的绘制,圆形的设置通过arc()反三角函数来实现,绘制结束后调用closePath()方法闭合路径,最后用fill()方法填充颜色。最后的setInterval函数是每隔40毫秒执行一次timeUpdata函数,已达到雪花连绵不绝的效果。

function timeUpdate(e){
     context.clearRect(0, 0, window.innerWidth, window.innerHeight);  //清除画布区域
     var particle;
     for (var i = 0; i < 500; i++)   //循环比那里所有雪花
     {
         particle = particles[i];
         particle.x += particle.vx;
         particle.y += particle.vy;
         if (particle.x < 0) {
             particle.x = window.innerWidth;  // 当雪花移动到窗口左侧以外的地方时,使其显示在窗口最右侧
         }
         if (particle.x > window.innerWidth) { // 当雪花移动到窗口右侧以外的地方时,使其显示在窗口最左侧
             particle.x = 0;
         }
         if (particle.y >= window.innerHeight) { // 因为速度是大于 0 的,所以不会小于底部
             particle.y = 0;  // 当雪花移动到窗口顶部以外时,重新显示在窗口最顶部
         }
         context.fillStyle = particle.color;  // 设置雪花的颜色
         context.beginPath(); //开始绘制雪花
         context.arc(particle.x, particle.y, particle.size, 0, Math.PI * 2); // 绘制图形
         context.closePath(); //闭合路径
         context.fill(); //填充颜色
     }
 }
 setInterval(timeUpdate, 40);  // 每过40毫秒执行一次 timeUpdate 函数

在这里插入图片描述

发布了145 篇原创文章 · 获赞 34 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43207025/article/details/100848493
今日推荐