HTML+CSS+JS实现雪花飘扬「代码分享」

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的使用方法,并提高自己的前端技术。