html5实现下雪效果的方法

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

我们先分析下这个效果:

1,随机产生雪花

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

3,雪花怎么表示

立即学习“前端免费学习笔记(深入)”;

4,怎么源源不断的下雪

5,雪花有大有小

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

首先,由于这个是全屏效果,我采用动态创建canvas,把整个浏览器的宽与高赋值给canvas

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();

调用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  

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);            })();        }    

以上就是html5实现下雪效果的方法 的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1545027.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月21日 16:31:01
下一篇 2025年12月21日 16:31:08

相关推荐

  • html5 1px问题以及绘制坐标系网格的方法

    在canvas中,要画出1px的线条,默认情况下是不行的 context.beginPath(); context.moveTo( 100, 100 ); context.lineTo( 400, 100 ); context.closePath(); context.stroke(); conte…

    2025年12月21日
    000
  • 关于h5中新增的几个背景属性和文本属性

    一、背景图像显示: ①background-size:规定背景图像的大小; 值:像素值、百分比、auto、cover、contain ②background-origin :规定背景图像的起始位置; 值:padding-box(默认)、content-box、border-box ③backgrou…

    好文分享 2025年12月21日
    000
  • 防止html5的video标签在iphone中自动全屏的方法

      问题: 当在iphone中打开html5页面中的video视频时,会默认调取系统播放器,全屏播放视频资源。   解决方式: 1. 首先在html5页面的video标签中添加webkit-playsinline=true;         接着在UIWebView中设置allowsInlineMe…

    好文分享 2025年12月21日
    000
  • 如何解决html5 canvas 绘制字体、图片与图形模糊问题

    html5 canvas 绘制字体、图片与图形模糊问题 发生情况 多出现在高dpi设备,这意味着每平方英寸有更多的像素,如手机,平板电脑。当然很多高端台式电脑也有高分辨率高dpi的显示器。  canvas在浏览器中的缩放原理 如果没有设置style那么就以html的属性width,height作为尺…

    好文分享 2025年12月21日
    000
  • 四种css垂直居中方法

    垂直居中 .parent{width: 400px;height: 400px;border:1px solid grey;display: } .children{width: 200px;height: 200px;background-color: #ccc;} /*table-cell*/ …

    好文分享 2025年12月21日
    000
  • html5和html有什么区别

    浅谈:html5和html的区别 最近看群里聊天聊得最火热的莫过于手机网站和html5这两个词。可能有人会问,这两者有什么关系呢?随着这移动互联网快速发展的时代,尤其是4G时代已经来临的时刻,加上微软对“XP系统”不提供更新补丁、维护的情况下“html5+css3”也逐渐的成为新一代web前端技术,…

    好文分享 2025年12月21日
    000
  • HTML5新特性dataset的使用方法

    这篇文章主要介绍了html5自定义属性前缀data-及dataset的使用方法(html5 新特性),需要的朋友可以参考下 HTML5规定可以为元素添加非标准的属性,但要添加前缀 data- ,目的是为元素提供与渲染无关的信息,或者提供语义信息。这些属性可以任意添加、随便命名,只要以 data- 开…

    好文分享 2025年12月21日
    000
  • html5浏览器截图的示例

    这篇文章主要介绍了html5使用html2canvas实现浏览器截图的示例,非常具有实用价值,需要的朋友可以参考下 最近做项目为了解决全局异常信息记录,研究了一下浏览器全屏截图功能,方便用户发现异常时能够快速截图发给管理员。最终记录的异常信息如下,上面的【截图报告管理员】就是使用html2canva…

    2025年12月21日
    000
  • html5中sse服务器发送事件EventSource相关介绍

    本篇文章主要介绍了浅谈html5之sse服务器发送事件eventsource介绍,具有一定的参考价值,有兴趣的可以了解一下 前言 我前面文章讲过数据大屏,里面的数据时时更新。还有时时更新的股票数据,Facebook/Twitter 更新、估价更新、新的博文、赛事结果等等,都需要数据时时更新。之前我们…

    2025年12月21日
    000
  • 实例详解html5使用canvas实现图片下载功能

    这篇文章主要介绍了html5使用canvas实现图片下载功能的示例代码,非常具有实用价值,需要的朋友可以参考下 最近项目中需要实现一个下载图片的功能(如下图) 一开始考虑使用a标签的download属性进行下载: 下载海报 但是通过测试,发现再safari中,下载的文件不能带上拓展名,所以只好换一个…

    2025年12月21日
    000
  • 详解HTML5如何操作WebSQL数据库

    下面通过本文给大家分享html5操作websql数据库的实例代码,感兴趣的朋友一起看看吧 HTML代码: 列车时刻表查询 列车时刻表查询 请给我留言 姓名: 留言: 留言 查询 收藏 给我留言 Close 收藏成功,暂且不做处理!. 请点击右上角有个关闭按钮 提示: 你也可以点击弹窗的外部区域来关闭…

    2025年12月21日
    000
  • 韩顺平H5游戏开发坦克大战视频源码课件分享

    《韩顺平h5游戏开发坦克大战视频教程》是选自韩顺平的网络公开课,介绍了如何使用html5来制作坦克大战游戏,对h5的技术有很显著的提高.我将会带着大家做一个3d的俯视坦克大战游戏。将从最基本的控制,到敌人的ai与整个游戏的系统等一步步的带着大家实现一个完整的游戏。教程中我们重点是程序与unity的使…

    2025年12月21日
    000
  • 关于HTML5中性能优化的详解

    HTML5性能优化 –减少重绘         在HTML页面完成展现之后,动态改变页面元素或调整CSS样式都会引起浏览器重绘,性能的损耗直接取决于动态改变的范围:如果只是改变一个元素的颜色之类的信息则只会重绘该元素;而如果是增删节点或调整节点位置则会引起其兄弟节点也一并重绘。     …

    好文分享 2025年12月21日
    000
  • javascript如何实现拖放功能_相关的事件有哪些

    关键拖放事件包括源元素的dragstart、drag、dragend和目标元素的dragenter、dragover、dragleave、drop;需设置draggable=”true”,在dragstart中setData,在dragover中preventDefault,…

    2025年12月21日 好文分享
    000
  • 如何实现JavaScript验证表单_前端验证的最佳实践是什么

    JavaScript表单验证核心是提升体验与保障基础数据质量,但不可替代后端验证;需结合HTML5原生属性与JS增强交互,确保提示清晰可访问,并始终信任后端校验。 JavaScript 表单验证的核心目标是提升用户体验和保障基础数据质量,但它不能替代后端验证。前端验证应快速反馈、友好提示、不干扰正常…

    2025年12月21日
    000
  • javascript的SEO优化有哪些方法_如何让单页应用被搜索引擎收录

    单页应用(SPA)需通过服务端渲染(SSR)、预渲染或动态渲染使爬虫获取完整HTML,辅以语义化标签、动态元信息、规范路由及Sitemap等基础SEO实践来提升搜索引擎收录效果。 单页应用(SPA)默认对搜索引擎不友好,因为传统爬虫难以执行 JavaScript 渲染页面内容。要让搜索引擎收录 SP…

    2025年12月21日
    000
  • JavaScript如何实现数据可视化?

    JavaScript数据可视化核心是选用成熟图表库(如Chart.js、D3.js、ECharts、Plotly.js)将规范数据渲染为图形,需准备结构化数据、配置选项、嵌入网页,并注意响应式、交互及数据校验。 JavaScript 实现数据可视化,核心是借助成熟的图表库将结构化数据转化为图形界面,…

    2025年12月21日
    000
  • javascript可以开发游戏吗_怎样用canvas创建简单动画

    JavaScript配合HTML5可原生开发2D游戏动画;需获取2D上下文,用requestAnimationFrame实现清屏→绘制→循环;通过变量更新位置并重绘,配合边界检测防止越界。 当然可以,JavaScript 配合 HTML5 是开发轻量级 2D 游戏和动画的常用组合,无需插件,浏览器原…

    2025年12月21日
    000
  • 如何使用JavaScript实现拖放功能_它需要哪些事件和处理程序呢

    JavaScript拖放功能核心是HTML5拖放API,需绑定dragstart、dragover(必须preventDefault)、dragenter、drop四个事件,分别处理数据设置、允许放置、视觉反馈和实际操作。 JavaScript 实现拖放功能,核心是利用原生的 HTML5 拖放 AP…

    2025年12月21日 好文分享
    000
  • JavaScript网页游戏开发有哪些基础?

    JavaScript网页游戏开发基础包括浏览器环境、核心语言、Canvas/WebGL渲染、游戏循环、输入响应和资源管理;初学者应先掌握Canvas的“清屏→更新→重绘”循环,用requestAnimationFrame+deltaTime分离逻辑与渲染,封装InputManager处理多端输入,并…

    2025年12月21日
    000

发表回复

登录后才能评论
关注微信