前端常用动画 直接可以用的代码加详细流程和案例 能应付90%的开发场景

news2024/9/28 17:20:18

前端项目,特别是Toc的项目,一定少不了各种动效和动画效果。

葫芦七兄弟:

  • CSS 动画

    • 优点:兼容性强;浏览器针对的流畅度优化;语法简单;某些属性(如 transform 和 opacity)可以利用 GPU 加速,提高性能;
    • 缺点:复杂的动画和交互难以实现;调试困难;
  • JavaScript 动画 requestAnimationFrame

    • 优点:可以实现复杂的动画效果和交互;精确控制动画的每一帧;运行时动态生成和修改动画;
    • 缺点:编写和维护复杂;浏览器兼容性需手动处理;
  • Web Animations API (WAAPI)

    • 优点:结合了 CSS 动画的性能优势和 JavaScript 的灵活性;可以利用硬件加速。
    • 缺点:旧版本的浏览器可能不支持;API 较为复杂;
  • SVG 动画

    • 优点:矢量图形无限缩放而不失真;简单的动画性能好;
    • 缺点:SVG 动画的开发工具较少;旧版本的浏览器可能存在问题;
  • Lottie

    • 优点:可以导入 After Effects 动画,保持高质量的设计;支持 Web、iOS、Android 等多个平台;只需加载 JSON 文件即可渲染动画,无需手动编写动画代码;
    • 缺点:依赖工具;不支持所有 After Effects 特性,某些高级效果可能无法导出;
  • GSAP (GreenSock Animation Platform)

    • 优点:高性能适合复杂的动画;提供了丰富的动画控制和插值函数;兼容性好;
    • 缺点:API 较为复杂;部分高级功能需要购买商业许可;
  • Three.js

    • 相对比webgl简单,但都是相当难的一档了。需要大量专业知识。包括但不限于:数学、建模、绘图、3D等。掌握熟练后都可以直接转行3D了哈哈哈,一般需求不建议搞这个。

我工作的开发环境需要考虑兼容性,且有UI支持一部分复杂动画效果,所以常用的方案包括但不限于以下三种:

gsap动画

通过Gsap动画库,可以实现纯前端的动画。从一个dom丝滑转变为另一个dom,或者dom本身大小变化等。

  • 文档
    文档地址 比反人类的swiper文档好用太多

  • 安装
    npm install gsap

  • 引入
    import gsap from 'gsap'//奖品动画效果

  • 代码1
    不同Dom的丝滑切换

  const toggleAnimation = (ind) => {
    const staticstate = document.querySelector(`.staticstate${ind}`);
    const spinner = document.querySelector(`.spinner${ind}`);

    gsap.to(staticstate, {
        opacity: 0,
        duration: 0,
        onComplete: () => {
            staticstate.style.display = 'none';
            spinner.style.display = 'block';
        }
    });
  }

  const toggleAnimation2 = (ind) => {
    const spinner = document.querySelector(`.spinner${ind}`);
    const checkmark = document.querySelector(`.checkmark${ind}`);

    gsap.to(spinner, {
        opacity: 0,
        duration: 0,
        onComplete: () => {
          gsap.to(checkmark, {
              opacity: 1,// 透明度 
              scale: 1, // 放大效果
              duration: 1, // 动画持续时间
              ease: 'power1.inOut', // 动画缓动函数
          });
        }
    });
  }
  • 动画效果1
  • 从未完成 加载中 完成的状态转变的动画
    在这里插入图片描述
  • 代码2
    同一DOM的放大缩小
  const toggleAnimation = (ind,reversal) => {
    const prize = document.querySelector(`.prize-prize${ind}`);

    gsap.to(prize, {
        opacity: 1,// 透明度 
        scale: reversal?1.05:0.9, // 放大缩小效果
        duration: 1.5, // 动画持续时间
        ease: 'power1.inOut', // 动画缓动函数
        onComplete: () => {
          gsap.to(prize, {
              opacity: 1,// 透明度 
              scale: reversal?0.9:1.05, // 放大缩小效果
              duration: 1, // 动画持续时间
              ease: 'power1.inOut', // 动画缓动函数
          });
        }
    });
  }
  • 动画效果2
    四周悬浮的就是gsap动画效果
    中间的是lottie-JSON(png)动画,下面就会讲到
    在这里插入图片描述

lottie-web

这个需要依赖UI 使用Adobe After Effects【AE】制作动画,导出对应的JSON文件后使用

  • 文档
    文档地址

  • 仓库
    文档地址

  • 安装
    npm install lottie-web

  • 引入
    import lottie from 'lottie-web';//JSON动画接入

  • lottie JSON动画(svg)
    引入项目打开后看到大概是这样,SVG类型没有附加文件,通过点和线的计算绘制就可以实现动画效果
    在这里插入图片描述

  • lottie JSON动画(png)
    引入项目打开后看到大概是这样,PNG类型有附加文件,实现的效果一般较为复杂,需要通过基础的图片来实现动画。
    这时会涉及到引用路径的问题
    因为无法再JSON中使用相对路径和vite的import.meta.url
    所以我把他们放在了public目录下,避免被打包附加的哈希值影响
    在这里插入图片描述

序列帧动画

当动画复杂度超出一定程度时,JSON动画会无法承载,导出会丢失样式【UI说的】。所以这时前端就需要接入帧动画了。
帧动画,顾名思义就是把每一帧的图片都给到前端,然后手动组装进行播放。
在这里插入图片描述

解决思路有很多,我这里为了兼顾在安卓和IOS不同环境、webview版本下的播放效果【IOS特别注意因内存机制会有闪烁问题 改用雪碧图方案 计算位移和预加载略麻烦但效果和兼容性很好】
提供以下两种思路:


-------------------------html

      <van-overlay style="z-index: 2;" :show="frameAnimation" :lock-scroll="false">
        <div id="frameAnimationDom" class="title-bg"></div>
      </van-overlay>
      
---------------------------JS

let timer4;//动画计时器

  function preLoad() {// 预加载帧动画图片
    const frameCount = 58; // 帧数
    for (let i = 0; i <= frameCount; i++) {
        const img = new Image();
        img.src = new URL(`../assets/images/blind/frame/${i}.png`,import.meta.url).href;
        images.value.push(img);
    }
 

          frameAnimation.value = true;
          
          // 方案一 帧动画
          setTimeout(()=>{//确认支付后再播放动画开奖
            const frameCount = 58; // 帧数
            const frameElement = document.getElementById('frameAnimationDom');
            let currentFrameIndex = 0;
            let lastTime = 0;

            function animate() {
                if (new Date().getTime() - lastTime >= 40) { // 40毫秒一帧  一秒25帧
                    frameElement.style.backgroundImage = `url(${images.value[currentFrameIndex].src})`;
                    currentFrameIndex = (currentFrameIndex + 1) % frameCount;
                    lastTime = new Date().getTime();
                }
                timer4 = requestAnimationFrame(animate);
            }

            // 开始动画
            animate();
          },200)

          // 方案2  雪碧图
          // animate();

          // const frameCount = 51; // 总帧数
          // const frameWidth = 780; // 每帧宽度
          // let currentFrame = 0;
          // let lastTime = 0;

          // function animate() {
          //   if (new Date().getTime() - lastTime >= 75) { // 60毫秒一帧  一秒25帧
          //     const frameElement = document.getElementById('frameAnimationDom');
          //     const offset = -currentFrame * frameWidth;
          //     frameElement.style.backgroundPosition = `${offset}px 0`;
          //     currentFrame = (currentFrame + 1) % frameCount;
          //     lastTime = new Date().getTime();
          //   }
          //   timer4 = requestAnimationFrame(animate);
          // }
 
  setTimeout(()=>{
    cancelAnimationFrame(timer4)// 清除动画循环
    timer4 = null; // 重置 ID
    frameAnimation.value = false;
  },2650)


-------------------------css

//  方案1  帧动画
.title-bg{
  width: 375px;
  height: 812px;
  background-size: 100% 100%;
  margin: 0 auto 0 auto;
}
  
//  方案2  雪碧图
// .title-bg{  
//   width: 375px;
//   height: 812px;
//   background-image: url(../assets/images/blind/sprites.png);//动态高度做展开  后由于图片过多改为滚动展示
//   background-size: auto 100%; /* 确保背景图像的高度与容器高度一致 */
//   margin: 0 auto 0 auto;
// }

未完待续…【不过一般的需求这些方式也都足够了,其他的我遇到了再补充,码友们也可以作为思路再自己向外拓展哈~】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2174205.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS 的背景样式

1.1 背景颜色 1.2 背景图片 1.3 背景平铺 1.4 背景图片位置 1.4.1 方位名词 1.4.2 精确单位 1.4.3 混合单位 1.5 背景图像固定 1.6 背景复合写法 1.7 背景色半透明 1.8 总结

Json-Rpc框架(Muduo库快速上手)

阅读导航 引言一、Muduo库简介二、Muduo库常见接口1. TcpServer类基础介绍2. EventLoop类基础介绍3. TcpConnection类基础介绍4. TcpClient类基础介绍5. Buffer类基础介绍 三、Muduo库使用示例⭕英译汉服务器⭕英译汉客户端 引言 在上一篇文章中&#xff0c;我们简要介绍了在项…

业务资源管理模式语言19

相关模式&#xff1a; 如果你考虑类“Resource Maintenance”和“Part used in maintenance”&#xff0c;那么是“Transaction-Transaction Line Item”模式的一个特例[Coa 97]。如果你考虑类“Part”和“Part used in maintenance”&#xff0c;那么是“Item Line Item”模式…

力扣 简单 104.二叉树的最大深度

文章目录 题目介绍解法 题目介绍 解法 如果知道了左子树和右子树的最大深度 l 和 r&#xff0c;那么该二叉树的最大深度即为max(l,r)1&#xff0c;而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用递归的方法来计算二叉树的最大深度。具体而言&#xff…

动态规划(有背包问题)

目录 1.动态规划的介绍 2.动态规划的例题 第1道题 数字三角形 (如果想看递归写法可以到我的记忆化递归里去看看记忆化递归_将递归程序记忆化-CSDN博客) 第2道题最长公共子序列(模板) 第3道题 最长上升子序列 第4道题最大子段和 背包系列问题 01背包 完全背包 1.动态规…

scrapy爬虫基础

一、初识 创建项目&#xff1a; scrapy startproject my_one_project # 创建项目命令 cd my_one_project # 先进去&#xff0c; 后面在里面运行 运行爬虫命令为&#xff1a;scrapy crawl tk spiders下创建test.py 其中name就是scrapy crawl tk &…

LeetCode讲解篇之5. 最长回文子串

文章目录 题目描述题解思路题解代码 题目描述 题目链接 题解思路 从中心点先寻找和中心点相等的左右端点&#xff0c;在基于左右端点进行往外扩散&#xff0c;直至左右端点不相等或者越界&#xff0c;然后左右端点这个范围内就是我们找寻的回文串&#xff0c;我们遍历中心点…

VS Code 配置 Anaconda Python 环境

VS Code 配置 Anaconda Python 环境 董同学是使用 PyCharm 进行 python 开发的老选手了&#xff0c;但同事们都在用 VS Code。为了更好的和大家交流&#xff0c;转身投入 VS Code 的怀抱&#xff08;当然我都要&#xff09;。当我兴致盎然打开 VS Code 软件&#xff0c;真丝滑…

自动化测试实例:Web登录功能性测试(无验证码)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是自动化测试 把人为驱动的测试行为转化为机器执行的一种过程称为自动化测试。(来自百度百科)本质上来说&#xff0c;自动化测试对比起手工测试除了需要…

自动化check是不是测试?

这篇文章是reddit上关于质量保障讨论的比较多的帖子&#xff0c;我把它转为中文版&#xff0c;供大家交流学习&#xff0c;由于直接用的翻译软件以及截图&#xff0c;大家凑合看下哈。 自动化检查并不是真正的“测试”&#xff1f;编写自动化检查确实很重要——但编写自动化测…

笔记整理—linux进程部分(1)进程终止函数注册、进程环境、进程虚拟地址

对于mian()函数而言&#xff0c;执行前也需要先执行一段引导代码才会去执行main()函数&#xff0c;该部分的代码包含构建c语言的运行环境等配置&#xff0c;如清理bss段等。 在使用gcc去编译程序的时候&#xff0c;使用gcc -v xxx.c可见链接过程。在编译完成后可见xxx.out文件。…

[产品管理-33]:实验室技术与商业化产品的距离,实验室技术在商业化过程中要越过多少道“坎”?

目录 一、实验室技术 1.1 实验室研究性技术 1.2 技术发展的S曲线 技术发展S曲线的主要阶段和特点 技术发展S曲线的意义和应用 二、实验室技术商业化的路径 2.1 实验室技术与商业化产品的距离 1、技术成熟度与稳定性 - 技术自身 2、市场需求与适应性 - 技术是满足需求 …

计算机毕业论文及毕业设计题目,计算机专业大专本科学位毕业论文题目推荐大全集

目录 一 软件工程方向 二 网络安全方向 三 人工智能与机器学习方向 四 大数据方向 五 云计算与虚拟化方向 六 数据库与信息系统方向 计算机专业的毕业论文或毕业设计题目通常需要结合当前的技术趋势以及个人兴趣来确定。一个好的选题不仅能够体现学生的学术水平和技术能…

【行业报告】AI大模型对我国劳动力市场潜在影响研究报告(2024),附PDF下载!!

前言 9月13日&#xff0c;北京大学国家发展研究院联合智联招聘在中国国际服务贸易交易会上发布的《AI大模型对我国劳动力市场潜在影响研究&#xff1a;2024》&#xff08;以下简称“报告”&#xff09;显示&#xff0c;2024年上半年&#xff0c;招聘职位数同比增速前五的人工智…

【含文档】基于Springboot+Vue的高校自习室预约系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

git小乌龟

下载git小乌龟 官方地址 Download – TortoiseGit – Windows Shell Interface to Git git小乌龟下载 选择自己对应的版本进行下载 安装完成后我们会发现是英文&#xff0c;这对我们这些英语不好的很不友好&#xff0c;所以就需要下载语言包 下载对应语言包 安装完成后我们…

自然语言处理实战项目:从基础到实战

自然语言处理实战项目&#xff1a;从基础到实战 自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;是人工智能的重要分支&#xff0c;致力于让计算机能够理解、生成和处理人类语言。NLP 在搜索引擎、智能客服、语音助手等场景中扮演着关键角色。本文将带…

HTML5--裸体回顾

免责声明&#xff1a;本文仅做分享~ 详情请参考以下&#xff1a; HTML 系列教程 (w3school.com.cn) 菜鸟教程 - 学的不仅是技术&#xff0c;更是梦想&#xff01; --本文是光秃秃的空壳. 标题标签 段落标签 换行和水平线 文本格式化标签 &#xff08;一般用左边的&#xff…

2024年10月CISAW课程安排

信息安全保障人员&#xff08;CISAW&#xff09;各方向的第一阶段和第二阶段培训本月将以线上线下模式开展 CISAW根据专业领域分为多个类别&#xff0c;如安全集成、安全运维、风险评估、应急服务、软件安全开发等&#xff0c;通过培训后可获得全国通用的信息安全保障人员认证证…

Linux驱动编程——根文件系统

一 、续上节 TFTP为简单文件传输协议&#xff0c;底层基于UDP。 ★1、arm上电后两种方式启动原理 &#xff08;1&#xff09;Nor flash可直接寻址&#xff0c;前面在使用2440时&#xff0c;均使用的是Nor flash&#xff1b; pc指令开始为0&#xff0c;上电后先指向地址为0的…