利用canvas,实现一个下雪的效果,我们先预览下效果:

我们先分析下这个效果:

1,随机产生雪花

2,雪花的产生不是同时产生,而是有先后顺序的

3,雪花怎么表示

4,怎么源源不断的下雪

5,雪花有大有小

搞清楚上面几个问题之后,这个效果基本上就实现了,

首先,由于这个是全屏效果,我采用动态创建canvas,把整个浏览器的宽与高赋值给canvasvar Canvas = function (w, h) {

this.width = w;

this.height = h;

}

Canvas.prototype = {

init: function () {

var oC = document.createElement("canvas");

oC.setAttribute('width', this.width);

oC.setAttribute('height', this.height);

oC.setAttribute('id', 'canvas');

oC.style.backgroundColor = '#000';

document.body.appendChild(oC);

}

}

var curWinWidth = window.innerWidth,

curWinHeight = window.innerHeight;

var oCanvas = new Canvas(curWinWidth, curWinHeight);

oCanvas.init();

调用oCanvas对象的init方法之后,就会在body的最后面追加一个canvas,id为canvas,宽、高与浏览器的宽、高相同,背景为黑色,晚上下雪的效果

接下来,有了舞台,演员该上场了,怎么产生雪花呢?这里把下雪相关的操作,封装成一个类,他的基本结构如下:var Snow = function(){}

Snow.prototype = {

init : function(){},

draw : function( cxt ) {},

update : function(){}

}

这个类一共有三个方法( init, draw, update ).

init:初始化雪花的位置( x, y 坐标 )、速度、半径( 雪花的大小,在这里我们把雪花用半径不同的圆表示 )function random(min, max) {

return Math.random() * (max - min) + min;

}

init: function () {

this.x = random(0, width);

this.y = 0;

this.r = random(1, 5);

this.vy = random(3, 5);

}

那么init 加上 这个random函数 就可以完成雪花的初始化

1,雪花出来的时候,一般是在屏幕的最上方出现的,所以雪花的y坐标都是0, 其次,雪花的x坐标是随机的,他的范围是从屏幕的左边到右边,那么就是 0 ~ width. 这个width就是canvas的宽度,也就是浏览器的宽度

2,雪花的半径r, 设置为1 ~ 5之间的任意值

3,雪花下降的速度设置为3 ~ 5之间的随机速度,这里我做的下雪是垂直方向往下飘,你可以拓展,考虑风力影响( 这个时候肯定有水平方向的速度 )

有了这些初始化的参数之后,我们完善draw方法,绘制雪花:draw: function (cxt) {

cxt.beginPath();

cxt.fillStyle = 'white';

cxt.arc(this.x, this.y + this.r, this.r, 0, Math.PI * 2, false);

cxt.fill();

cxt.closePath();

this.update(cxt);

},

参数cxt就是canvas的上下文,这个函数很简单,就是一个arc方法调用init中设置的值来画圆(雪花),在该方法的最后调用了一个update方法,他是干嘛的?他是更新雪花在垂直方向的速度update: function (cxt) {

if (this.y < height - this.r) {

this.y += this.vy;

} else {

this.init();

}

}

在update方法中,我们做了边界判断: 雪花往下飘落的时候,肯定会消失,消失之后怎么处理?没有到达边界怎么处理?

canvas的高度减去雪花的半径,这就是雪花要消失时候的边界,所以this.y < height - this.r 如果这个条件成立,那么说明雪花一直在飘着,我们就要把雪花的y方向的位置更新,雪花看起来(‘正在下雪’),当一个雪花快要消失的时候,我们再把他移动到初始的位置,这样看起来就是在圆圆不断的下雪,而不需要重新绘制雪花(如果这样做,肯定会影响性能,这个特效最后肯定会被卡死,这个小技巧很多类似的特效都会用到)。至此核心的流程已经搞定,接下来,我们就要大量的生成雪花了。var snow = [];

for (var i = 0; i < 500; i++) {

setTimeout(function () {

var oSnow = new Snow();

oSnow.init();

snow.push(oSnow);

}, 10 * i);

}

生成500个雪花,不是同时生成的,然后把这些雪花保存到数组snow中.

然后,开启定时器,让雪花不断的飘落吧,

关于requestAnimationFrame的使用,可以参考我的这篇文章:[js高手之路] html5新增的定时器requestAnimationFrame实战进度条(function move() {

oGc.clearRect(0, 0, width, height);

for (var i = 0; i < snow.length; i++) {

snow[i].draw(oGc);

}

requestAnimationFrame(move);

})();

完整的demo代码:

雪花效果 - by ghostwu

* {

margin: 0;

padding: 0;

}

body {

overflow: hidden;

}

window.onload = function () {

var Canvas = function (w, h) {

this.width = w;

this.height = h;

}

Canvas.prototype = {

init: function () {

var oC = document.createElement("canvas");

oC.setAttribute('width', this.width);

oC.setAttribute('height', this.height);

oC.setAttribute('id', 'canvas');

oC.style.backgroundColor = '#000';

document.body.appendChild(oC);

}

}

var curWinWidth = window.innerWidth,

curWinHeight = window.innerHeight;

var oCanvas = new Canvas(curWinWidth, curWinHeight);

oCanvas.init();

var oC = document.querySelector('#canvas');

var width = oC.width, height = oC.height, oGc = oC.getContext('2d');

function random(min, max) {

return Math.random() * (max - min) + min;

}

var Snow = function () {

}

Snow.prototype = {

init: function () {

this.x = random(0, width);

this.y = 0;

this.r = random(1, 5);

this.vy = random(3, 5);

},

draw: function (cxt) {

cxt.beginPath();

cxt.fillStyle = 'white';

cxt.arc(this.x, this.y + this.r, this.r, 0, Math.PI * 2, false);

cxt.fill();

cxt.closePath();

this.update(cxt);

},

update: function (cxt) {

if (this.y < height - this.r) {

this.y += this.vy;

} else {

this.init();

}

}

}

var snow = [];

for (var i = 0; i < 500; i++) {

setTimeout(function () {

var oSnow = new Snow();

oSnow.init();

snow.push(oSnow);

}, 10 * i);

}

(function move() {

oGc.clearRect(0, 0, width, height);

for (var i = 0; i < snow.length; i++) {

snow[i].draw(oGc);

}

requestAnimationFrame(move);

})();

}

php怎么让页面下雪花,html5实现下雪效果的方法相关推荐

  1. 怎么在html5中制作下拉导航栏,在PPT中制作下拉式导航菜单效果的方法

    为了提高PPT演示文稿的观赏性,用户可能希望在PPT幻灯片中添加下拉式导航菜单效果,通过该导航菜单在不同幻灯片间进行导航(如图1所示),制作下拉式导航菜单的具体操作步骤如下. 图1 下拉式导航菜单 ( ...

  2. web页面下实现文字环绕图片效果

    通常,我们在一段文字中插入图片时,图片都会独立显示为一行(这是因为img标签属于块级标签,会自动在上下留出一定的空白),也许我们不想这样,如果能像在word中一样实现文字环绕图片的效果多好啊! 以往, ...

  3. 微信小程序page页面下有多余空白区域(解决方法)

    出现的问题是这样子的: 仔细检查,是因为自定义组件导致的问题,但是组件中对高度没有定义,应该是自适应的. 解决方法: 在使用自定义组件的外面套上一层层view,然后给它设置高度并设置超出部分隐藏即可. ...

  4. php首页下雪源码代码,HTML5实现下雪效果的实例代码分享

    下雪实例 知识点: 绘画函数 效果: 源码: ------------------------------ 下雪 *{padding:0;margin:0} html{overflow:hidden} ...

  5. php漂浮雪花,canvas实现雪花随机动态飘落效果(代码示例)

    本篇文章给大家介绍一下使用canvas实现雪花随机动态飘落效果的方法,文中示例代码介绍的非常详细.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 用canvas实现雪花随机动态飘落, ...

  6. 雪花漂浮php,canvas实现雪花随机动态飘落效果(代码示例)

    本篇文章给大家介绍一下使用canvas实现雪花随机动态飘落效果的方法,文中示例代码介绍的非常详细.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 用canvas实现雪花随机动态飘落, ...

  7. html 浮动窗口置顶,jQuery简单实现页面元素置顶时悬浮效果示例

    本文实例讲述了jQuery简单实现页面元素置顶时悬浮效果的方法.分享给大家供大家参考,具体如下: 一.JS Code: $.fn.smartFloat = function () { var posi ...

  8. html5页面下拉加载更多_使您的产品页面销售更多的5条提示

    html5页面下拉加载更多 Getting visitors to your website requires a great deal of work and, for many businesse ...

  9. vue移动端html5页面根据屏幕适配的四种解决方法

    最近做了两个关于h5页面对接公众号的项目,不得不提打开微信浏览器内置地图导航的功能确实有点恶心.下次想起来了的话,进行总结分享一下如何处理.在vue移动端h5页面当中,其中适配是经常会遇到的问题,这块 ...

最新文章

  1. 何恺明团队新作:只用普通ViT,不做分层设计也能搞定目标检测
  2. 一些知识点的初步理解_6(核函数,ing...)
  3. Linux+db2+was部署问题总结
  4. 66319d电源使用说明书_蒸汽熨斗怎么用 蒸汽熨斗使用方法及注意事项【介绍】...
  5. [渝粤教育] 西南科技大学 高级语言程序设计(Java) 在线考试复习资料
  6. spi收发时的寄存器sr不变_「正点原子Linux连载」第二十七章SPI实验(二)
  7. vue解构赋值_前端开发es6知识 模块化、解构赋值、字符串模板
  8. 机器学习笔记033 | 主成分分析法(PCA)
  9. nginx php重定向,Thinkphp linux nginx重定向配置
  10. 龙飞船再次发射成功!马斯克无缘现场,因疑似感染新冠……
  11. php无限分级快速,PHPTree——php快速生成无限级分类_php技巧
  12. Redis高并发5-redis数据持久化之企业应用
  13. STC8H8K系列汇编和C51实战——实现跑马灯(汇编版)
  14. PHP直播源码js判断浏览器版本
  15. CAD中如何插入图框?CAD插入图框方法教程
  16. uniapp对接极光推送
  17. 几款好用的敏捷开发工具
  18. linux触摸屏校准命令,Linux 触摸屏校准
  19. 空压机物联网解决方案
  20. 部分相机和相机镜头的参数

热门文章

  1. Java培训学习之分词工具之HanLP介绍
  2. 使用 Applet 渲染 jzy3d WireSurface 波动率曲面图
  3. ChunJunOceanBase联合方案首次发布:构建一体化数据集成方案
  4. 使用fetch 遇到的ReadableStream is locked 的问题
  5. d3.js使用svg制作图标
  6. 小米笔记本Air 13.3 i5-8250U macOS黑苹果efi引导文件
  7. matlab绘制收益率曲线并计算风险收益率VaR(Value At Risk)
  8. 领淘宝优惠券的微信小程序
  9. 嵌入式 linux 屏 翻转,linux下如何把屏幕设置成竖屏
  10. 在Unity中制作高质量的光照效果(上)