JS实现炫酷雪花飘落效果


Posted in Javascript onAugust 19, 2020

用js实现漂亮的雪花飘过效果:

JS实现炫酷雪花飘落效果

步骤:

页面基本样式,雪花旋转动画效果

body{
 width: 100vw;
 height: 100vh;
 background-color: #000;
 overflow: hidden;
 user-select: none;
 -webkit-user-select: none;
}
.snowAnimation {
 animation: snow 5s infinite linear;
 -webkit-animation: snow 5s infinite linear;
}
@keyframes snow {
 0%{
 transform: rotate(0);
 }
 100%{
 transform: rotate(360deg);
 }
}
@-webkit-keyframes snow {
 0%{
 transform: rotate(0);
 }
 100%{
 transform: rotate(360deg);
 }
}

创建雪花,添加样式

let snowDiv = document.createElement('div') // 创建div
snowDiv.innerHTML = '❉' // 添加❉内容
snowDiv.className = 'snowAnimation' // 添加旋转动画
snowDiv.style.position = 'absolute'
snowDiv.style.top = '0'
snowDiv.style.left = '0'
snowDiv.style.color = '#fff'
document.body.append(snowDiv) // 插入到页面

JS实现炫酷雪花飘落效果

接下来,让元素飘落

animated(snowDiv) // 传入创建的元素

// 动态增加元素top值,
function animated(div) {
 div.timer = setInterval(() => {
 div.style.top = 10 + div.offsetTop + 'px'
 },50)
}

接下来,给元素添加随机生成的初始化效果

let minSize = 10 // 生成的最小元素
let maxSize = 50 // 生成的最大元素
let randomOpacity = 0.5 + Math.random()*0.5 // 生成元素的不透明度

snowDiv.style.fontSize = minSize + Math.random()*maxSize + 'px' // 元素随机大小
snowDiv.style.opacity = randomOpacity // 元素随机的不透明度

下一步,添加生成元素的随机位置,并且保持可视区域内活动

let visualWidth = document.body.offsetWidth || document.documentElement.offsetWidth // 页面可视化宽度
let visualHeight = document.body.offsetHeight || document.documentElement.offsetHeight // 页面可视化高度
let initPosition = Math.random()*(visualWidth - 80) // 溢出会有滚动条,控制不会溢出,页面可视化宽度 - (元素最大宽度 + 最大宽度/2)

snowDiv.style.left = initPosition + 'px' // 随机在可视化区域位置内生成元素
animated(snowDiv,visualHeight) // 传入创建的元素

// 动态增加元素top值,当元素超过可视化区域,remove元素
function animated(div,visualHeight) {
 div.timer = setInterval(() => {
 div.style.top = 10 + div.offsetTop + 'px'
 if (Number(div.style.top.replace('px','')) > visualHeight - 80) {
 clearInterval(div.timer)
 document.body.removeChild(div)
 }
 },50)
}

基本完成:生成一个随机大小/不透明度的元素,并且在可视化区域内飘落

下一步,复制生成多个元素:cloneNode()

let minSize = 10 // 生成的最小元素
let maxSize = 50 // 生成的最大元素
let delay = 100 // 生成元素的间隔时间
let snowDiv = document.createElement('div') // 创建div
snowDiv.innerHTML = '❉' // 添加❉内容
snowDiv.className = 'snowAnimation' // 添加旋转动画
snowDiv.style.position = 'absolute'
snowDiv.style.top = '0'
snowDiv.style.left = '0'
snowDiv.style.color = '#fff'
let visualWidth = document.body.offsetWidth || document.documentElement.offsetWidth // 页面可视化宽度
let visualHeight = document.body.offsetHeight || document.documentElement.offsetHeight // 页面可视化高度

setInterval(() => {
 let initPosition = Math.random()*(visualWidth - 80) // 溢出会有滚动条,控制不会溢出,页面可视化宽度 - (元素最大宽度 + 最大宽度/2)
 let randomOpacity = 0.5 + Math.random()*0.5 // 生成元素的不透明度
 let speed = 5 + Math.random()*5 // 元素飘落速度
 snowDiv.style.fontSize = minSize + Math.random()*maxSize + 'px' // 元素随机大小
 snowDiv.style.opacity = randomOpacity // 元素随机的不透明度
 snowDiv.style.left = initPosition + 'px' // 随机在可视化区域位置内生成元素
 let div = snowDiv.cloneNode(true) // 复制元素
 document.body.append(div) // 添加复制后的元素
 animated(div,speed,visualHeight) // 传入创建的元素,飘落的速度以及页面可视化高度
},delay)

// 动态增加元素top值,当元素超过可视化区域,remove元素
function animated(div,speed,visualHeight) {
 div.timer = setInterval(() => {
 div.style.top = speed + div.offsetTop + 'px'
 if (Number(div.style.top.replace('px','')) > visualHeight - 80) {
 clearInterval(div.timer)
 document.body.removeChild(div)
 }
 },50)
}

到这里就基本完成此效果。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
10个实用的脚本代码工具
May 04 Javascript
写给想学习Javascript的朋友一点学习经验小结
Nov 23 Javascript
javascript:void(0)使用探讨
Aug 27 Javascript
利用js实现在浏览器状态栏显示访问者在本页停留的时间
Dec 29 Javascript
页面装载js及性能分析方法介绍
Mar 21 Javascript
javascript判断数组内是否重复的方法
Apr 21 Javascript
自己编写的支持Ajax验证的JS表单验证插件
May 15 Javascript
jQuery validate 验证radio实例
Mar 01 Javascript
详解vuex 中的 state 在组件中如何监听
May 23 Javascript
JavaScript实现三级联动菜单实例代码
Jun 26 Javascript
vue2.0 如何在hash模式下实现微信分享
Jan 22 Javascript
使用layui定义一个模块并使用的例子
Sep 14 Javascript
javascript实现雪花飘落效果
Aug 19 #Javascript
js实现直播点击飘心效果
Aug 19 #Javascript
js实现鼠标点击飘爱心效果
Aug 19 #Javascript
Vue环境搭建+VSCode+Win10的详细教程
Aug 19 #Javascript
Vue实现导航栏菜单
Aug 19 #Javascript
vue实现tab栏点击高亮效果
Aug 19 #Javascript
封装Vue Element的table表格组件的示例详解
Aug 19 #Javascript
You might like
使用PHPMYADMIN操作mysql数据库添加新用户和数据库的方法
2010/04/02 PHP
php格式输出文件var_export函数实例
2014/11/15 PHP
jQuery+PHP实现的掷色子抽奖游戏实例
2015/01/04 PHP
thinkPHP模板中for循环与switch语句用法示例
2016/11/30 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
Yii redis集合的基本使用教程
2020/06/14 PHP
Ext对基本类型的扩展 ext,extjs,format
2010/12/25 Javascript
在Javascript里访问SharePoint列表数据的实现方法
2011/05/22 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
2014/05/04 Javascript
关于javaScript注册click事件传递参数的不成功问题
2014/07/18 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
常用原生JS兼容性写法汇总
2016/04/27 Javascript
详解JavaScript的闭包、IIFE、apply、函数与对象
2016/12/21 Javascript
JQuery和html+css实现带小圆点和左右按钮的轮播图实例
2017/07/22 jQuery
AngularJS 实现购物车全选反选功能
2017/10/24 Javascript
node将geojson转shp返回给前端的实现方法
2019/05/29 Javascript
浅谈ECMAScript 中的Array类型
2019/06/10 Javascript
ES6 Generator函数的应用实例分析
2019/06/26 Javascript
JS使用正则表达式实现常用的表单验证功能分析
2020/04/30 Javascript
[01:33:25]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第一场 1月24日
2021/03/11 DOTA
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
python统计中文字符数量的两种方法
2019/01/31 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
2020/03/30 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
2020/06/11 Python
Python图像处理之膨胀与腐蚀的操作
2021/02/07 Python
亚马逊西班牙购物网站:amazon西班牙
2017/03/06 全球购物
斯巴达比赛商店:Spartan Race
2019/01/08 全球购物
新学期家长寄语
2014/01/19 职场文书
2014年元旦联欢会活动策划方案
2014/02/16 职场文书
学校百日安全生产活动总结
2014/07/05 职场文书
秋季运动会演讲稿
2014/09/16 职场文书
学校纪律作风整改措施思想汇报
2014/10/11 职场文书
呼兰河传读书笔记
2015/06/30 职场文书
MySQL中CURRENT_TIMESTAMP的使用方式
2021/11/27 MySQL
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers
table设置超出部分隐藏,鼠标移上去显示全部内容的方法
2022/12/24 HTML / CSS