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 相关文章推荐
Extjs4 类的定义和扩展实例
Jun 28 Javascript
javascript实现的简单的表单验证
Jul 10 Javascript
javascript实现别踩白块儿小游戏程序
Nov 22 Javascript
javascript定义类和类的实现实例详解
Dec 01 Javascript
ichart.js绘制虚线、平均分虚线效果的实现代码
May 05 Javascript
JS集成fckeditor及判断内容是否为空的方法
May 27 Javascript
JS编写函数实现对身份证号码最后一位的验证功能
Dec 29 Javascript
Angularjs单选框相关的示例代码
Aug 17 Javascript
JavaScript实现写入文件到本地的方法【基于FileSaver.js插件】
Mar 15 Javascript
微信小程序开发的基本流程步骤
Jan 31 Javascript
小程序测试后台服务的方法(ngrok)
Mar 08 Javascript
JavaScript十大取整方法实例教程
Dec 03 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
用PHP调用Oracle存储过程
2006/10/09 PHP
php生成随机颜色的方法
2014/11/13 PHP
php打包压缩文件之ZipArchive方法用法分析
2016/04/30 PHP
Laravel与CI框架中截取字符串函数
2016/05/08 PHP
关于PHP求解三数之和问题详析
2020/11/09 PHP
javascript下操作css的float属性的特殊写法
2007/08/22 Javascript
javascript 设置文本框中焦点的位置
2009/11/20 Javascript
jQuery效果 slideToggle() 方法(在隐藏和显示之间切换)
2011/06/28 Javascript
js判断运行jsp页面的浏览器类型以及版本示例
2013/10/30 Javascript
js中substr,substring,indexOf,lastIndexOf的用法小结
2013/12/27 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
2016/05/30 Javascript
简单实现轮播图效果的实例
2016/07/15 Javascript
纯javascript版日历控件
2016/11/24 Javascript
JS实现微信弹出搜索框 多条件查询功能
2016/12/13 Javascript
详解js中Number()、parseInt()和parseFloat()的区别
2016/12/20 Javascript
input 标签实现输入框带提示文字效果(两种方法)
2017/10/09 Javascript
JavaScript数据结构之双向链表和双向循环链表的实现
2017/11/28 Javascript
使用layui的router来进行传参的实现方法
2019/09/06 Javascript
详解Angular cli配置过程记录
2019/11/07 Javascript
python爬虫面试宝典(常见问题)
2018/03/02 Python
python将pandas datarame保存为txt文件的实例
2019/02/12 Python
Python元组知识点总结
2019/02/18 Python
简单了解python关系(比较)运算符
2019/07/08 Python
Python paramiko模块使用解析(实现ssh)
2019/08/30 Python
TensorFlow 显存使用机制详解
2020/02/03 Python
存储过程的优缺点是什么
2015/01/10 面试题
畜牧兽医本科生个人的自我评价
2013/10/11 职场文书
园林技术个人的自我评价
2014/01/08 职场文书
请假条标准格式规范
2014/04/10 职场文书
升职自荐信范文
2015/03/27 职场文书
总结会主持词
2015/07/02 职场文书
2015年乡镇组织委员工作总结
2015/10/23 职场文书
2016秋季运动会前导词
2015/11/25 职场文书
PostgreSQL事务回卷实战案例详析
2022/03/25 PostgreSQL
python标准库ElementTree处理xml
2022/05/20 Python
JS前端监控采集用户行为的N种姿势
2022/07/23 Javascript