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代码
Oct 09 Javascript
jQuery 选择器理解
Mar 16 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
Jan 31 Javascript
ECMAScript6块级作用域及新变量声明(let)
Jun 12 Javascript
两款JS脚本判断手机浏览器类型跳转WAP手机网站
Oct 16 Javascript
javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
Oct 10 Javascript
JS代码实现百度地图 画圆 删除标注
Oct 12 Javascript
详解照片瀑布流效果(js,jquery分别实现与知识点总结)
Jan 01 Javascript
JavaScript使用FileReader实现图片上传预览效果
Mar 27 Javascript
利用JQUERY实现多个AJAX请求等待的实例
Dec 14 jQuery
vue-cli项目修改文件热重载失效的解决方法
Sep 19 Javascript
vue 属性拦截实现双向绑定的实例代码
Oct 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 全局变量范围分析
2009/08/07 PHP
php获取post中的json数据的实现方法
2011/06/08 PHP
利用php下载xls文件(自己动手写的)
2014/04/18 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
2014/12/15 PHP
PHP中spl_autoload_register()函数用法实例详解
2016/07/18 PHP
JavaScript学习点滴 call、apply的区别
2010/10/22 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
JS实现页面超时后自动跳转到登陆页面
2015/01/19 Javascript
javascript实现表单提交后,提交按钮不可用的方法
2015/04/18 Javascript
pace.js页面加载进度条插件
2015/09/29 Javascript
深入理解js函数的作用域与this指向
2016/05/28 Javascript
AngularJs bootstrap搭载前台框架——js控制部分
2016/09/01 Javascript
js获取指定字符前/后的字符串简单实例
2016/10/27 Javascript
基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 )
2017/03/30 Javascript
AngularJS  ng-repeat遍历输出的用法
2017/06/19 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
2017/10/11 Javascript
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
jQuery实现的点击图片居中放大缩小功能示例
2019/01/16 jQuery
js实现div色块拖动录制
2020/01/16 Javascript
jquery实现进度条状态展示
2020/03/26 jQuery
vue+springboot+element+vue-resource实现文件上传教程
2020/10/21 Javascript
[40:10]2015国际邀请赛全明星表演赛
2015/08/07 DOTA
Python常用模块介绍
2014/11/21 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
2019/01/24 Python
python调用虹软2.0第三版的具体使用
2019/02/22 Python
Python 实现遥感影像波段组合的示例代码
2019/08/04 Python
Python异常模块traceback用法实例分析
2019/10/22 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
2020/01/08 Python
台湾菁英交友:结识黄金单身的台湾人
2018/01/22 全球购物
八年级美术教学反思
2014/02/02 职场文书
物流管理专业毕业生求职信
2014/03/23 职场文书
2014年大学生党课心得体会范文
2014/03/29 职场文书
道德演讲稿
2014/05/21 职场文书
疾病证明书
2015/06/19 职场文书
React Hook用法示例详解(6个常见hook)
2021/04/28 Javascript
以MySQL5.7为例了解一下执行计划
2022/04/13 MySQL