用HTML、CSS和JS打造绚丽的雪花飘落效果

目录

一、程序代码

二、代码原理

三、运行效果


一、程序代码

<!DOCTYPE html>
<html>

<head>
	<meta http-equiv="Content-Type" content="text/html; charset=GBK">
	<style>
		* {
			margin: 0;
			padding: 0;
		}

		#box {
			width: 100vw;
			height: 100vh;
			padding: 3px;
			position: absolute;
			background: black;
		}
	</style>
</head>

<body>
	<div id="box">

	</div>
</body>

<script>
	(function () {
		var screenWidth = screen.availWidth; // 获取屏幕宽度
		var screenHeight = screen.availHeight; // 获取屏幕高度
		var speed = 1; // 雪花下落的速度

		function Snow(size, downSize) {
			this.box = document.getElementById("box"); // 获取容器元素
			this.size = size; // 雪花数量
			this.downSize = downSize || 10; // 每次落下的雪花数量,默认为10个
			this.item = []; // 雪花元素数组
			this.init(); // 初始化
			this.start(); // 开始下雪
		}

		// 获取相关随机数据的方法
		Snow.prototype.getRandomThings = function (type) {
			var res;
			if (type == 'left') { // 初始的left
				res = Math.round(Math.random() * (screenWidth - 30 - 10)) + 10; // 随机生成left值
				Math.random() > 0.8 ? (res = -res) : null; // 80%的概率使左边的雪花出现在左侧(left为负值)
			} else if (type == 'top') { // 初始的top
				res = -(Math.round(Math.random() * (50 - 40)) + 40); // 随机生成top值,负值使雪花在屏幕上方
			} else if (type == 'incre') { // 向下的速度
				res = Math.random() * (4 - 1) + 1; // 随机生成向下的速度
			} else if (type == 'increLeft') { // 向右的速度
				res = Math.random() * (0.8 - 0.5) + 0.5; // 随机生成向右的速度
			} else { // 雪花的大小
				res = Math.round(Math.random() * (30 - 10)) + 10; // 随机生成雪花的大小
			}
			return res;
		}

		Snow.prototype.init = function () {
			this.box.style.width = screenWidth + 'px'; // 设置容器宽度为屏幕宽度
			this.box.style.height = screenHeight + 'px'; // 设置容器高度为屏幕高度
			var fragment = document.createDocumentFragment(); // 创建文档片段,用于性能优化
			for (var i = 0; i < this.size; i++) { // 创建雪花元素
				var left = this.getRandomThings('left'); // 获取随机的left值
				var top = this.getRandomThings('top'); // 获取随机的top值
				var snowSize = this.getRandomThings('size'); // 获取随机的雪花大小
				var snow = document.createElement("div"); // 创建雪花元素
				snow.style.cssText = 'position:absolute;color:#FFFFFF;'; // 设置元素样式
				snow.style['font-size'] = snowSize + 'px'; // 设置字体大小
				snow.style.left = left + 'px'; // 设置left值
				snow.style.top = top + 'px'; // 设置top值
				snow.innerHTML = '&#10052'; // 设置雪花图标(Unicode编码)
				this.item.push(snow); // 添加到雪花元素数组中
				fragment.appendChild(snow); // 添加到文档片段中
			}
			box.appendChild(fragment); // 将文档片段添加到容器中
		}

		Snow.prototype.start = function () {
			var that = this;
			var num = 0;
			for (var i = 0; i < this.size; i++) { // 遍历雪花元素数组
				var snow = this.item[i];
				if ((i + 1) % this.downSize == 0) { // 每downSize个雪花一组,控制下落速度
					num++;
				}
				(function (s, n) { // 使用闭包保存snow和num的值
					setTimeout(function () { // 定时器,实现雪花分批下落
						that.doStart(s); // 调用doStart方法使雪花开始下落
					}, 1000 * n) // 每隔n秒下落一组雪花
				})(snow, num)
			}
		}

		// 针对每个雪花的定时处理
		Snow.prototype.doStart = function (snow) {
			var that = this;
			(function (s) {
				var increTop = that.getRandomThings('incre'); // 获取向下的速度
				var increLeft = that.getRandomThings('increLeft'); // 获取向右的速度
				var x = parseInt(getStyle(s, 'left')), y = parseInt(getStyle(s, 'top')); // 获取当前的left和top值

				if (s.timmer) return; // 如果定时器已存在,则不执行后续代码
				s.timmer = setInterval(function () { // 设置定时器,使雪花动起来
					// 超过右边或者底部重新开始
					if (y > (screenHeight - 5) || x > (screenWidth - 30)) {
						// 重新回到天上开始往下
						increTop = that.getRandomThings('incre');
						increLeft = that.getRandomThings('increLeft');

						// 重新随机属性
						var left = that.getRandomThings('left');
						var top = that.getRandomThings('top');
						var snowSize = that.getRandomThings('size');
						s.style.left = left + 'px';
						s.style.top = top + 'px';
						s.style['font-size'] = snowSize + 'px';
						y = top;
						x = left;
						n = 0;

						return;
					}

					// 加上系数,当随机数大于0.5时速度加快,小于0.5时速度减慢,形成飘动效果
					x += Math.random() > 0.5 ? increLeft * 1.1 : increLeft * 0.9;
					y += Math.random() > 0.5 ? increTop * 1.1 : increTop * 0.9;

					// 设置left和top值使雪花动起来
					s.style.left = x + 'px';
					s.style.top = y + 'px';
				}, speed); // 每隔speed毫秒执行一次定时器中的代码
			})(snow)
		}

		// 获取元素的样式值
		function getStyle(obj, prop) {
			var prevComputedStyle = document.defaultView ? document.defaultView.getComputedStyle(obj, null) : obj.currentStyle;
			return prevComputedStyle[prop];
		}

		new Snow(300, 30); // 创建一个Snow对象,传入雪花数量和每批下落的雪花数量
	})()

</script>

</html>

二、代码原理

这段代码主要通过JavaScript来操作DOM元素,实现了一个下雪的效果。首先,通过CSS样式设置整个页面的背景为黑色,并且创建一个id为"box"的容器元素用于容纳雪花。

接着,使用JavaScript代码自执行函数来封装雪花的相关逻辑。在这个函数中,获取屏幕的宽度和高度,并定义了雪花下落的速度。

然后,定义了一个Snow对象构造函数,用于创建雪花。构造函数接受两个参数,分别是雪花的数量和每批下落的雪花数量。在构造函数中,首先通过getElementById方法获取到容器元素,并设置容器的宽度和高度与屏幕一致。然后,使用for循环创建指定数量的雪花元素,通过随机数设置雪花的初始位置、大小和样式,并将雪花元素添加到数组item和文档片段中。最后,将文档片段添加到容器中。

接着,在Snow对象的原型上定义了一系列方法。其中,getRandomThings方法用于根据type参数获取随机的left值、top值、向下的速度、向右的速度或雪花的大小。init方法用于初始化雪花,设置容器的宽度和高度,并创建指定数量的雪花元素,并将其添加到容器中。start方法用于控制雪花的下落,通过定时器和闭包实现分批下落的效果。doStart方法用于针对每个雪花设置定时处理,根据当前位置和速度计算新的位置,并更新雪花元素的样式值,使其动起来。getStyle方法用于获取元素的样式值。

最后,在全局作用域中创建了一个Snow对象,传入了300个雪花和每批下落的雪花数量为30,从而开始执行下雪效果。

三、运行效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/390319.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于3种机器学习法的黄土高原农业干旱监测比较研究_王晓燕_2022

基于3种机器学习法的黄土高原农业干旱监测比较研究_王晓燕_2022 摘要关键词1 引言2 研究区与数据6 结论#pic_center =x260) 摘要 本文集成 MODIS、TRMM、GLDAS 和再分析等多源数据,选取了 13 个与干旱有关的变量,并与基于气象数据的 3 个月时间尺度的标准化降水蒸发指数(SP…

Html的<figure><figcaption>标签

Html的<figure><figcaption>标签 示例一: <figure><figcaption>figcaption001, fig标题1 </figcaption><figcaption>figcaption002, fig标题2 </figcaption><div style"width:calc(100px*2); height:calc(100px*2); back…

微服务学习Day3

文章目录 初始DockerDocker介绍Docker与虚拟机镜像和容器 Docker的基本操作镜像操作容器命令数据卷挂载数据卷 Dockerfile自定义镜像Docker-Compose介绍Docker-Compose部署微服务镜像仓库 初始Docker Docker介绍 Docker与虚拟机 镜像和容器 Docker的基本操作 镜像操作 容器命…

云计算基础-云计算概念

云计算定义 云计算是一种基于互联网的计算方式&#xff0c;通过这种计算方式&#xff0c;共享的软硬件资源和信息可以按需提供给计算机和其他设备。云计算依赖资源共享以达成规模经济&#xff0c;类似基础设置(如电力网)。 云计算最基本的概念就是云加端&#xff0c;我们有一个…

第2讲springsecurity+vue通用权限系统

阿里云 maven阿里云镜像 <?xml version"1.0" encoding"UTF-8"?><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for addition…

用tensorflow模仿BP神经网络执行过程

文章目录 用矩阵运算仿真BP神经网络y relu ( (X․W ) b )y sigmoid ( (X․W ) b ) 以随机数产生Weight(W)与bais(b)placeholder 建立layer函数改进layer函数&#xff0c;使其能返回w和b github地址https://github.com/fz861062923/TensorFlow 用矩阵运算仿真BP神经网络 impo…

数据检索:倒排索引加速、top-k和k最邻近

之前在https://www.yuque.com/treblez/qksu6c/wbaggl2t24wxwqb8?singleDoc# 《Elasticsearch: 非结构化的数据搜索》我们看了ES的设计&#xff0c;主要侧重于它分布式的设计以及LSM-Tree&#xff0c;今天我们来关注算法部分&#xff1a;如何进行检索算法的设计以及如何加速倒排…

LabVIEW焊缝缺陷超声检测与识别

LabVIEW焊缝缺陷超声检测与识别 介绍基于LabVIEW的焊缝缺陷超声检测与识别系统。该系统利用LabVIEW软件和数据采集卡的强大功能&#xff0c;实现了焊缝缺陷的在线自动检测&#xff0c;具有通用性、模块化、功能化和网络化的特点&#xff0c;显著提高了检测的效率和准确性。 随…

DS:八大排序之直接插入排序、希尔排序和选择排序

创作不易&#xff0c;感谢三连支持&#xff01;&#xff01; 一、排序的概念及运用 1.1 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起 来的操作。稳定性&…

GPT翻译网站的加载与使用

Sider: ChatGPT侧边栏 GPTs, GPT-4 Turbo, 联网, 绘图 sider.ai https://chromewebstore.google.com/detail/sider-chatgpt%E4%BE%A7%E8%BE%B9%E6%A0%8F-gpts-g/difoiogjjojoaoomphldepapgpbgkhkb?hlzh-CN 加入与移除 第二个翻译网站 https://chromewebstore.google.com/…

[BUUCTF]-PWN:ciscn_2019_es_1解析(tcachebin duf)

查看保护 再查看ida 大致为alloc创建堆块&#xff0c;free释放堆块&#xff0c;show输出堆块内容 但是要注意一点free没有清空堆块指针 完整exp&#xff1a; from pwn import* from LibcSearcher import* pprocess(./es1) premote(node5.buuoj.cn,26841)def alloc(size,cont…

红色警戒 3 修改游戏速度

原文&#xff1a;https://blog.iyatt.com/?p13852 红警 2 是有提供游戏速度修改的&#xff0c;红警 3 没有&#xff0c;而且游戏速度似乎和 FPS 关联的&#xff0c;在配置低一些的电脑上会变慢&#xff0c;FPS 也降低&#xff0c;我电脑上开最高画质 FPS 不超过 30&#xff0c…

102.网游逆向分析与插件开发-网络通信封包解析-解读喊话道具数据包并且利用Net发送

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;解读聊天数据包并且利用Net发送 码云地址&#xff08;游戏窗口化助手 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;cc6370dc5ca6b0176aafc…

TiDB in 2023, 一次简单的回顾丨PingCAP 唐刘

2023 年已经过去&#xff0c;TiDB 经过了一年的迭代&#xff0c;又往前进步了一点点&#xff0c;我们非常自豪的看到&#xff0c;TiDB 正在不断地帮助我们的客户成功&#xff0c;包括但不限于&#xff1a; ○ 首个云原生、分布式、全栈国产化银行核心业务系统投产上线丨TiDB …

云计算基础-快照与克隆

快照及克隆 什么是快照 快照是数据存储的某一时刻的状态记录&#xff0c;也就是把虚拟机当前的状态保存下来(快照不是备份&#xff0c;快照保存的是状态&#xff0c;备份保存的是副本) 快照优点 速度快&#xff0c;占用空间小 快照工作原理 在了解快照原理前&#xff0c;…

leetcode135. 分发糖果

leetcode135. 分发糖果 题目 思路 两者兼顾很容易顾此失彼&#xff0c;因此分别考虑两方向&#xff0c;初始化为全1数组从前向后遍历&#xff1a;只要右边评分比左边大&#xff0c;result[i] result[i-1] 1从后向前遍历&#xff1a;只要左边评分比右边大&#xff0c;result…

round sphere around ground background space-around space-between space-evenly

round sphere around ground background space-around space-between space-evenly round around ground surround round sphere around ground background around surround around evenly between space-around space-between space-evenly Round: 描述形状为圆形或球形的。例…

集群聊天项目

不懂的一些东西 (const TcpConnectionPtr&&#xff09;作为形参啥意思&#xff1a;接收一个常量引用&#xff0c;函数内部不允许修改该指针所指向的对象。 优势 1.网络层与业务层分离&#xff1a;通过网络层传来的id&#xff0c;设计一个map存储id以及对印的业务处理器&…

云计算基础-计算虚拟化-CPU虚拟化

CPU指令系统 在CPU的工作原理中&#xff0c;CPU有不同的指令集&#xff0c;如下图&#xff0c;CPU有4各指令集&#xff1a;Ring0-3&#xff0c;指令集是在服务器上运行的所有命令&#xff0c;最终都会在CPU上执行&#xff0c;但是CPU并不是说所有的命令都是一视同仁的&#xf…

vscode写MATLAB配置

vscode写MATLAB python下载 官网说明Versions of Python Compatible with MATLAB Products by Release - MATLAB & Simulink 不确定这三列都表示什么意思&#xff0c;尽量安装这三列都有的python版本吧&#xff0c;我安装的 MATLAB R2023b,python选择的是3.11.5 …