React 首次推出原生的动画支持!

B站影视 2025-02-10 09:00 3

摘要:React 一直是前端开发者最受欢迎的框架之一。但是 React 的动画支持似乎一直是个短板。虽然 Vue 和 Svelte 等其他框架相继推出了便于实现动画的 API ,React 开发者长期以来不得不依赖于第三方库,如 Motion for React 和

React 一直是前端开发者最受欢迎的框架之一。但是 React 的动画支持似乎一直是个短板。虽然 Vue 和 Svelte 等其他框架相继推出了便于实现动画的 API ,React 开发者长期以来不得不依赖于第三方库,如 Motion for React 和 React Spring 来补足这一缺陷。

最近,这种情况终于迎来了转机。React 团队即将推出了一个名为 的新动画 API,它基于浏览器最新的 View Transition API 功能,为开发者提供了一种新的在两个视图之间实现动画过渡的方法。这一新特性的发布不仅降低了动画实现的复杂度,还扩展了 React 原有的功能,使开发者有机会通过更少的代码实现更流畅的用户体验。

视图过渡是一种在网页之间实现平滑视觉转换的技术。借助浏览器的 View Transition API ,开发者可以让用户在多个页面或单个页面的不同视图之间享受流畅、自然的视觉体验。这项技术尤其对提升网站的视觉吸引力和用户体验具有显著作用,无论是多页面应用(MPA)还是单页应用(SPA)都可以受益于此。

视图过渡的常见应用:

图片转换:例如在商品详情页上,当用户点击缩略图时,可以实现从小图到大图的平滑转换。导航稳定性:在页面切换时,固定导航栏保持不变,确保用户体验的连贯性。内容动态调整:随着内容的筛选,网格布局的项目可以平滑移动。

视图过渡不局限于某一特定框架,它的实现依赖以下基础:

状态快照:首先,浏览器为页面的当前状态和目标状态拍照。DOM更新:在抑制重绘的同时,浏览器对 DOM 进行必要的更新。CSS动画支持:最终通过 CSS 动画实现视觉上的平滑过渡。

视图过渡分为两种类型:同一文档视图转换和跨文档视图转换。

同一文档视图转换:这种形式常用于SPA项目,适用于在同一页面内进行视图更新。例如,可以通过调用document.startViewTransition来触发这样的转换:

function handleClick(e) { if (!document.startViewTransition) { updateTheDOMSomehow; return; } document.startViewTransition( => updateTheDOMSomehow);}

跨文档视图转换:这种转换用于在MPA项目中实现页面间的过渡效果。它不需要开发者显式调用API,当进行同源跨文档导航时,转换自动发生。开启此功能的网页可以通过以下CSS代码段进行配置:

@view-transition { navigation: auto;}

视图过渡的应用,使得在确保视觉吸引力的同时提升了动态和互动体验,为现代网页设计带来了新的可能性。

在前端开发中,实现动画效果的需求一直都很高,而传统的实现方法常常面临许多挑战。以往的动画实现通常需要依赖第三方库,如 Motion for React 或 React Spring,这些库在一定程度上帮助开发者简化了动画的实现,但在性能和灵活性方面仍然有所欠缺。

传统的动画实现方法通常需要手动管理动画状态和 DOM 更新,这对开发者而言是一项繁重且容易出错的任务。第三方库虽然提供了一些便捷的工具和接口,但它们往往引入了额外的代码依赖,使得项目的体积增大,并可能带来性能问题。

动画协调复杂:要在不同状态之间协调动画效果,开发者需要编写大量代码手动处理。性能负担:较大的库会影响页面加载速度,增加首次渲染的时间。交互不灵活:很多库在处理复杂交互和动画中断时力不从心,动画一旦启动很难被打断或调整。

是一种全新的解决方案,它直接基于浏览器的 View Transition API,为开发者提供了一种简化的方式来实现动画效果。这一 API 在 React 中得到了很好的集成,具有以下优势:

深度集成: 嵌入React的渲染周期中,可以在 DOM 改变前尽可能晚地触发视图过渡,最大限度地保持页面活跃状态。响应式更新:仅在异步更新(例如 startTransition 和 )时工作,使得状态更新可以随时中断或取消,从而提高了 UI 的响应速度。自动化处理:无需手动为每个动画元素指定转换名称,React 会自动管理,减少了开发者的工作量。性能优化:相比手动操控视图过渡的方式, 提供了性能更优的解决方案,避免了多余的计算和渲染。

通过引入 ,React 让开发者可以更容易地实现复杂、流畅、且响应迅速的动画效果,为构建现代化、互动式的用户界面提供了强大的支持。

是为了处理异步更新而设计的,比如 startTransition、useDeferredValue 和 等场景。通过这些机制,视图过渡可以在页面状态异步更新时被触发,带来自然流畅的动画效果。然而,如果是同步更新,那么默认不会触发视图过渡,这意味着UI更新是立即提交的,无法通过 控制其动画。

组件可以像 DOM 片段一样,将其子组件的过渡效果在独立的快照中实现。其用法非常简单,只需将需要过渡的组件用 包裹即可:

import { ViewTransition } from 'react';

默认情况下,name="auto",这会自动为包裹的子节点分配一个 view-transition-name,无需手动控制DOM节点的样式。

此外, 提供了简洁直观的应用方式,比如条件渲染(condition ? : )可以实现组件切换之间的交叉淡入淡出效果。类似的,在 中使用时,也可以实现从后备加载骨架屏转变为正式内容的流畅过渡:

}>

而相较之下,如果在 中单独包裹 ,则会分别触发出入场效果:

}>

为开发者提供了多个高级功能,让动画的实现更为灵活和强大。

组件切换及动画:

在使用 时,不仅可以实现组件状态下的动画,还可以在两个不同组件之间切换时,完成自然的淡入淡出。例如:

{state ? : }

上述代码可以在 MenuA 和 MenuB 之间切换时自动交叉淡出过渡,从而提升用户体验。

共享元素动画的实现:当需要在不同视图之间共享元素动画时, 也可以通过命名来支持。例如:

{isSelected && ( )}

当一个元素从一个位置移除并在另一个位置创建时,只需确保名称匹配,即可实现共享动画。这种功能可以防止元素在屏幕上随意移动,为用户提供更一致的表现。

自定义动画:对于更复杂的动画需求, 提供了事件处理器来进行自定义。例如:

onEnter / onLeave: 在组件进入或离开DOM时触发。onLayout: 由于外部组件的影响,该组件的边界发生变化。onUpdate: 组件的内容或边界由于自身或子组件的影响发生变化。onShare: 实施共享元素过渡时触发。

这些事件处理器为开发者提供了更多的自定义空间,通过这些事件,开发者可以充分利用Web动画API来创建复杂的动画效果,譬如利用 clipPath 动画创建遮罩效果。

通过这些功能, 不仅提高了动画的可控性,也使得复杂的 UI 交互得以更流畅地实现。这一组件给开发者带来了更多可能性,使动画不仅限于简单的过渡,而可以成为界面交互中自然的一部分。

这个网站中还有一些关于 ViewTransition 的使用示例,大家可以仔细探索: https://react-view-transition-examples.motion.dev/

一些实践经验

使用 实现动画,有一些最佳实践可以帮助开发者更好地管理过渡效果,提高应用的性能和用户体验。

合理管理视图过渡:

明确过渡边界:在使用动画时,应该合理界定过渡的范围。仅对需要关注的元素添加动画,而非全局应用,这样可以提高动画的性能并让用户注意力集中在关键信息上。仅在必要时启动动画:确保只在必须时才触发视图过渡。这可以通过条件渲染或异步触发机制来实现,避免不必要的动画对页面交互产生干扰。使用显式命名来管理共享动画:在实现共享元素动画的时候,尽量使用显式命名来标识不同动画片段。这有助于避免命名冲突,提高动画管理的可读性和可维护性。

注意事项:

理解异步特点: 依赖于异步更新来触发动画,而非同步操作。因此在开发中应理解和把握异步更新机制,如 startTransition 和 等,确保动画流畅执行。避免大范围DOM更新:在视图过渡期间,尽量避免对DOM进行大范围修改。大量的DOM更改可能会导致动画卡顿,使过渡效果不流畅。仔细调试动画:在应用 制作精细动画时,一定要进行充分的调试,以确保所有的动画切换和视觉效果都精准无误。可以利用浏览器的开发者工具来逐帧检查动画细节。优化动画性能:为优化动画性能,尽量在动画过程中使用硬件加速的CSS属性(如 transform 和 opacity),这些属性能够高效地降低动画开销。

的特点在于其依赖异步更新机制,通过 startTransition 和 实现流畅的视图切换。它提供了一种简单方法来处理元素在视图状态变化间的过渡,使得切换过程自然且不打断用户交互。主要用于全局的视图切换,支持更复杂的共享元素动画。

而 Motion 是 React 社区中广泛使用的动画库,擅长于处理微交互。它允许更精细的动画控制,如缩放、旋转、平移等,并能处理相对和嵌套动画。这些动画可被中断,对于小型动画和组件加载时的动画会更为合适。

Motion 能够更加定制化动画效果,通过计算转换和比例失真校正实现视觉上的平滑过渡。尽管如此,它在处理大型视图改变时可能不如 高效。

如何让动画在复杂应用中更加流畅与易控:

结合使用:在复杂应用中,不妨考虑同时使用 和 Motion。前者用以全局视图的切换,后者用于细化特定组件上的微交互动画。脚本化API:使用Motion时,可以利用其脚本化API构建更复杂的交互过程。对于 ,则可以利用其自动化和简单设置更快速地实现过渡效果。优化性能:在应用中实施动画时,始终记得性能优化。避免在主线程处理密集型任务,合理使用CSS硬件加速属性,确保用户界面响应迅速。

目前这个组件尚未发布到正式环境,还在实验阶段,未来可能还会发生变化,大家在生产环境谨慎使用。

来源:散文随风想

相关推荐