1. 实现效果介绍
在冬季,雪花纷飞是一个非常常见的场景,现在我们将会使用HTML,CSS和JS来实现从上往下飘落的雪花效果。
2. HTML结构编写
在HTML部分,我们将会添加一个画布元素来实现雪花的飘落效果。代码如下:
<canvas id="snow"></canvas>
3. CSS样式编写
在CSS部分中,我们需要设置画布元素的宽度和高度,并将其背景颜色设置为黑色。同时为了防止画布中元素溢出,我们还需要隐藏其溢出的部分。
#snow {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
background-color: #000;
overflow: hidden;
}
4. JS编写
4.1 绘制雪花
我们需要先定义一个雪花类,包括雪花的大小,速度,位置等属性,并在类的原型链上定义一个draw方法,用来绘制雪花。代码如下:
function Flake(canvas, x, y) {
this.canvas = canvas;
this.ctx = canvas.getContext("2d");
this.x = x;
this.y = y;
this.size = Math.random() * 3;
this.speed = Math.random() * 1.5 + 0.5;
}
Flake.prototype.draw = function () {
this.ctx.beginPath();
this.ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
this.ctx.fillStyle = "#fff";
this.ctx.fill();
};
在这里,我们使用了canvas的API来绘制一个圆,然后填充白色作为雪花元素。其中size属性是 雪花大小,speed属性是雪花下落速度。
4.2 绘制落雪
接下来,我们需要定义一个fall方法,用来使雪花下落,并在画布的上方生成新的雪花,模拟雪花生成的过程。代码如下:
Flake.prototype.fall = function (interval) {
var angle = Math.PI / 6;
var x = this.x + Math.cos(angle) * this.speed;
var y = this.y + Math.sin(angle) * this.speed;
if (x > this.canvas.width || x < 0 || y > this.canvas.height || y < 0) {
this.y = 0;
this.x = Math.random() * this.canvas.width;
} else {
this.y = y;
this.x = x;
}
this.draw();
};
在这里,我们首先计算雪花的新位置,然后判断当前雪花是否已经到达画布底部,如果是,则重新生成一个新的雪花;否则,则更新雪花的位置并调用draw函数进行绘制。
4.3 初始化雪花并执行落雪动画
我们需要先定义一些变量,包括画布元素,雪花数组和定时器。
var canvas = document.getElementById("snow");
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
var ctx = canvas.getContext("2d");
var flakes = [];
var interval = 25;
var timer = setInterval(function () {
ctx.clearRect(0, 0, canvas.width, canvas.height);
flakes.forEach(function (flake) {
flake.fall(interval);
});
}, interval);
在这里,我们首先获取了画布元素,并设置了其宽度和高度为整个窗口的宽度和高度。然后,我们创建了一个雪花数组,并使用setInterval函数来定时执行落雪动画。在定时器中,我们首先使用clearRect函数清空画布,然后遍历雪花数组,依次调用每个雪花的fall方法。
5. 完整代码
将以上各部分代码进行整合,实现了一个完整的雪花飘落效果。代码如下:
<canvas id="snow"></canvas>
#snow {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
background-color: #000;
overflow: hidden;
}
function Flake(canvas, x, y) {
this.canvas = canvas;
this.ctx = canvas.getContext("2d");
this.x = x;
this.y = y;
this.size = Math.random() * 3;
this.speed = Math.random() * 1.5 + 0.5;
}
Flake.prototype.draw = function () {
this.ctx.beginPath();
this.ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
this.ctx.fillStyle = "#fff";
this.ctx.fill();
};
Flake.prototype.fall = function (interval) {
var angle = Math.PI / 6;
var x = this.x + Math.cos(angle) * this.speed;
var y = this.y + Math.sin(angle) * this.speed;
if (x > this.canvas.width || x < 0 || y > this.canvas.height || y < 0) {
this.y = 0;
this.x = Math.random() * this.canvas.width;
} else {
this.y = y;
this.x = x;
}
this.draw();
};
var canvas = document.getElementById("snow");
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
var ctx = canvas.getContext("2d");
var flakes = [];
var interval = 25;
var timer = setInterval(function () {
ctx.clearRect(0, 0, canvas.width, canvas.height);
flakes.forEach(function (flake) {
flake.fall(interval);
});
}, interval);
总结
在本篇文章中,我们使用HTML,CSS和JS实现了一个从上往下飘落的雪花效果。在实现过程中,我们使用了canvas的API来绘制图形,并使用定时器来模拟雪花的飘落过程。希望这篇文章可以帮助大家更好地了解canvas的使用方法,并提高自己的前端技术。