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 相关文章推荐
在页面上点击任一链接时触发一个事件的代码
Apr 07 Javascript
JSuggest自动匹配下拉框使用方法(示例代码)
Dec 27 Javascript
关闭浏览器输入框自动补齐 兼容IE,FF,Chrome等主流浏览器
Feb 11 Javascript
简介JavaScript中Boolean.toSource()方法的使用
Jun 05 Javascript
JS判断页面是否出现滚动条的方法
Jul 17 Javascript
jQuery EasyUI 右键菜单--关闭标签/选项卡的简单实例
Oct 10 Javascript
原生js实现电商侧边导航效果
Jan 19 Javascript
移动端手指放大缩小插件与js源码
May 22 Javascript
jQuery读取本地的json文件(实例讲解)
Oct 31 jQuery
js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
Mar 02 Javascript
小程序实现简单语音聊天的示例代码
Jul 24 Javascript
k8s node节点重新加入master集群的实现
Feb 22 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 图片上传实现代码 带详细注释
2010/04/29 PHP
php中stream(流)的用法
2014/03/25 PHP
PHP预定义变量9大超全局数组用法详解
2016/04/23 PHP
PHP7新功能总结
2019/04/14 PHP
不一样的文字闪烁 轮番闪烁
2009/11/11 Javascript
JavaScript数值转换的三种方式总结
2014/07/31 Javascript
元素绑定click点击事件方法
2015/06/08 Javascript
JavaScript基于ajax编辑信息用法实例
2015/07/15 Javascript
jQuery实现下滑菜单导航效果代码
2015/08/25 Javascript
学习JavaScript设计模式(多态)
2015/11/25 Javascript
js实现简易垂直滚动条
2017/02/22 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
浅谈angular.js跨域post解决方案
2017/08/30 Javascript
简单谈谈js的数据类型
2017/09/25 Javascript
vue-resource + json-server模拟数据的方法
2017/11/02 Javascript
JavaScript 跨域之POST实现方法
2018/05/07 Javascript
jQuery插件实现弹性运动完整示例
2018/07/07 jQuery
JavaScript 严格模式(use strict)用法实例分析
2020/03/04 Javascript
vuex分模块后,实现获取state的值
2020/07/26 Javascript
[19:24]DOTA2客户端使用指南 一分钟快速设置轻松超神
2013/09/24 DOTA
Python打印斐波拉契数列实例
2015/07/07 Python
详解Python3序列赋值、序列解包
2019/05/14 Python
python函数enumerate,operator和Counter使用技巧实例小结
2020/02/22 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
2020/03/20 Python
Pyspark读取parquet数据过程解析
2020/03/27 Python
用Python制作音乐海报
2021/01/26 Python
捷克浴室和厨房设备购物网站:SIKO
2018/08/11 全球购物
普通院校学生的自荐信
2013/11/27 职场文书
奶茶专卖店创业计划书
2014/01/18 职场文书
商务英语专业求职信范文
2014/01/28 职场文书
党校学习自我鉴定
2014/02/24 职场文书
教师求职简历自我评价
2015/03/10 职场文书
格列佛游记读书笔记
2015/06/30 职场文书
会议室管理制度范本
2015/08/06 职场文书
高一地理教学工作总结
2015/08/12 职场文书
Python使用永中文档转换服务
2022/05/06 Python