news 2026/5/1 8:14:47

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/4/21 6:10:03

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

大家好&#xff0c;我是jobleap.cn的小九。 你希望掌握Node.js生态下PixiJS库的常用用法&#xff0c;同时获取一份基于Next.js 15整合PixiJS的详细教程&#xff0c;要求串联PixiJS的核心常用API并落地成可运行的实战案例。 一、前置准备 1. 环境要求 Node.js 20&#xff08;…

作者头像 李华
网站建设 2026/4/30 12:39:34

【Open-AutoGLM高效输入实战】:从卡顿到流畅,只需调整这4个核心参数

第一章&#xff1a;从卡顿到流畅——Open-AutoGLM输入优化全景解析在高并发场景下&#xff0c;Open-AutoGLM模型常因输入处理效率低下导致响应延迟。通过对输入预处理链路的深度重构&#xff0c;可显著提升整体推理吞吐能力。优化核心在于减少冗余计算、并行化解码流程以及智能…

作者头像 李华
网站建设 2026/4/29 19:18:29

高并发场景下等待时间失控?Open-AutoGLM动态调节机制来了,稳了!

第一章&#xff1a;高并发场景下等待时间失控的挑战在现代分布式系统中&#xff0c;高并发已成为常态。随着用户请求量的激增&#xff0c;系统资源面临巨大压力&#xff0c;等待时间&#xff08;Latency&#xff09;往往出现不可预测的增长&#xff0c;甚至导致服务雪崩。这种现…

作者头像 李华
网站建设 2026/5/1 6:13:40

Open-AutoGLM多点触控协同实战(多指操作优化全攻略)

第一章&#xff1a;Open-AutoGLM多手指操作协同概述Open-AutoGLM 是一个面向多模态任务自动化的开源框架&#xff0c;其核心能力之一在于模拟并协调多手指触控操作。该功能广泛应用于移动设备自动化测试、人机交互研究以及智能体行为仿真等场景。通过高精度动作建模与时间同步机…

作者头像 李华
网站建设 2026/4/26 10:23:52

Excalidraw图形SLA指标标注

Excalidraw图形SLA指标标注 在现代技术团队的日常协作中&#xff0c;一张草图往往比十页文档更有力量。当系统架构越来越复杂、服务依赖日益交错时&#xff0c;如何让每个人——无论是SRE、开发还是产品经理——都能快速理解系统的健康状况&#xff1f;传统的监控仪表盘虽然数据…

作者头像 李华
网站建设 2026/4/30 17:38:17

Excalidraw与Prometheus监控指标可视化

Excalidraw与Prometheus监控指标可视化 在现代云原生系统中&#xff0c;我们每天都在和成百上千个微服务、容器实例以及海量监控数据打交道。当告警响起时&#xff0c;SRE 团队的第一反应往往不是查看指标曲线&#xff0c;而是问&#xff1a;“这个服务在整个架构里处于什么位置…

作者头像 李华