## 雪花纷飞
![](https://box.kancloud.cn/c6e3aaada07497d462baeddee055ecb2_300x311.gif)
这一节我们讲解使用HTML5 canvas制作的效果非常炫酷的3D雪花飘落特效。
**1、创建模板**
一个简单的div:
```
<div class="canvas"></div>
```
当然,你也可以直接放置`canvas`,我这里是通过动态绘制的,背景图也是动态绘制的。
**2、JavaScript**
既然是雪花纷飞,当然先来定义雪花:
```
function Item(x, y, r) {
this.x = x;
this.y = y;
this.r = r;
this.vx = 0;
this.vy = 5;
this.deg = 0;
}
```
在上面的代码中,我们创建一个Item对象,用来保存每一片雪花的数据。
然后用一个数组来保存当前所有雪花:
```
var items = [];
```
雪花纷飞的难点在于如何仿雪花,只需这样:
```
var rg = ctx.createRadialGradient(body.x, body.y, Math.floor(body.r / 4), body.x, body.y, body.r);
rg.addColorStop(0, "rgba(255,255,255,1)");
rg.addColorStop(1, "rgba(255,255,255,0.1)");
ctx.fillStyle = rg;
ctx.beginPath();
ctx.arc(body.x, body.y, body.r, 0, 2 * Math.PI, true);
ctx.fill();
```
利用径向渐变功能来实现雪花。
让雪花动起来:
```
items[i].x += items[i].vx;
items[i].y += items[i].vy;
```
让其x和y与速度相加既可以。
最后,我们使用`requestAnimationFrame()`方法来实现循环动画(你也可以使用计时器)。
这里还需注意一点的是,为了提高效率,我们需要将每一次离开屏幕的雪花移除(也就是从items数组中移除)。
```
var i = items.length;
while (i--) {
//判断是否离开画面
if (x1 > width || x1 < 0 || y1 > height) {
items.splice(i, 1);
} else {
items[i].x += items[i].vx;
items[i].y += items[i].vy;
drawItem(items[i]);
};
};
```
这样,我们就实现了雪花纷飞的效果。
源码路径:`WebDemo/Canvas/snow`
- 概述
- CSS实战篇
- 白光划过效果
- 3D立方体
- 水中倒影
- 工具提示(tooltip)
- 单选复选
- Loading
- 图片滤镜
- 阴影(box-shadow)
- 3D按钮
- 自定义滚动条
- 文字效果
- 多彩的渐变
- 进度条
- 遮罩条
- 切角
- 表单
- 溢出省略号
- 自定义选择文本样式
- 表格
- 导航菜单
- 动态的边框
- 文件上传组件美化
- 打字机效果
- 多形状图像
- 心跳灯和呼吸灯
- 竖着排的文字
- 面包屑导航
- 首字母下沉
- 美化有序列表
- 缎带效果
- JavaScript实战篇
- 点击水波效果
- 手风琴布局
- 收缩菜单
- 滑块
- 瀑布流
- 下拉菜单
- 幻灯片
- 选项卡
- 全屏滚动
- 富文本编辑器
- 带表情输入的评论框
- 图片懒加载
- 开启全屏
- 返回顶部
- 上传图片预览
- 走马灯
- 万年历
- 树形菜单
- 旋转加载
- 固定头的表格
- 圆形水波纹加载进度
- 检测是否移动端
- 搜索过滤
- 弹幕
- 自定义滚动条
- 城市联动选择器
- 滚动监听
- 边栏悬浮菜单
- canvas实战篇
- 雪花纷飞
- 粒子动画
- 刮刮卡
- 手势密码
- 截图下载
- 图片放大器
- 粒子聚合
- 移动实战篇
- 列表滑动删除
- 移动联动选择器
- 模板预览
- 源码下载
- 《JavaScript半知半解》电子版