滚动驱动动画沙盒 - Animation Timeline演示
绑定动画进度到滚动位置,交互式调整参数,直观理解scroll-timeline和view-timeline。
UD5工具箱
基于工作线程的高性能动画 · Houdini API · 离线主线程渲染
// 1. 注册 Animation Worklet await CSS.animationWorklet.addModule('spring-timeline-animator.js'); // 2. Worklet 文件: spring-timeline-animator.js class SpringTimelineAnimator extends Animator { constructor(options) { super(options); this.spring = { stiffness: 100, damping: 10 }; } animate(currentTime, effect) { // 在工作线程中计算弹簧物理 const displacement = this.calculateSpring( currentTime, effect.getTiming() ); effect.localTime = displacement; } } registerAnimator('spring-timeline', SpringTimelineAnimator); // 3. 使用 ScrollTimeline 驱动动画 const scrollTimeline = new ScrollTimeline({ source: document.scrollingElement, orientation: 'vertical', scrollOffsets: [CSS.percent(0), CSS.percent(100)] }); const animation = new Animation( new WorkletAnimation('spring-timeline', effects, scrollTimeline) ); animation.play();
Animation Worklet 是 CSS Houdini API 的一部分,允许开发者在独立的工作线程中运行动画逻辑。这意味着动画计算不会受到主线程 JavaScript 执行的影响,即使主线程繁忙,动画也能保持 60fps 流畅运行。它特别适合滚动链接动画、弹簧物理动画等需要高性能计算的场景。
requestAnimationFrame 在主线程中执行,当主线程阻塞时动画会卡顿。Animation Worklet 在独立线程中运行,与主线程并行,不受主线程阻塞影响。Worklet 还能访问 ScrollTimeline 等专用时间轴,实现更精确的滚动驱动动画。
截至 2024 年,Animation Worklet 在 Chrome 中需要开启 Experimental Web Platform features 标志(chrome://flags)。Firefox 和 Safari 尚未完全支持。在生产环境中使用时,建议配合 polyfill 或优雅降级方案。
ScrollTimeline 是与 Animation Worklet 配合使用的时间轴 API。它将滚动位置映射为动画进度,使得动画可以精确地跟随页面滚动。结合 Worklet,滚动驱动的动画可以在独立线程中运行,实现丝滑的视差效果、滚动进度指示器等。
Web Worker 是通用多线程方案,适合 CPU 密集型计算。Animation Worklet 是专门为动画优化的轻量级工作线程,具有更低的延迟、同步渲染管线访问权限,以及专门的动画时间轴 API。Worklet 比 Worker 更轻量,生命周期更短。
OffscreenCanvas 允许在 Web Worker 中进行 Canvas 渲染,实现完全的离屏渲染。Animation Worklet 则专注于动画参数计算(如位置、缩放、透明度),实际的渲染仍由浏览器合成器处理。两者可以互补使用,构建完全离主线程的动画系统。
使用 'animationWorklet' in CSS 进行特性检测。也可以检查 CSS.animationWorklet 是否存在。本工具页面会自动检测并在右上角显示支持状态。即使不支持,你也可以通过 Canvas + rAF 实现类似的动画效果。
适合需要高性能的动画场景:滚动驱动的视差效果、数据可视化动画、游戏 UI 动画、物理模拟动画、实时图表更新、页面转场效果等。尤其适合移动端,因为移动设备对主线程阻塞更敏感。
绑定动画进度到滚动位置,交互式调整参数,直观理解scroll-timeline和view-timeline。
分别使用主线程Canvas和OffscreenCanvas在Worker中渲染动画,对比FPS和流畅度。
在主线程和Worker中分别计算大斐波那契数,对比界面的响应度。
配置滚动容器与目标元素,自定义随滚动触发的关键帧动画,输出纯CSS代码。
在主线程和 Worker 之间使用 SharedArrayBuffer 和 Atomics 进行同步通信。
编写主线程和 Worker 内的逻辑模板,自动生成分离的 JS 文件代码,加速 Worker 开发。
提供历史数据,手动设定自回归/差分/移动平均阶数,查看拟合与未来几步预测,学习时序分析。
在后台 Worker 中计算大范围内的质数,主线程实时绘制进度条,展示多线程优势。
使用新的迭代器辅助方法链式处理数据,查看懒求值效果。
动画展示 Kruskal 算法选择边和合并集合的过程,高亮生成树边。
设定物理页框数,输入页引用串,动画展示不同页面置换算法的缺页率。
在开发环境中模拟 periodicSync 事件,触发后查看 SW 中的处理逻辑和网络请求。
展示几组在各类色盲下仍可区分的定性数据配色方案,含Hex码。
编写Brainfuck代码,以可视化的方式步进执行,观察活动纸带和指针。
载入简单控制网格,执行 Catmull-Clark 细分一次,观察光滑效果。
上传 webpack 的 stats.json,生成交互式树状图、模块大小排名,辅助优化构建体积。
通过滑块和开关调整 Flex 容器和子项的所有 CSS 属性,实时观察布局变化,理解弹性盒子。
拖拽两控制点精细微调CSS `cubic-bezier()` 曲线并对比预设函数效果。
并列播放所有CSS内置缓动函数(ease, linear等)的动画效果,方便对比选择。
输入 URL,通过前端代理或 CORS 配置获取并显示完整的响应头信息。
可视化选择操作(访问、点击、断言等),自动生成 Cypress 测试代码。
手动构建HTTP请求,选择方法,填写头和主体,发送并查看完整响应。
添加多个议题并设定负责人与时长,自动生成结构化议程表,支持定时提醒下一议题。
生成使用Intersection Observer实现图片懒加载的JavaScript代码,含过渡动画。
可视化Flexbox容器和子项的所有属性及选项,鼠标悬停预览效果。
编写 Lit 组件模板和属性,实时渲染并观察响应式更新,无需构建环境。
配置基于滚动位置触发的CSS @scroll-timeline动画,复制适配代码。
在页面上叠加可拖拽的半透明网格线,辅助网格布局对齐。
选择编程语言和关注领域(安全、性能、可读性),生成定制化的代码审查核对表。
选择触发位置、箭头方向与样式,生成轻量悬停提示框代码。