当前位置: 首页 > article >正文

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

cover_image


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

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

视图过渡 (View Transition)

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

视图过渡的常见应用:

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

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

  • 状态快照 :首先,浏览器为页面的当前状态和目标状态拍照。
  • 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;  
}  

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

为啥选择 <ViewTransition />

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

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

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

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

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

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

<ViewTransition /> 使用

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

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

import { ViewTransition } from 'react';  
  
<ViewTransition><Component /></ViewTransition>  

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

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

<ViewTransition>  
  <Suspense fallback={<Skeleton />}>  
    <Content />  
  </Suspense>  
</ViewTransition>  

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

<Suspense fallback={<ViewTransition><Skeleton /></ViewTransition>}>  
  <ViewTransition><Content /></ViewTransition>  
</Suspense>  

<ViewTransition /> 高级功能

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

组件切换及动画:

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

<ViewTransition>  
  {state ? <MenuA /> : <MenuB />}  
</ViewTransition>  

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

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

{isSelected && (  
  <ViewTransition name='underline'>  
    <Underline />  
  </ViewTransition>  
)}  

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

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

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

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

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

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

一些实践经验

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

合理管理视图过渡:

  1. 明确过渡边界 :在使用动画时,应该合理界定过渡的范围。仅对需要关注的元素添加动画,而非全局应用,这样可以提高动画的性能并让用户注意力集中在关键信息上。

  2. 仅在必要时启动动画 :确保只在必须时才触发视图过渡。这可以通过条件渲染或异步触发机制来实现,避免不必要的动画对页面交互产生干扰。

  3. 使用显式命名来管理共享动画 :在实现共享元素动画的时候,尽量使用显式命名来标识不同动画片段。这有助于避免命名冲突,提高动画管理的可读性和可维护性。

注意事项:

  1. 理解异步特点<ViewTransition /> 依赖于异步更新来触发动画,而非同步操作。因此在开发中应理解和把握异步更新机制,如 startTransition<Suspense /> 等,确保动画流畅执行。

  2. 避免大范围DOM更新 :在视图过渡期间,尽量避免对DOM进行大范围修改。大量的DOM更改可能会导致动画卡顿,使过渡效果不流畅。

  3. 仔细调试动画 :在应用 <ViewTransition /> 制作精细动画时,一定要进行充分的调试,以确保所有的动画切换和视觉效果都精准无误。可以利用浏览器的开发者工具来逐帧检查动画细节。

  4. 优化动画性能 :为优化动画性能,尽量在动画过程中使用硬件加速的CSS属性(如 transformopacity ),这些属性能够高效地降低动画开销。

<ViewTransition /> 和 Motion 的比较

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

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

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

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

  1. 结合使用 :在复杂应用中,不妨考虑同时使用 <ViewTransition /> 和 Motion。前者用以全局视图的切换,后者用于细化特定组件上的微交互动画。

  2. 脚本化API :使用Motion时,可以利用其脚本化API构建更复杂的交互过程。对于 <ViewTransition /> ,则可以利用其自动化和简单设置更快速地实现过渡效果。

  3. 优化性能 :在应用中实施动画时,始终记得性能优化。避免在主线程处理密集型任务,合理使用CSS硬件加速属性,确保用户界面响应迅速。


http://www.kler.cn/a/554034.html

相关文章:

  • 阿里云k8s服务部署操作一指禅
  • 账号存活率骤降19%?2025跨境账号安全白皮书预警
  • AI赋能前端开发,提升对抗压能力
  • 解锁 AIoT 无限可能,乐鑫邀您共赴 Embedded World 2025
  • 第1章大型互联网公司的基础架构——1.6 RPC服务
  • Ubuntu22 安装多个版本的python
  • java面试场景问题
  • 汽车免拆诊断案例 | 2010 款路虎揽胜车空调偶尔出风异常
  • DeepSeek 助力 Vue 开发:打造丝滑的导航栏(Navbar)
  • 23种设计模式 - 享元模式
  • 利用Java爬虫精准获取淘宝分类详情:实战案例指南
  • 使用LlamaIndex查询 MongoDB 数据库,并获取 OSS (对象存储服务) 上的 PDF 文件,最终用Langchain搭建应用
  • 使用GitLab和GitLab-Runner建立CICD流水线
  • 网络安全架构战略 网络安全体系结构
  • LLaMA 3.1 模型在DAMODEL平台的部署与实战:打造智能聊天机器人
  • c++作业
  • 基于Qt/C++实现一个俄罗斯方块游戏(附源码下载链接)
  • Linux 新建用户和组命令全解析
  • 使用Python和OpenCV实现图像像素压缩与解压
  • 升级 SpringBoot3 全项目讲解 — 如何在 SpringBoot3 种用 JsonSchema 来验证 Json是否有效?