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 相关文章推荐
硬盘浏览程序,保存成网页格式便可使用
Dec 03 Javascript
JavaScript中为什么null==0为false而null大于=0为true(个人研究)
Sep 16 Javascript
jQuery实现伸展与合拢panel的方法
Apr 30 Javascript
js获取元素的标签名实现方法
Oct 08 Javascript
微信小程序微信支付接入开发实例详解
Apr 12 Javascript
利用vscode编写vue的简单配置详解
Jun 17 Javascript
JS实现移动端按首字母检索城市列表附源码下载
Jul 05 Javascript
jQuery实现导航栏头部菜单项点击后变换颜色的方法
Jul 19 jQuery
微信小程序实现获取自己所处位置的经纬度坐标功能示例
Nov 30 Javascript
搭建element-ui的Vue前端工程操作实例
Feb 23 Javascript
JS使用百度地图API自动获取地址和经纬度操作示例
Apr 16 Javascript
Node.js API详解之 net模块实例分析
May 18 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性能优化的介绍
2013/06/20 PHP
PHP分页效率终结版(推荐)
2013/07/01 PHP
php实现文件下载(支持中文文名)
2013/12/04 PHP
SWFObject Flash js调用类
2008/07/08 Javascript
JQuery验证工具类搜集整理
2013/01/16 Javascript
jquery+json实现分页效果
2016/03/07 Javascript
VUE开发一个图片轮播的组件示例代码
2017/03/06 Javascript
整理一些最近经常遇到的前端面试题
2017/04/25 Javascript
php 修改密码实现代码
2017/05/24 Javascript
js实现日期显示的一些操作(实例讲解)
2017/07/27 Javascript
在angular 6中使用 less 的实例代码
2018/05/13 Javascript
Vue.js 中的 v-show 指令及用法详解
2018/11/19 Javascript
Vue.js 图标选择组件实践详解
2018/12/03 Javascript
从零开始在NPM上发布一个Vue组件的方法步骤
2018/12/20 Javascript
微信小程序如何调用json数据接口并解析
2019/06/29 Javascript
Vuex的API文档说明详解
2020/02/05 Javascript
Python的函数嵌套的使用方法
2014/01/24 Python
python使用7z解压软件备份文件脚本分享
2014/02/21 Python
Python中文字符串截取问题
2015/06/15 Python
python套接字流重定向实例汇总
2016/03/03 Python
简单谈谈Python的pycurl模块
2018/04/07 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
2018/05/29 Python
Anaconda下安装mysql-python的包实例
2018/06/11 Python
使用python将多个excel文件合并到同一个文件的方法
2019/07/09 Python
python处理document文档保留原样式
2019/09/23 Python
Python用dilb提取照片上人脸的示例
2020/10/26 Python
英国最好的温室之家:Greenhouses Direct
2019/07/13 全球购物
个人找工作自荐信格式
2013/09/21 职场文书
运动会广播稿400字
2014/01/25 职场文书
表决心的诗句大全
2014/03/11 职场文书
小学生作文评语
2014/04/18 职场文书
读书活动总结范文
2014/04/26 职场文书
看雷锋电影观后感
2015/06/10 职场文书
Python读取文件夹下的所有文件实例代码
2021/04/02 Python
浅谈spring boot使用thymeleaf版本的问题
2021/08/04 Java/Android
90后经典动画片排行:《数码宝贝》第二,《小鲤鱼历险记》在榜
2022/03/18 日漫