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 相关文章推荐
javascript 对象的定义方法
Jan 10 Javascript
JavaScript 基础篇(一)
Mar 30 Javascript
Select标签下拉列表二级联动级联实例代码
Feb 07 Javascript
AngularJS基础知识笔记之表格
May 10 Javascript
jquery easyUI中ajax异步校验用户名
Aug 19 Javascript
JavaScript数组去重的几种方法效率测试
Oct 23 Javascript
JavaScript实现使用Canvas绘制图形的基本教程
Oct 27 Javascript
JavaScript中${pageContext.request.contextPath}取值问题及解决方案
Dec 08 Javascript
全选复选框JavaScript编写小结(附代码)
Aug 16 Javascript
JS获取浏览器地址栏的多个参数值的任意值实例代码
Jul 24 Javascript
JavaScript学习笔记之基于定时器实现图片无缝滚动功能详解
Jan 09 Javascript
vue+mock.js实现前后端分离
Jul 24 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中simplexml_load_string函数使用说明
2011/01/01 PHP
php使用CURL伪造IP和来源实例详解
2015/01/15 PHP
PHP输出图像imagegif、imagejpeg与imagepng函数用法分析
2016/11/14 PHP
Laravel中获取路由参数Route Parameters的五种方法示例
2017/09/29 PHP
Javascript 学习笔记 错误处理
2009/07/30 Javascript
jquery查找tr td 示例模拟
2014/05/08 Javascript
javascript面向对象特性代码实例
2014/06/12 Javascript
JQuery动态添加Select的Option元素实现方法
2016/08/29 Javascript
jQuery插件WebUploader实现文件上传
2016/11/07 Javascript
node.js支持多用户web终端实现及安全方案
2017/11/29 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
2018/03/02 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
2018/09/01 Javascript
[03:14]2014DOTA2西雅图国际邀请赛 EG战队巡礼
2014/07/07 DOTA
python 数据加密代码
2008/12/24 Python
Python字符串中查找子串小技巧
2015/04/10 Python
linux下python抓屏实现方法
2015/05/22 Python
浅析Python中yield关键词的作用与用法
2016/11/29 Python
python的Tqdm模块的使用
2018/01/10 Python
Python用于学习重要算法的模块pygorithm实例浅析
2018/08/16 Python
简单了解python变量的作用域
2019/07/30 Python
python类的实例化问题解决
2019/08/31 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
2019/11/05 Python
aden + anais官方网站:婴儿襁褓、毯子、尿布和服装
2017/06/21 全球购物
沙龙级头发造型工具:FOXYBAE
2018/07/01 全球购物
Steiff台湾官网:德国金耳釦泰迪熊
2019/12/26 全球购物
Napapijri西班牙在线商店:夹克、外套、运动衫等
2020/11/05 全球购物
北大自主招生自荐信
2013/10/19 职场文书
个人简历中的自我评价范例
2013/10/29 职场文书
自我反省检讨书
2014/01/23 职场文书
三八妇女节活动主持词
2014/03/17 职场文书
农民工工资承诺书范文
2014/03/31 职场文书
汽车专业求职信
2014/06/05 职场文书
怎样做好公众演讲能力?
2019/08/28 职场文书
解决redis sentinel 频繁主备切换的问题
2021/04/12 Redis
nginx配置指令之server_name的具体使用
2022/08/14 Servers
js基于div丝滑实现贝塞尔曲线
2022/09/23 Javascript