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

2024-02-17 06:04

本文主要是介绍用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') { // 初始的leftres = Math.round(Math.random() * (screenWidth - 30 - 10)) + 10; // 随机生成left值Math.random() > 0.8 ? (res = -res) : null; // 80%的概率使左边的雪花出现在左侧(left为负值)} else if (type == 'top') { // 初始的topres = -(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,从而开始执行下雪效果。

三、运行效果

这篇关于用HTML、CSS和JS打造绚丽的雪花飘落效果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/716876

相关文章

Flutter实现文字镂空效果的详细步骤

《Flutter实现文字镂空效果的详细步骤》:本文主要介绍如何使用Flutter实现文字镂空效果,包括创建基础应用结构、实现自定义绘制器、构建UI界面以及实现颜色选择按钮等步骤,并详细解析了混合模... 目录引言实现原理开始实现步骤1:创建基础应用结构步骤2:创建主屏幕步骤3:实现自定义绘制器步骤4:构建U

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

HTML5中的Microdata与历史记录管理详解

《HTML5中的Microdata与历史记录管理详解》Microdata作为HTML5新增的一个特性,它允许开发者在HTML文档中添加更多的语义信息,以便于搜索引擎和浏览器更好地理解页面内容,本文将探... 目录html5中的Mijscrodata与历史记录管理背景简介html5中的Microdata使用M

html5的响应式布局的方法示例详解

《html5的响应式布局的方法示例详解》:本文主要介绍了HTML5中使用媒体查询和Flexbox进行响应式布局的方法,简要介绍了CSSGrid布局的基础知识和如何实现自动换行的网格布局,详细内容请阅读本文,希望能对你有所帮助... 一 使用媒体查询响应式布局        使用的参数@media这是常用的

HTML5表格语法格式详解

《HTML5表格语法格式详解》在HTML语法中,表格主要通过table、tr和td3个标签构成,本文通过实例代码讲解HTML5表格语法格式,感兴趣的朋友一起看看吧... 目录一、表格1.表格语法格式2.表格属性 3.例子二、不规则表格1.跨行2.跨列3.例子一、表格在html语法中,表格主要通过< tab

Python结合PyWebView库打造跨平台桌面应用

《Python结合PyWebView库打造跨平台桌面应用》随着Web技术的发展,将HTML/CSS/JavaScript与Python结合构建桌面应用成为可能,本文将系统讲解如何使用PyWebView... 目录一、技术原理与优势分析1.1 架构原理1.2 核心优势二、开发环境搭建2.1 安装依赖2.2 验

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

前端CSS Grid 布局示例详解

《前端CSSGrid布局示例详解》CSSGrid是一种二维布局系统,可以同时控制行和列,相比Flex(一维布局),更适合用在整体页面布局或复杂模块结构中,:本文主要介绍前端CSSGri... 目录css Grid 布局详解(通俗易懂版)一、概述二、基础概念三、创建 Grid 容器四、定义网格行和列五、设置行