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

前端项目,特别是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>---------------------------JSlet 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; // 重置 IDframeAnimation.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.xdnf.cn/news/1549257.html

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

相关文章

带您了解《人工智能机器视觉应用工程师》

人工智能机器视觉应用是指利用人工智能技术和机器视觉技术相结合&#xff0c;使机器能够像人类一样通过视觉感知和理解环境&#xff0c;从而实现各种应用。随着人工智能技术的不断发展&#xff0c;机器视觉应用在各个领域得到了广泛应用。 在工业制造领域&#xff0c;人工智能机…

电商系统之链动2+1模式开发

在电商领域&#xff0c;创新的商业模式是推动市场增长与用户粘性的关键。链动21模式&#xff0c;作为一种基于社交裂变的分销策略&#xff0c;以其独特的团队构建与激励机制&#xff0c;在电商系统中展现出巨大的潜力。从程序员的技术角度出发&#xff0c;本文将深入探讨链动21…

汇编语言 访问CMOS RAM并打印时间(未完)

题目:以"年/月/日 时:分:秒"的格式,显示当前的日期,时间 提示:在此代码的基础上加以改造 assume cs:code code segment start:mov al,9 ;年out 70h,al ;传入9号单元的地址in al,71h ;取9号单元的内容&#xff0c;高4位为十位、低4位为各位mov ah,almov cl,4shr ah,…

最详细!适合AI大模型零基础入门的学习路线+学习方法+学习资料,全篇干货,建议收藏!

前言 随着ChatGPT的横空出世&#xff0c;大模型时代正式来临。千亿甚至万亿参数的大模型陆续出现&#xff0c;各大企业、高校纷纷推出自己的大模型&#xff0c;这标志着通用智能时代的到来。对于零基础的初学者来说&#xff0c;如何快速入门AI大模型&#xff0c;抓住这个时代的…

别再使用[]来获取字典的值了,来尝试一下这些方法

字典 在Python中&#xff0c;字典&#xff08;Dictionary&#xff09;是一种非常灵活的数据结构&#xff0c;用于存储键值对&#xff08;key-value pairs&#xff09;。每个键都是唯一的&#xff0c;并且与某个值相关联。字典是Python中处理映射关系&#xff08;即一个键对应一…

数据结构与算法——Java实现 22.有效的括号

目录 22. 有效的括号 思路 接口 数组实现类 有效的括号 力扣 直到有一天&#xff0c;我不会再问离开的人为什么 —— 24.9.28 22. 有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。…

【网站推荐】favicon图标生成

在制作网站的过程中&#xff0c;图标和 Favicon 是不可或缺的一部分。Favicon 是浏览器标签、书签和其他地方显示的小图标&#xff0c;它不仅可以增强网站的品牌识别度&#xff0c;还能提升用户体验。一个精美的 Favicon 可以让您的网站在众多标签中脱颖而出&#xff0c;吸引用…

信息学奥赛复赛复习06-CSP-J2020-02直播获奖-向上取整、向下取整、整数除法、最大值、最小值、计数排序

PDF文档回复:20240928 1 2020 CSP-J 题目1 优秀的拆分 [题目描述] NOI2130 即将举行。为了增加观赏性&#xff0c;CCF 决定逐一评出每个选手的成绩&#xff0c;并直播即时的获奖分数线。本次竞赛的获奖率为 w%&#xff0c;即当前排名前 w% 的选手的最低成绩就是即时的分数线 …

集合框架 - Map双列集合

01 概述 02 常用方法 03 遍历方式 【快捷键】&#xff1a;ctrlaltv 【说明】&#xff1a;Map.Entry<xx,xx>中&#xff0c;Entry是Map集合中的一个接口&#xff0c;但接口是不能创建对象的&#xff0c;它底层是通过使用Entry的实现类对象来封装键值对数据的。 【说明】&a…

LLM大模型学习:致AI新手掌握这些经验,助你少走三年弯路!

这篇文章&#xff0c;我将结合自己在大模型领域的经验&#xff0c;给大家详细聊聊新人应该如何转行大模型赛道&#xff1f; 比如大模型都有哪些方向&#xff1f;各方向的能力要求和岗位匹配&#xff1f;新手转行大模型常踩的坑和常见的误区&#xff1f;以及入行大模型最顺滑的…

代码为笔,合作作墨,共绘共赢画卷———未来之窗行业应用跨平台架构

合作共赢&#xff0c;代码同创&#xff0c;成就非凡 一、资源整合方面 1.1. 技术资源共享 - 不同的合作伙伴可能在技术领域各有所长。例如&#xff0c;一方可能擅长前端用户界面设计&#xff0c;具有丰富的交互设计经验&#xff0c;能够打造出美观、易用的预订界面&#xff…

Hadoop三大组件之MapReduce(一)

Hadoop之MapReduce 1. MapReduce是什么 MapReduce是一个分布式运算程序的编程框架&#xff0c;旨在帮助用户开发基于Hadoop的数据分析应用。它的核心功能是将用户编写的业务逻辑代码与自带的默认组件整合&#xff0c;形成一个完整的分布式运算程序&#xff0c;并并发运行在一…

Codeforces Round 975 (Div. 2)

传送门&#xff1a;https://codeforces.com/contest/2019 B. All Pairs Segments 题意&#xff1a; 首先样例解释一下&#xff1a; 一共有&#xff1a;[1,2],[1,3],[1,5],[1,6],[1,7],[2,3],[2,5],[2,6],[2,7],[3,5],[3,6],[3,7],[5,6],[5,7],[6,7] 点 1&#xff0c;7 在5个…

使用MessagePipe实现进程间通信

1、MessagePipe介绍 可以用于.NET和Unity上面的高性能的内存/分布式消息传递管道。适用于发布/订阅模式、CQRS的中介模式、Prism中的EventAggregator、IPC&#xff08;进程间通信&#xff09;-RPC等。 支持&#xff1a; 依赖注入过滤器管道更好的事件同步/异步带键值的/无键…

c++11~c++20 内联命名空间

在工作&#xff0c;我们经常会引入第三方库&#xff0c;偶尔会碰到同名的函数和类型&#xff0c;造成编译冲突的问题。一般我们可以使用命名空间&#xff0c;例如 #include <iostream> #include <iostream> using namespace std;namespace S1 {void foo(){cout &l…

基于python数据采集的可视化数据大屏,数据驱动的界面。

众所周知&#xff0c;可视化大屏离不开数据的采集&#xff0c;正式有了各种格式化的数据供给&#xff0c;可视化大屏才千姿百态&#xff0c;在数据采集方面&#xff0c;python优势什么明显&#xff0c;为大家分享一下。 一、python是什么 Python是一种高级、通用、解释型编程…

服装品牌小程序展示承载服务

服装大小品牌众多&#xff0c;还包括多区域的门店商家合作批发、咨询等&#xff0c;品牌或经销商想要获得更多生意&#xff0c;线上渠道往往是必备的&#xff0c;品牌宣传、获客转化及持续的信息干货输出等。 线上渠道多样化&#xff0c;尤其是微信、百度、抖音、快手等平台聚…

具身智能综述:鹏城实验室中大调研近400篇文献,深度解析具身智能

具身智能是实现通用人工智能的必经之路&#xff0c;其核心是通过智能体与数字空间和物理世界的交互来完成复杂任务。近年来&#xff0c;多模态大模型和机器人技术得到了长足发展&#xff0c;具身智能成为全球科技和产业竞争的新焦点。然而&#xff0c;目前缺少一篇能够全面解析…

Linux进程切换以及调度算法

目录 Linux进程切换以及调度算法 Linux进程切换介绍 前置知识 进程切换过程分析 调度算法 补充知识 Linux进程切换以及调度算法 Linux进程切换介绍 前面提到&#xff0c;分时操作系统下&#xff0c;CPU会在多个进程中做高速切换以实现多个进程看似同时执行的&#xff0…

防伪溯源查询系统V1.0.5

多平台&#xff08;微信小程序、H5网页&#xff09;二维码扫码输码防伪溯源查询系统&#xff0c;拥有强大的防伪码生成功能&#xff08;内置多种生成规则&#xff09;、批量导出防伪码数据、支持代理商管理端&#xff08;可批量对自己防伪码进行操作处理&#xff09;、文章资讯…