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 相关文章推荐
一个js写的日历(代码部分网摘)
Sep 20 Javascript
基于jquery的loading 加载提示效果实现代码
Sep 01 Javascript
js确定对象类型方法
Mar 30 Javascript
JS动态添加option和删除option(附实例代码)
Apr 01 Javascript
js鼠标及对象坐标控制属性详细解析
Dec 14 Javascript
一个实用的图片切换支持点击切换和自动轮播
Sep 09 Javascript
jquery小火箭返回顶部代码分享
Aug 19 Javascript
JavaScript函数中关于valueOf和toString的理解
Jun 14 Javascript
Bootstrap实现弹性搜索框
Jul 11 Javascript
Webpack优化配置缩小文件搜索范围
Dec 25 Javascript
QQ跳转支付宝并自动领红包脚本(最新)
Jun 22 Javascript
vue3为什么要用proxy替代defineProperty
Oct 19 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
2020年4月放送!《Princess Connect Re:Dive》制作组 & 角色声优公开!
2020/03/06 日漫
Yii2搭建后台并实现rbac权限控制完整实例教程
2016/04/28 PHP
php表单加入Token防止重复提交的方法分析
2016/10/10 PHP
PHP实现二维数组按某列进行排序的方法
2016/11/18 PHP
TP5(thinkPHP5框架)基于bootstrap实现的单图上传插件用法示例
2019/05/29 PHP
javascript中的对象和数组的应用技巧
2007/01/07 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
2013/04/08 Javascript
JavaScript通过元素的ID和name设置样式
2014/07/08 Javascript
jquery使用animate方法实现控制元素移动
2015/03/27 Javascript
在Python中使用glob模块查找文件路径的方法
2015/06/17 Javascript
javascript获取重复次数最多的字符
2015/07/08 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
去除字符串左右两边的空格(实现代码)
2016/05/12 Javascript
vue页面加载闪烁问题的解决方法
2018/03/28 Javascript
JS返回页面时自动回滚到历史浏览位置
2018/09/26 Javascript
angular组件间传值测试的方法详解
2020/05/07 Javascript
解决element-ui的下拉框有值却无法选中的情况
2020/11/07 Javascript
Python获取央视节目单的实现代码
2015/07/25 Python
Python 爬虫学习笔记之多线程爬虫
2016/09/21 Python
pandas删除指定行详解
2019/04/04 Python
Django框架登录加上验证码校验实现验证功能示例
2019/05/23 Python
利用Python库Scapy解析pcap文件的方法
2019/07/23 Python
wxPython+Matplotlib绘制折线图表
2019/11/19 Python
详解python opencv、scikit-image和PIL图像处理库比较
2019/12/26 Python
python集合的新增元素方法整理
2020/12/07 Python
CheapTickets香港机票预订网站:CheapTickets.hk
2019/06/26 全球购物
请写出一段Python代码实现删除一个list里面的重复元素
2015/12/29 面试题
六年级数学教学反思
2014/02/03 职场文书
公务员更新知识培训实施方案
2014/03/31 职场文书
幸福家庭标语
2014/06/27 职场文书
租房协议书
2014/09/12 职场文书
2014年园林绿化工作总结
2014/12/11 职场文书
2019年圣诞节祝福语集锦
2019/12/25 职场文书
MySQL系列之十四 MySQL的高可用实现
2021/07/02 MySQL
Ajax实现异步加载数据
2021/11/17 Javascript
如何利用python实现Simhash算法
2022/06/28 Python