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

相关推荐

  • 如何通过纯CSS实现图片的放大缩小效果的方法和技巧

    如何通过纯CSS实现图片的放大缩小效果的方法和技巧 在现代的网页设计中,图片的展示和处理是非常重要的一部分。而图片的放大缩小效果可以为网站的视觉呈现增添趣味和交互性。在这篇文章中,我们将介绍如何通过纯CSS实现图片的放大缩小效果,并提供具体的代码示例。 使用transition属性实现平滑的过渡效果…

    2025年12月24日
    000
  • 利用CSS实现折叠内容面板特效的技巧和方法

    利用CSS实现折叠内容面板特效的技巧和方法 在网页设计中,折叠内容面板是一种非常常见的特效。通过点击或其他交互形式,隐藏或展示特定内容,以提供更好的用户体验。而利用CSS实现折叠内容面板特效,则是一种简单而有效的方法。本文将介绍一些实现这一特效的技巧和方法,并提供具体的代码示例。 使用checkbo…

    2025年12月24日
    000
  • 手把手教你用 transition 实现短视频 APP的点赞动画

    怎么使用纯 css 实现有趣的点赞动画?下面本篇文章就带大家了解一下巧妙借助 transition实现点赞动画的方法,希望对大家有所帮助! 在各种短视频界面上,我们经常会看到类似这样的点赞动画: 非常的有意思,有意思的交互会让用户更愿意进行互动。 那么,这么有趣的点赞动画,有没有可能使用纯 CSS …

    2025年12月24日 好文分享
    000
  • 教你使用css3给字体添加立体效果(附代码)

    之前的文章《手把手教你怎么使用html+css实现轮播图效果(代码分享)》中,给大家介绍了怎么使用html+css实现轮播图效果。下面本篇文章给大家介绍怎么使用css3给字体添加立体效果,我们一起看看怎么做。 字体添加立体效果图如下 1、新建一个html文件,首先写div标签输入写contented…

    2025年12月24日 好文分享
    000
  • 手把手教你使用css3制作炫酷的导航栏效果(代码详解)

    之前的文章《教你使用css3给字体添加立体效果(附代码)》中,给大家介绍了怎么使用css3给字体添加立体效果。下面本篇文章给大家介绍怎么使用CSS3制作炫酷的导航栏效果,我们一起看看怎么做。 炫酷的导航栏效果图如下 CSS3制作炫酷的导航栏效果的方法 1、新建一个html文件,首先写div标签输入写…

    2025年12月24日 好文分享
    000
  • 10款好看且实用的文字动画特效,让你的页面更吸引人!

    图片和文字是网页不可缺少的组成部分,图片运用得当可以让网页变得生动,但普通的文字不行。那么就可以给文字添加一些样式,实现一下好看的文字效果,让页面变得更交互,更吸引人。下面创想鸟就来给大家分享10款文字动画特效,好看且实用,快来收藏吧! 1、网页玻璃文字动画特效 模板简介:使用css3制作网页渐变底…

    2025年12月24日 好文分享
    000
  • 教你怎么使用css3给图片添加渐变效果(代码详解)

    之前的文章《手把手教你怎么使用CSS3实现动画效果(代码分享)》中,给大家介绍一下怎么使用css3动画效果设置经验。下面本篇文章给大家介绍怎么使用css3给图片添加渐变效果,伙伴们来看看一下。 初次接触css3渐变是在很早以前了,觉得这个东西很有意思哈,跟玩 PS 似的,可以做出很多华丽的东西。 浏…

    2025年12月24日 好文分享
    000
  • 手把手教你使用CSS3制作一个简单页面的布局(代码详解)

    之前的文章《深入解析微信小程序页面中实现的保存图片(附代码)》中,给大家了解一下微信小程序页面中实现的保存图片。下面本篇文章给大家介绍怎么使用CSS3制作一个简单页面的布局,感兴趣的小伙伴们可以参考一下。 兼容性 2009 年,W3C提出了一种新的方案—-Flex布局,可以简便、完整、响…

    2025年12月24日 好文分享
    000
  • 聊聊你可能不了解的CSS属性函数 attr()

    本篇文章带大家了解一下css属性函数 attr()。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 属性函数 attr() 用于获取HTML元素里面的属性值,并用于样式中,但目前暂时只能应用于CSS元素中的伪元素。 例子 实现一个Tooltip 立即学习“前端免费学习笔记(深入)”…

    2025年12月24日 好文分享
    000
  • 5个有用的css函数(分享)

    CSS 包含了许多函数,而且它能够完成许多早期需要用 JavaScript才能完成的事情。每年都有新的特性被添加进来,这让我们的开发更加轻松,也减少了对JavaScript的依赖。CSS 函数是它所具有的最强大的特性之一,在本文中,我将介绍一些我认为有用的函数。 (学习视频分享:css视频教程) a…

    2025年12月24日 好文分享
    000
  • 使用HTML和CSS的新特性实现响应式布局

    除了使用媒体查询和现代CSS布局(如flexbox和grid)来创建响应式网站外,我们还可以做好某些被忽视的事情来制作响应式网站。在本文中,我们将探讨许多可用的工具(围绕HTML和CSS),从响应图像到相对较新的CSS函数,无论我们是否使用媒体查询,它们都可以正常工作。 事实上,媒体查询与这些功能一…

    2025年12月24日
    000
  • 适合初学者学习的CSS3实现可爱的动物

    适合初学者学习的CSS3实现可爱的动物 今天,我想向大家展示如何巧妙地使用HTML、CSS排序动画和SVG滤镜把生活中可能最可爱的东西之一——动物画到网页上。我们将探讨绘制动物的两种技术:一种使用纯HTML和CSS,另一种使用内联SVG背景图像。 此演示高度实验性质——动画SVG滤镜目前仅在Chro…

    2025年12月24日 好文分享
    000
  • CSS的工作过程介绍(图文)

    本篇文章给大家带来的内容是关于css的工作过程介绍(图文),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 在平时的工作中,可能都是再用一些框架或者是简单的CSS来修饰我们的HTML页面,那么仔细想想一个资深的前端从业者,是否需要知道他的工作原理和过程呢,技术这种东西,当然是我们了解…

    2025年12月24日
    000
  • 如何使用CSS更改占位符颜色?(代码示例)

    在大多数浏览器中,占位符(在输入标记中)为灰色,要如何更改此占位符的颜色?本篇文章就来给大家解释使用css更改占位符颜色的方法,希望对大家有所帮助。 如何使用CSS更改占位符颜色? 在css中想要更改占位符的颜色,可以非标准选择器::placeholder来实现,它是用于设置表单输入框占位符的外观,…

    2025年12月24日 好文分享
    000
  • CSS实现页面底部固定的方法介绍(附代码)

    本篇文章给大家带来的内容是关于css实现页面底部固定的方法介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 当我们在写页面时经常会遇到页面内容少的时候,footer会戳在页面中间或什么?反正就是不在最底部显示,反正就是很难看,下面要讲的布局就是解决如何使元素粘住浏览器底…

    好文分享 2025年12月24日
    000
  • css3如何实现元素环绕中心点布局(代码示例)

    本篇文章给大家带来的内容是关于css3如何实现元素环绕中心点布局(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 效果如图: 代码实现: *{ margin: 0; padding: 0; box-sizing: border-box; } .surround-box, …

    2025年12月24日
    000
  • 彻底理解CSS中视觉格式化模型(附示例)

    本篇文章给大家带来的内容是关于彻底理解css中视觉格式化模型(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 不论你在什么时候开始,重要的是开始之后不要停止。 前言 对于部分前端工程师来讲,有时候CSS令他们很头疼,明明设置了某个样式,但是布局就是不起作用。 如果你也有这种…

    2025年12月24日
    000
  • CSS中display: inline-block的用法解析

    本篇文章给大家带来的内容是关于css中display: inline-block的用法解析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 迷之间隙 我们创建一个导航列表,并将其列表 item 设置为 inline-block,主要代码如下: 我 我 我.nav { backgrou…

    2025年12月24日
    000
  • css实现等高布局的三种方式(代码示例)

    本篇文章给大家带来的内容是关于css实现等高布局的三种方式(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 本文讲的等高布局是在不手动设置元素高度的情况下,使用纯css实现各个元素高度都相当的效果。如图: 1、使用table-cell实现(兼容IE8) 立即学习“前端免费…

    2025年12月24日
    000
  • css如何清除下划线?css清除下划线有哪些方法

    css怎么清除下划线?css去除下划线方法有哪些?很多人可能还不知道怎么操作,下面我们来讲解一下。在css中,我们可以使用text-decoration属性来表示下划线和删除线等样式,首先我们要了解一下text-decoration属性。 text-decoration属性一共有五个值,分别是non…

    2025年12月24日
    100

发表回复

登录后才能评论
关注微信