效果

前言

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() 处理多动画流程,在之前的文章我们已经了解过了。

循环运行

核心流程已经介绍完了,为了实现不同图标、循环运行,还需要两个条件:

  1. 使用图标名列表,并在以上基础之上添加多个图标的基础节点,按顺序遍历图标名列表即可
  2. 在上一次的动画 Promise 成功后再重复调用本函数,形成无限回调

总结

GSAP 系列也写过三篇文章了,核心无外乎 gsap.to()gsap.from() ,一款比 jQuery 性能还要好的动画库,所带来的快乐和收益是非常大的。

本文完整代码较长,可以在此查看:

fz6m / vue-gsap-fireworks-demo

css+gsap+vue实现背景图标放烟花/天女散花/随机发散效果相关推荐

  1. CSS实现Div层背景半透明而内容不透明的效果

    CSS实现Div层背景半透明而内容不透明的效果 2014年5月18日 MK 前端设计 0 阅读 2932次 前几天有一个学弟问我,怎么样能实现Div层背景半透明而内容不透明的效果呢,他写的效果不管怎么 ...

  2. CSS中如何制作背景图片半透明但内容不透明的效果

    CSS中如何制作背景半透明但内容不透明的效果 一.利用伪元素:before添加一个半透明的背景,并利用position定位属性,设置z-index值为-1,显示在下层. css: <style& ...

  3. 005_HTML制作炫酷登录界面(CSS精灵图、背景图片局部显示)

    效果: 说明: 输入框由三部分组成: 装局部图标的span 显示提示文字的span 接受用户输入的input 交互效果 刚打开页面,所有输入框显示提示文字 当input获得焦点,提示文字消失 当inp ...

  4. 教你用 css 写一个拟物化图标

    拟物化(Skeuomorphism)风格的图标在iOS7发布之前广为流行.相当长一段时间,无论系统.网页还是第三方应用都争相使用拟物化的设计风格.那时候的dribbble网,各色优秀的拟物化设计作品也 ...

  5. Vue 使用阿里图标库代替element icon

    一.创建阿里图标库项目 打开网址:https://www.iconfont.cn/ ,找到[我的项目] 点击右侧文件夹[创建项目] 填写[项目名称],[FontClass]前缀填好后,后续使用icon ...

  6. 最近分享一款抖音上很火的七夕节程序员表白页面_html5七夕表白放烟花动画特效...

    html5七夕表白放烟花动画特效 最近分享一款抖音上很火的七夕节程序员表白页面.小姐姐,我好喜欢你,你愿意做我女朋友吗? 表白成功触发烟花背景动画特效. 表白内容:有人说,人的一生会遇到2920万人, ...

  7. 最近分享一款抖音上很火的七夕节程序员表白页面_html5七夕表白放烟花动画特效

    html5七夕表白放烟花动画特效 最近分享一款抖音上很火的七夕节程序员表白页面.小姐姐,我好喜欢你,你愿意做我女朋友吗? 表白成功触发烟花背景动画特效. 表白内容:有人说,人的一生会遇到2920万人, ...

  8. CSS精灵图、字体图标、三角、鼠标样式、用户界面样式、溢出省略号

    [CSS精灵图.字体图标.三角.鼠标样式.用户界面样式.溢出省略号] 本文档是个人对 Pink 老师课程的总结归纳及补充,转载请注明出处! 一.精灵图 1.1 为什么需要精灵图? 一个网页中往往会应用 ...

  9. html css导航栏字体图标,HTML+CSS入门之两种图标字体库

    本篇教程介绍了HTML+CSS入门之两种图标字体库,希望阅读本篇文章以后大家有所收获,帮助大家HTML+CSS入门. < ## 0. 前言 比较基础的图标加载:和块元素的背景background ...

最新文章

  1. 在IBatisNet中使用存储过程
  2. 【程序员归家计划】放假回家之前拜服务器?不存在的,这才是保证程序员过好年的正确打开方式...
  3. python写一个游戏多少代码-使用50行Python代码从零开始实现一个AI平衡小游戏
  4. 【实战】感恩教师节小程序制作
  5. [渝粤教育] 中国地质大学 面向对象程序设计 复习题 (2)
  6. vs2010 sp1 安装 Silverlight4_Tools 提示 错误 解决办法
  7. dll侧加载_WORD打开时出现加载DLL错误解决方法
  8. linus开启snmp_【snmp】Linux开启snmp及查询
  9. 使用SCM管理jenkinsfile
  10. kali教程--破解wifi密码
  11. apollo简易高精度地图制作
  12. 计算机平面设计大专学校排名,平面设计学校排名哪些较好?
  13. hardfault常见原因_应对STM32 Cortex-M3 Hard Fault异常
  14. 简单实现Linux下线程池
  15. python解一元二次方程复数_python – SymPy和复数的平方根
  16. 智能电子眼镜可监控健康,可进行脑机接口视觉刺激,控制视频游戏
  17. 图解域名解析成IP的全过程(你浏览器摁下一个网址后发生了啥?)
  18. ArrayIndexOutOfBoundsException: 4096 while reading gif file
  19. 谈谈自己对目前新型冠状病毒疫情的想法
  20. RISC-V架构生态及相关学习记录

热门文章

  1. pwnable.kr bof
  2. 学习笔记-WVA-MOEAD
  3. String的equals()和==
  4. 【React进阶-1】从0搭建一个完整的React项目(入门篇)
  5. Cloudreve自建云盘实站:容量和速度自己来决定
  6. 注解@Value()的使用
  7. WindowsServer2012修改用户名后远程桌面连接失败
  8. 计算机组成原理实验报告范文,计组实验报告
  9. JavaScript审计
  10. vSphere Client :Windows虚拟机恢复密码