news 2026/2/13 23:48:32

Anime.js + Next.js 15 全面教程:常用 API 串联与实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Anime.js + Next.js 15 全面教程:常用 API 串联与实战指南

大家好,我是jobleap.cn的小九。
你想要学习 Anime.js 库的常用用法,并获取一份基于 Next.js 15 的实战教程,要求串联 Anime.js 的核心 API 并完整落地。需要先说明:Anime.js 是前端浏览器端的动画库(非 Node.js 服务端库),Next.js 15 中需在客户端组件中使用它,下面的教程会完整覆盖 Anime.js 所有高频 API,并基于 Next.js 15 的最新特性实现实战案例。

一、环境准备

1. 创建 Next.js 15 项目

# 初始化 Next.js 15 项目npx create-next-app@latest animejs-next15-democdanimejs-next15-demo# 安装 Anime.jsnpminstallanimejs# 可选:安装 @types/animejs 获得类型提示(TypeScript 项目)npminstall-D @types/animejs

2. 核心前提

Next.js 15 默认开启 React Server Components (RSC),Anime.js 依赖浏览器 DOM,因此必须在客户端组件中使用(添加'use client'指令)。

二、Anime.js 核心常用 API 梳理

Anime.js 的核心能力围绕「动画目标」「动画属性」「时间控制」「动画编排」「交互控制」展开,常用 API 分类如下:

类别核心 API/配置作用
基础配置targetsdurationeasing指定动画目标、时长、缓动
时间控制delayloopdirection延迟、循环、播放方向
动画属性translatescaleopacityrotate位移、缩放、透明度、旋转
动画编排anime.timeline()时间线(串联/并行动画)
交互控制play()pause()restart()seek()播放/暂停/重置/跳转
高级动画pathstrokeDashoffset路径动画、SVG 描边动画
回调函数completeupdate动画完成/更新时触发

三、Next.js 15 实战:串联所有常用 API

下面创建一个客户端组件AnimeDemo.tsx,整合 Anime.js 所有高频 API,实现「基础动画 + 时间线 + 路径动画 + 滚动触发 + 交互控制 + SVG 动画」的完整案例。

完整代码(app/anime-demo/page.tsx)

'use client'; // 必须声明为客户端组件 import { useEffect, useRef, useState } from 'react'; import anime from 'animejs/lib/anime.es.js'; // 导入 Anime.js 核心 export default function AnimeJsDemo() { // 1. 定义 DOM 引用(用于指定动画目标) const boxRef = useRef<HTMLDivElement>(null); const svgRef = useRef<SVGSVGElement>(null); const pathRef = useRef<SVGPathElement>(null); const ballRef = useRef<HTMLDivElement>(null); const [isScrollTriggered, setIsScrollTriggered] = useState(false); const animationRef = useRef<anime.AnimeInstance | null>(null); // 保存动画实例用于控制 // 2. 初始化基础动画 + 时间线 useEffect(() => { // 校验 DOM 元素是否存在 if (!boxRef.current || !svgRef.current || !pathRef.current || !ballRef.current) return; // ========== API 1: 基础动画配置(targets/duration/easing/delay/loop/direction) ========== const baseAnimation = anime({ targets: boxRef.current, // 动画目标:指定 DOM 元素 translateX: [0, 300], // 位移:从 0 到 300px scale: [1, 1.5], // 缩放:从 1 到 1.5 倍 opacity: [0.5, 1], // 透明度:从 0.5 到 1 rotate: [0, 360], // 旋转:从 0 到 360 度 duration: 2000, // 动画时长:2000ms(2 秒) easing: 'easeInOutCubic',// 缓动函数:先慢后快再慢 delay: 500, // 延迟 500ms 执行 loop: 2, // 循环 2 次(默认无限循环用 true) direction: 'alternate', // 播放方向:往返(normal=正向,reverse=反向) update: (anim) => { // 回调:动画更新时触发 console.log('基础动画进度:', anim.progress + '%'); }, complete: () => { // 回调:动画完成时触发 console.log('基础动画执行完毕'); }, }); // ========== API 2: 时间线(timeline)—— 串联/并行动画 ========== const timeline = anime.timeline({ easing: 'easeOutExpo', duration: 1500, delay: 100, // 时间线整体延迟 }); // 步骤 1:SVG 描边动画(strokeDashoffset) timeline.add({ targets: svgRef.current.querySelector('path'), strokeDashoffset: [anime.setDashoffset, 0], // 从完整描边隐藏到显示 duration: 2000, label: 'svg-stroke', // 给动画步骤加标签,方便控制 }) // 步骤 2:并行动画(和上一步间隔 0ms,即同时执行) .add({ targets: boxRef.current, backgroundColor: ['#6366f1', '#ec4899'], // 颜色过渡 duration: 1000, }, 0) // 0 表示和上一步同时开始(正值=延迟,负值=提前) // 步骤 3:顺序动画(上一步完成后执行) .add({ targets: boxRef.current, borderRadius: ['0px', '50%'], // 圆角过渡 }); // ========== API 3: 路径动画(沿 SVG 路径运动) ========== const pathAnimation = anime({ targets: ballRef.current, translateX: anime.path(pathRef.current).x, // 沿路径的 X 坐标 translateY: anime.path(pathRef.current).y, // 沿路径的 Y 坐标 rotate: anime.path(pathRef.current).angle, // 沿路径角度旋转 duration: 4000, loop: true, easing: 'linear', autoplay: false, // 初始暂停,后续通过按钮触发 }); // 保存动画实例,用于后续交互控制 animationRef.current = { base: baseAnimation, timeline: timeline, path: pathAnimation, }; // 清理函数:组件卸载时停止所有动画 return () => { baseAnimation.pause(); timeline.pause(); pathAnimation.pause(); }; }, []); // ========== API 4: 滚动触发动画 ========== useEffect(() => { const handleScroll = () => { const scrollTop = window.scrollY; // 滚动到 200px 时触发动画 if (scrollTop > 200 && !isScrollTriggered) { setIsScrollTriggered(true); anime({ targets: '.scroll-trigger', opacity: [0, 1], translateY: [50, 0], duration: 1000, stagger: 200, // 逐个元素延迟(错开动画) }); } }; window.addEventListener('scroll', handleScroll); return () => window.removeEventListener('scroll', handleScroll); }, [isScrollTriggered]); // ========== API 5: 动画交互控制(play/pause/restart/seek) ========== const controlAnimation = (action: 'play' | 'pause' | 'restart' | 'seek') => { if (!animationRef.current?.path) return; switch (action) { case 'play': animationRef.current.path.play(); break; case 'pause': animationRef.current.path.pause(); break; case 'restart': animationRef.current.path.restart(); break; case 'seek': animationRef.current.path.seek(1000); // 跳转到 1000ms 位置 break; } }; return ( <div style={{ padding: '50px', maxWidth: '1200px', margin: '0 auto' }}> <h1>Anime.js + Next.js 15 实战演示</h1> {/* 1. 基础动画演示区 */} <div style={{ margin: '50px 0' }}> <h2>基础动画(位移/缩放/旋转/透明度)</h2> <div ref={boxRef} style={{ width: '100px', height: '100px', backgroundColor: '#6366f1', margin: '20px 0', }} /> </div> {/* 2. SVG 描边 + 路径动画演示区 */} <div style={{ margin: '50px 0' }}> <h2>SVG 描边 + 路径动画</h2> <svg ref={svgRef} width="400" height="200" viewBox="0 0 400 200" style={{ border: '1px solid #eee' }} > <path ref={pathRef} d="M50,100 C150,50 250,150 350,100" fill="none" stroke="#ec4899" strokeWidth="2" strokeDasharray="1000" strokeDashoffset="1000" /> </svg> <div ref={ballRef} style={{ width: '20px', height: '20px', borderRadius: '50%', backgroundColor: '#8b5cf6', position: 'absolute', top: '50%', left: '0', transform: 'translate(-50%, -50%)', }} /> {/* 动画控制按钮 */} <div style={{ marginTop: '20px' }}> <button onClick={() => controlAnimation('play')} style={{ margin: '0 5px' }}> 播放路径动画 </button> <button onClick={() => controlAnimation('pause')} style={{ margin: '0 5px' }}> 暂停路径动画 </button> <button onClick={() => controlAnimation('restart')} style={{ margin: '0 5px' }}> 重置路径动画 </button> <button onClick={() => controlAnimation('seek')} style={{ margin: '0 5px' }}> 跳转到 1000ms 位置 </button> </div> </div> {/* 3. 滚动触发动画演示区 */} <div style={{ height: '800px', margin: '50px 0' }}> <h2 style={{ marginTop: '300px' }}>滚动触发动画(向下滚动查看)</h2> <div className="scroll-trigger" style={{ margin: '10px 0', opacity: 0 }}> 滚动触发元素 1 </div> <div className="scroll-trigger" style={{ margin: '10px 0', opacity: 0 }}> 滚动触发元素 2 </div> <div className="scroll-trigger" style={{ margin: '10px 0', opacity: 0 }}> 滚动触发元素 3 </div> </div> </div> ); }

代码关键 API 解释

  1. targets:动画的核心目标,可以是 DOM 元素、选择器、DOM 引用或数组,示例中用boxRef.current指定具体 DOM。
  2. 基础动画属性translateX(水平位移)、scale(缩放)、opacity(透明度)、rotate(旋转)是最常用的动画属性,支持「起始值-结束值」数组格式。
  3. 时间配置duration(动画时长)、delay(延迟执行)、loop(循环次数)、direction(播放方向)控制动画的时间行为。
  4. anime.timeline():时间线是 Anime.js 编排复杂动画的核心,通过add()方法串联/并行动画,第二个参数控制执行时机(0=并行,正值=延迟)。
  5. 路径动画anime.path(pathRef.current).x/y/angle让元素沿 SVG 路径运动,自动计算坐标和角度。
  6. 交互控制:通过保存AnimeInstance实例,调用play()/pause()/restart()/seek()实现动画的手动控制。
  7. 滚动触发:结合window.scroll事件和状态判断,实现滚动到指定位置时触发动画,stagger实现元素逐个动画。
  8. SVG 描边动画:利用strokeDashoffsetanime.setDashoffset实现描边逐步显示的效果。

四、运行与验证

  1. 启动 Next.js 项目:
npmrun dev
  1. 访问http://localhost:3000/anime-demo,可以看到:
    • 基础动画:方块自动执行位移、缩放、旋转、透明度变化;
    • SVG 区域:描边动画自动执行,点击按钮可控制小球沿路径运动;
    • 滚动区域:向下滚动到指定位置,元素逐个显示(滚动触发动画)。

五、进阶技巧

  1. 缓动函数:Anime.js 内置多种缓动函数(如easeInOutCubiceaseOutExpolinear),可在 Anime.js 官网 查看所有缓动效果。
  2. 响应式动画:结合 Next.js 的useMediaQuery适配不同屏幕尺寸的动画参数。
  3. 性能优化:动画优先使用transformopacity(浏览器硬件加速),避免修改width/height等触发重排的属性。
  4. 自定义属性:支持对 CSS 自定义属性(--custom-color)做动画,实现更灵活的样式控制。

总结

  1. Anime.js 核心是「目标 + 属性 + 时间」,Next.js 15 中需在客户端组件'use client')中使用,避免服务端渲染报错;
  2. 常用 API 分为基础配置(targets/duration)、时间线(timeline)、交互控制(play/pause)、高级动画(路径/SVG)四大类;
  3. 实战中需保存动画实例用于交互控制,结合浏览器事件(如滚动)可实现更贴合业务的动画效果,优先使用transform/opacity保证性能。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/13 7:09:22

Excalidraw与Istio服务网格配置映射

Excalidraw与Istio服务网格配置映射 在微服务架构日益复杂的今天&#xff0c;一个看似简单的请求背后&#xff0c;可能涉及十几个服务的级联调用、多版本流量分流、熔断限流策略以及层层加密认证。当团队成员围坐在会议室里试图解释“为什么这次发布只放了5%的流量却触发了全链…

作者头像 李华
网站建设 2026/2/8 21:46:34

Open-AutoGLM重试次数配置全攻略(专家级调优技巧曝光)

第一章&#xff1a;Open-AutoGLM重试机制核心原理Open-AutoGLM的重试机制旨在提升大语言模型在复杂推理任务中的一致性与准确性。当模型首次生成结果未能满足预设的逻辑验证规则或置信度阈值时&#xff0c;系统将自动触发重试流程&#xff0c;而非直接返回初步输出。该机制结合…

作者头像 李华
网站建设 2026/2/5 19:23:28

12.1 图像生成革命:CV算法与AIGC工具应用场景分析

12.1 图像生成革命:CV算法与AIGC工具应用场景分析 在前面的章节中,我们深入探讨了Agent技术及其在各种应用场景中的实现。从本章开始,我们将转向另一个重要的AIGC领域——图像生成技术。图像生成作为AIGC的重要分支,正在深刻改变创意产业和多个垂直领域。 今天,我们将首…

作者头像 李华
网站建设 2026/2/12 11:36:03

Excalidraw支持物联网设备组网图

Excalidraw&#xff1a;用一句话画出物联网组网图 在一次智能农业项目的远程会议中&#xff0c;产品经理刚说完“每个大棚有三个温湿度传感器&#xff0c;通过LoRa网关传到云端”&#xff0c;工程师已经在共享白板上点下回车——几秒钟后&#xff0c;一张包含传感器、网关和云服…

作者头像 李华
网站建设 2026/2/8 3:02:51

Open-AutoGLM性能优化秘籍:响应速度提升300%的底层逻辑

第一章&#xff1a;Open-AutoGLM消息智能回复的性能革命 Open-AutoGLM作为新一代开源智能消息回复系统&#xff0c;通过融合大语言模型推理优化与动态上下文感知技术&#xff0c;在响应速度、准确率和资源利用率三大维度实现了显著突破。其核心架构采用异步流式处理机制&#x…

作者头像 李华
网站建设 2026/2/8 2:03:01

Excalidraw支持二维码嵌入生成

Excalidraw 支持二维码嵌入生成 在数字协作的浪潮中&#xff0c;一张草图早已不再只是静态表达。当团队围坐在虚拟白板前讨论架构、梳理流程或设计原型时&#xff0c;真正高效的工具不仅要“画得清楚”&#xff0c;更要“连得上上下文”。Excalidraw 作为近年来广受开发者青睐的…

作者头像 李华