startViewTransition 动画过渡

我们先看俩组网页动画效果:

在这里插入图片描述
在这里插入图片描述

一、原理

第一个:重排布局效果,类似app的重排布局效果
第二个:切换主题特效,很多第三方组件库都用到了这个特效切换主题

效果核心用到了浏览器的一个新特性startViewTransition,基本原理如下:

  1. 触发条件:当调用 document.startViewTransition() 时,浏览器会识别出即将发生的DOM变化,并准备一个视图过渡。
  2. 捕获快照:浏览器会在当前渲染帧结束时自动捕捉页面的一个快照(旧视图)。这包括页面上的所有可见元素及其样式和布局信息。
  3. 执行回调函数startViewTransition 接受一个回调函数作为参数,在这个回调中你可以更新DOM,比如改变类名、添加或移除元素、修改属性等。这些改动代表了新视图的状态。
  4. 生成新快照:一旦回调函数完成并且新的DOM状态被提交给浏览器,浏览器会再次捕捉页面的新快照(新视图)。
  5. 应用过渡效果:浏览器使用这两个快照来计算从旧视图到新视图之间的差异,并根据这些差异自动应用合适的动画效果。默认情况下,浏览器会选择一种适当的动画方式来确保过渡看起来自然流畅。
  6. 完成过渡:当过渡完成后,旧视图被完全替换为新视图,且浏览器恢复正常的渲染流程。此时,Promise 返回,表示过渡已经结束。
  7. 伪元素控制:在整个过程中,可以利用 ::view-transition-old(root)::view-transition-new(root) 这两个特殊的CSS伪元素来定义旧视图和新视图的具体样式,包括它们如何混合、层叠顺序等。
  8. 性能优化:由于视图过渡是在浏览器层面处理的,因此它们通常比手动编写的JavaScript动画更高效,并且能够更好地与硬件加速相结合,从而提供更流畅的用户体验。
  9. 兼容性注意:需要注意的是,View Transition API 是一个相对较新的特性,不是所有的浏览器都支持它。因此,在实际项目中使用时,请务必检查目标用户的浏览器支持情况。

二、案例

  1. 特效一:核心是 view-transition-name: var(--index),给一个不同的值,单独控制其过渡动画
.container {
  width: 100vw;
  height: 100vh;
  display: flex;
  align-items: center;
  flex-direction: column;
  background-color: var(--bg-color);
  header {
    width: 100vh;
    height: 100px;
    margin-bottom: 100px;
    display: flex;
    justify-content: flex-end;
    align-items: center;
    color: var(--color);
  }
  section {
    width: 500px;
    --count: 3;
    display: flex;
    flex-wrap: wrap;
    .item {
      width: 150px;
      height: 50px;
      border-radius: 3px;
      box-shadow: 0 0 10px 0px rgba(0, 0, 0, 0.3);
      margin: 10px calc((100% - var(--count) * 150px) / var(--count) / 2);
      background-color: #6d3fe3;
      display: flex;
      justify-content: center;
      align-items: center;
      font-size: 25px;
      font-weight: bold;
      color: var(--color);
      cursor: pointer;
      user-select: none;
      view-transition-name: var(--index);
    }
  }
}
<div class="container">
  <section>
    <div onclick="handle_delete(event, 1)" class="item" style="--index: a1">1</div>
    <div onclick="handle_delete(event, 2)" class="item" style="--index: a2">2</div>
    <div onclick="handle_delete(event, 3)" class="item" style="--index: a3">3</div>
    <div onclick="handle_delete(event, 4)" class="item" style="--index: a4">4</div>
    <div onclick="handle_delete(event, 5)" class="item" style="--index: a5">5</div>
    <div onclick="handle_delete(event, 6)" class="item" style="--index: a6">6</div>
    <div onclick="handle_delete(event, 7)" class="item" style="--index: a7">7</div>
    <div onclick="handle_delete(event, 8)" class="item" style="--index: a8">8</div>
    <div onclick="handle_delete(event, 9)" class="item" style="--index: a9">9</div>
    <div onclick="handle_delete(event, 10)" class="item" style="--index: a10">10</div>
    <div onclick="handle_delete(event, 11)" class="item" style="--index: a11">11</div>
  </section>
</div>

核心逻辑:

<script>
  // 刪除元素
  function handle_delete(event, index) {
    document.startViewTransition(() => {
      event.target.remove()
    })
  }
</script>

  1. 特效二: 利用clip-path动态分割,利用::view-transition-old改变其层级z-index即可,
:root {
 --color: #333;
 background-color: #fff;
 --x: 50%;
 --y: 50%;
}
/** Animated Theme Toggle */
::view-transition-old(root),
::view-transition-new(root) {
 animation: none;
 mix-blend-mode: normal;
}

html[theme=dark] {
 --color: #fff;
 --bg-color: darkslategray;
}

html[theme=dark]::view-transition-old(root) {
 z-index: 1;
}

html[theme=dark]::view-transition-new(root) {
 z-index: 999;
}

::view-transition-old(root) {
 z-index: 999;
}
::view-transition-new(root) {
 z-index: 1;
}
<div class="container">
  <header>
    <button onclick="handle_change(event)">切换主题</button>
  </header>
</div>

核心逻辑:

// 切换系统主题
function handle_change(event) {
  document.documentElement.style.setProperty('--x', event.pageX + 'px')
  document.documentElement.style.setProperty('--y', event.pageY + 'px')
  let result = document.documentElement.getAttribute('theme') === 'dark' ? 'light' : 'dark'
  let transition = document.startViewTransition(() => {
    document.documentElement.setAttribute('theme', result)
  })
  // 返回一个transition对象
  transition.ready.then(() => {
    let clipPath = [
      'circle(0% at var(--x) var(--y))',
      'circle(100% at var(--x) var(--y))'
    ]
    document.documentElement.animate(
      {
        clipPath: result === 'dark' ? clipPath : [...clipPath].reverse()
      },
      {
        duration: 300,
        pseudoElement: result === 'dark'
          ? "::view-transition-new(root)"
          : "::view-transition-old(root)",
        easing: 'ease-in' // 使用缓动函数
      }
    )
  })
}

pseudoElement是用来标记效果触发的载体为伪元素

三、兼容性

在这里插入图片描述

<think>嗯,用户问的是前端前沿的新技术,我得先回想一下最近前端领域有哪些比较热门的发展。首先,Vue、React、Angular这些主流框架肯定还在不断更新,比如React的Server Components和Vue的Vapor模式。然后是构建工具,Vite现在很流行,可能还有新的变化。 接下来,前端框架方面,SolidJS和Qwik可能算比较新的,它们强调性能优化,特别是Qwik的延迟加载概念。还有像Astro这样的元框架,专注于静态生成和部分水合,可能也是前沿的一部分。 状态管理库的话,Zustand和Jotai这些轻量级库最近挺受欢迎的,不过用户可能更想知道最新的,比如Signia或者其他的。 Web性能优化方面,核心网页指标(Core Web Vitals)是Google强调的,可能涉及到优化CLS、LCP、FID这些指标的技术。还有像Partial Hydration、Islands架构,Astro和Fresh框架用的比较多。 WebAssembly也是一个重要方向,尤其是与Rust结合使用,比如在前端处理高性能计算任务。不过用户可能更关注具体应用案例,比如Figma使用WebAssembly的例子。 CSS方面,新特性像容器查询、层叠式布局、CSS Houdini这些可能属于前沿。还有工具类框架如Tailwind CSS的更新,比如支持动态值或者新的插件。 构建工具方面,除了Vite,Turbopack和Rspack这些基于Rust的工具可能越来越受关注,因为它们提供了更快的构建速度。 TypeScript的持续发展,比如5.0版本的新特性,装饰器、satisfies操作符等,可能也是开发者需要关注的。 跨平台技术的话,Tauri作为Electron的替代,用Rust构建更轻量级的应用。还有React Native的新架构,可能也是重点。 AI在前端的应用,比如用机器学习库TensorFlow.js或者结合ChatGPT做智能组件,这部分可能比较新,但需要谨慎举例,避免夸大。 Web3和区块链方面,虽然热度有所下降,但像ethers.js、web3.js这样的库还是存在,可能有些项目在用。 另外,微前端架构继续发展,比如Module Federation的应用,可能大公司在用,但可能不算最新技术了。 需要检查是否有遗漏,比如Playwright作为测试工具,或者新的浏览器API如View Transition API,WebGPU这些。还有HTMX这种强调HTML扩展的库,虽然不算全新但最近受到关注。 要确保提到的技术确实是前沿,不是已经普及的。比如React Server Components虽然还在演进,但已经有一段时间了。可能需要区分哪些是已经稳定,哪些是新兴的。 最后,组织这些内容,按类别分点,确保用户能清晰理解每个技术的用途和现状。同时避免使用Markdown,用自然的中文表达,保持口语化但信息准确。</think>当前前端技术发展迅速,以下是一些前沿方向和技术概览,按应用场景分类整理: 一、框架与运行时 1. **React Server Components (RSC)** 支持服务端/客户端组件混合渲染,2023年Next.js 13+已集成。特点: - 服务端组件零bundle体积 - 自动代码分割 - 支持异步数据获取 2. **Qwik** 由Builder.io团队开发,核心特性: - 延迟加载(Resumability) - 极快首屏加载速度(<1kb JS启动) - 基于细粒度响应式更新 3. **Astro 3.0** 岛屿架构(Islands Architecture)代表: - 默认SSG+选择性客户端水合 - 支持React/Vue/Solid等多框架组件 - 新增View Transitions API支持 二、构建工具链 1. **Turbopack** (Vercel) Rust编写的增量打包工具,比Webpack快700倍 - 与Next.js深度集成 - 支持React Server Components 2. **Bun** 全栈JavaScript运行时(替代Node.js): - 内置打包/转译/测试功能 - Zig语言开发,启动速度快10倍 - 兼容Node.js/npm生态 三、CSS新生态 1. **CSS Nesting** 原生支持嵌套语法(Chrome 112+): ```css .parent { & .child { color: red } } ``` 2. **CSS Houdini** 底层API开放: - Paint API:自定义绘制 - Layout API:自定义布局 - Animation Worklet:高性能动画 四、浏览器新能力 1. **WebGPU** 新一代图形API: - 比WebGL性能提升3-5倍 - 支持通用计算(GPGPU) - Chrome 113+已支持 2. **View Transitions API** 原生页面过渡动画: ```js document.startViewTransition(() => { updateDOM(); }); ``` 五、新兴开发范式 1. **TypeScript 5.0+** - `satisfies`操作符 - 装饰器标准化 - 模块解析优化 2. **状态管理** - **Jotai**:原子化状态 - **Signia**:细粒度响应式 - **Valtio**:Proxy驱动 六、性能优化方向 1. **Core Web Vitals**优化 - INP取代FID(2024年3月生效) - 字体加载优化(`size-adjust`属性) - 图片优化(AVIF格式普及) 2. **Partial Hydration** 按需激活组件: ```jsx import dynamic from &#39;next/dynamic&#39;; const HydrateOnVisible = dynamic(() => import(&#39;./Component&#39;), { ssr: false, loading: () => <Skeleton /> }); ``` 七、跨平台方案 1. **Tauri 2.0** 构建桌面应用: - 比Electron包体积小10倍 - 系统WebView渲染 - Rust后端支持 2. **Capacitor 5.0** 混合移动应用: - 支持最新Android/iOS API - 实时热更新 - 插件生态丰富 八、AI工程化 1. **LLM集成** - 智能表单验证(利用GPT-4) - 内容自动生成(@ai-jsx等框架) - 代码生成(GitHub Copilot) 2. **TensorFlow.js新特性** - WebGL加速推理 - 预训练模型仓库 - 浏览器端模型微调 建议实践路径: 1. 先掌握React/Vue等主流框架生态 2. 学习Vite/Turbopack现代构建工具 3. 深入TypeScript类型系统 4. 尝试WebGPU/WebAssembly高性能场景 5. 关注Chrome官方博客获取API更新 当前技术迭代周期约6-12个月,建议保持技术雷达扫描,但避免过度追逐新概念,重点选择与业务场景匹配的技术方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端小小白zyw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值