css+gsap+vue实现背景图标放烟花/天女散花/随机发散效果
效果
前言
gsap 基础这里不做多详述,可以先学习此文:
《 gsap.js 的简单应用——页面加载文字弹出效果》
了解 gsap.to()
的使用方法。
实现
基础图标
基础图标即——每个小图标,有了基础图标,我们再对其复制做出随机的动画。
基础图标可以是 .png
、.svg
等,不做限制,但是要统一 absolute
放置在页面动画产生点:
<div class="icons" ref="icons"><div ref="vue" style="display: none;">// ... 嵌入图标节点</div>
</div>
在最外层 icons
包裹所有基础图标以及复制出的节点,基础图标采用 display: none;
防止显示,并加以双居中 + 初始 opacity: 0;
(在之前的文章中,我们说过了 autoAlpha
比只使用 opacity
性能要佳,使用 opacity: 0;
+ autoAlpha
动画可以达到更好的效果)。
.vue {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%) scale(0);opacity: 0;z-index: -1;}
核心动画
动画是一个异步的过程,为了把握,我们往往在 gsap.to()
的第三个参数中 onComplete
配置完成要做的事情,同时每一个动画过程都创建一个 Promise
+ 全部动画 Promise.all()
的形式执行。
如果你还不明白为什么要这么做,你可以通过此文来了解:
《 vue + gsap 实现 vuetelemetry 动画轮播图》
有了以上的基础,我们便可以写出动画核心变换如下:
animation(node) {const width = this.width;const height = this.height;return new Promise((resolve, reject) => {try {const v = gsap.to(node, 0.3, {x: 2 * (Math.random() - 0.5) * width,y: 2 * (Math.random() - 0.5) * height,autoAlpha: Math.random() * 0.4 + 0.2,scale: Math.random() * 0.5 + 0.3,rotate: 2 * (Math.random() - 0.5) * 40,});setTimeout(() => {v.reverse().then(() => {resolve();});}, 3000);} catch (e) {reject(e);}});},
这是一个相比之前文章十分简单的动画变换,在之前的文章中,我们没有使用过反向执行 reverse()
与 .then()
:
reverse()
:反向执行动画。必须要先拿到gsap.to()
返回的渐变实体类Tween
才能执行。.then()
:动画结束后需要做的事情。优点是该函数晚于onComplete
,缺点是不能使用this
。
动画主函数
popIcons(className) {const icons = this.$refs.icons;const target = this.$refs[className];target.style = "";target.classList.add(className);const targetCopy = target.cloneNode(true);const newNodeList = [];for (let i = this.count; i--; ) {let node = targetCopy.cloneNode(true);newNodeList.push(node);icons.appendChild(node);}const animationTask = [];document.getElementsByClassName(className).forEach((node) => {animationTask.push(this.animation(node));});Promise.all(animationTask).then(() => {newNodeList.forEach((node) => {node.parentNode.removeChild(node);});});},
下面详解实现逻辑:
const icons = this.$refs.icons;const target = this.$refs[className];target.style = "";target.classList.add(className);
↑ 选取所有图标外层父节点 icons
与基础图标节点(也就是被隐藏的包裹图标的节点),之后清除 style
(清除了 display: none;
)使节点可显示,并添加好我们在上文中定义的类。
这个类有两个作用,第一是 absolute
+ 双居中,并且全透明,作为动画的初始状态;第二是方便 gsap.to()
元素选择器选择节点。
const targetCopy = target.cloneNode(true);const newNodeList = [];for (let i = this.count; i--; ) {let node = targetCopy.cloneNode(true);newNodeList.push(node);icons.appendChild(node);}
↑ 克隆节点,并把所有新添加的节点添加入父节点 icons
内。
注:相同节点不能被多次添加,只能不断克隆新节点再添加。
const animationTask = [];document.getElementsByClassName(className).forEach((node) => {animationTask.push(this.animation(node));});Promise.all(animationTask).then(() => {newNodeList.forEach((node) => {node.parentNode.removeChild(node);});});
↑ 最基础的 Promise.all()
处理多动画流程,在之前的文章我们已经了解过了。
循环运行
核心流程已经介绍完了,为了实现不同图标、循环运行,还需要两个条件:
- 使用图标名列表,并在以上基础之上添加多个图标的基础节点,按顺序遍历图标名列表即可
- 在上一次的动画
Promise
成功后再重复调用本函数,形成无限回调
总结
GSAP 系列也写过三篇文章了,核心无外乎 gsap.to()
和 gsap.from()
,一款比 jQuery 性能还要好的动画库,所带来的快乐和收益是非常大的。
本文完整代码较长,可以在此查看:
fz6m / vue-gsap-fireworks-demo
css+gsap+vue实现背景图标放烟花/天女散花/随机发散效果相关推荐
- CSS实现Div层背景半透明而内容不透明的效果
CSS实现Div层背景半透明而内容不透明的效果 2014年5月18日 MK 前端设计 0 阅读 2932次 前几天有一个学弟问我,怎么样能实现Div层背景半透明而内容不透明的效果呢,他写的效果不管怎么 ...
- CSS中如何制作背景图片半透明但内容不透明的效果
CSS中如何制作背景半透明但内容不透明的效果 一.利用伪元素:before添加一个半透明的背景,并利用position定位属性,设置z-index值为-1,显示在下层. css: <style& ...
- 005_HTML制作炫酷登录界面(CSS精灵图、背景图片局部显示)
效果: 说明: 输入框由三部分组成: 装局部图标的span 显示提示文字的span 接受用户输入的input 交互效果 刚打开页面,所有输入框显示提示文字 当input获得焦点,提示文字消失 当inp ...
- 教你用 css 写一个拟物化图标
拟物化(Skeuomorphism)风格的图标在iOS7发布之前广为流行.相当长一段时间,无论系统.网页还是第三方应用都争相使用拟物化的设计风格.那时候的dribbble网,各色优秀的拟物化设计作品也 ...
- Vue 使用阿里图标库代替element icon
一.创建阿里图标库项目 打开网址:https://www.iconfont.cn/ ,找到[我的项目] 点击右侧文件夹[创建项目] 填写[项目名称],[FontClass]前缀填好后,后续使用icon ...
- 最近分享一款抖音上很火的七夕节程序员表白页面_html5七夕表白放烟花动画特效...
html5七夕表白放烟花动画特效 最近分享一款抖音上很火的七夕节程序员表白页面.小姐姐,我好喜欢你,你愿意做我女朋友吗? 表白成功触发烟花背景动画特效. 表白内容:有人说,人的一生会遇到2920万人, ...
- 最近分享一款抖音上很火的七夕节程序员表白页面_html5七夕表白放烟花动画特效
html5七夕表白放烟花动画特效 最近分享一款抖音上很火的七夕节程序员表白页面.小姐姐,我好喜欢你,你愿意做我女朋友吗? 表白成功触发烟花背景动画特效. 表白内容:有人说,人的一生会遇到2920万人, ...
- CSS精灵图、字体图标、三角、鼠标样式、用户界面样式、溢出省略号
[CSS精灵图.字体图标.三角.鼠标样式.用户界面样式.溢出省略号] 本文档是个人对 Pink 老师课程的总结归纳及补充,转载请注明出处! 一.精灵图 1.1 为什么需要精灵图? 一个网页中往往会应用 ...
- html css导航栏字体图标,HTML+CSS入门之两种图标字体库
本篇教程介绍了HTML+CSS入门之两种图标字体库,希望阅读本篇文章以后大家有所收获,帮助大家HTML+CSS入门. < ## 0. 前言 比较基础的图标加载:和块元素的背景background ...
最新文章
- 在IBatisNet中使用存储过程
- 【程序员归家计划】放假回家之前拜服务器?不存在的,这才是保证程序员过好年的正确打开方式...
- python写一个游戏多少代码-使用50行Python代码从零开始实现一个AI平衡小游戏
- 【实战】感恩教师节小程序制作
- [渝粤教育] 中国地质大学 面向对象程序设计 复习题 (2)
- vs2010 sp1 安装 Silverlight4_Tools 提示 错误 解决办法
- dll侧加载_WORD打开时出现加载DLL错误解决方法
- linus开启snmp_【snmp】Linux开启snmp及查询
- 使用SCM管理jenkinsfile
- kali教程--破解wifi密码
- apollo简易高精度地图制作
- 计算机平面设计大专学校排名,平面设计学校排名哪些较好?
- hardfault常见原因_应对STM32 Cortex-M3 Hard Fault异常
- 简单实现Linux下线程池
- python解一元二次方程复数_python – SymPy和复数的平方根
- 智能电子眼镜可监控健康,可进行脑机接口视觉刺激,控制视频游戏
- 图解域名解析成IP的全过程(你浏览器摁下一个网址后发生了啥?)
- ArrayIndexOutOfBoundsException: 4096 while reading gif file
- 谈谈自己对目前新型冠状病毒疫情的想法
- RISC-V架构生态及相关学习记录