记录是如何通过View Transitions API 实现主题切换时的过渡效果

记录是如何通过View Transitions API 实现主题切换时的过渡效果

2026-02-21
杂乱的知识
type
Post
status
Published
date
Feb 21, 2026
slug
view-transitions-api-theme-switch-transition-notes
summary
记录如何使用 View Transitions API 实现从按钮位置向外圆形扩散的主题切换动画效果。这种效果不会遮挡页面元素,交互体验流畅自然。可以点击本站上的日夜间主题切换试试看.
tags
开发
实用教程
category
杂乱的知识
icon
password
记录如何使用 View Transitions API 实现从按钮位置向外圆形扩散的主题切换动画效果。这种效果不会遮挡页面元素,交互体验流畅自然。可以点击本站上的日夜间主题切换试试看.
View Transitions API 的核心原理,本质上就是“截图 + 过渡动画”机制。可以理解成你截了一张图放在站点上.

notion image

浏览器兼容性

浏览器
版本要求
Chrome
111+
Edge
111+
Opera
97+
Safari
暂不支持
Firefox
暂不支持
降级方案:不支持 View Transitions API 的浏览器会自动降级为直接切换主题。

实现步骤

1. 创建主题切换按钮组件

2. 添加 CSS 样式

在主题的全局样式文件中添加以下 CSS:

3. 在 Header 中使用组件

关键 API 说明

document.startViewTransition()

作用:启动视图过渡动画,浏览器会自动捕获当前视图状态,执行过渡,然后更新到新的视图状态。
参数
  • callback: 在动画帧中执行的回调函数,通常包含 DOM 更新操作
返回值
  • ViewTransition 对象,包含以下属性:
    • ready: Promise,表示过渡准备就绪
    • finished: Promise,表示过渡完成
    • updateCallbackDone: Promise,表示更新回调完成

clip-path: circle()

作用:创建圆形裁剪区域,实现从按钮位置向外扩散的效果。
语法
参数
  • radius: 圆形半径(百分比或像素)
  • x: 圆心 X 坐标
  • y: 圆心 Y 坐标

::view-transition-new() / ::view-transition-old()

作用:伪元素,分别表示过渡后的新视图和过渡前的旧视图。
语法

可配置参数

动画持续时间

建议范围:800ms - 1500ms
  • 800ms:较快的切换
  • 1200ms:舒缓的切换(推荐)
  • 1500ms:缓慢的切换

缓动函数

常用缓动函数:
  • 'ease': 标准缓动
  • 'ease-in-out': 平滑开始和结束
  • 'cubic-bezier(0.4, 0, 0.2, 1)': Material Design 标准缓动(推荐)
  • 'cubic-bezier(0.34, 1.56, 0.64, 1)': 弹性效果

注意事项

  1. 不要遮挡元素:View Transitions API 是浏览器原生实现,不会创建额外的 DOM 元素遮挡页面内容。
  1. 性能优化
      • 动画使用 GPU 加速
      • 仅在支持该 API 的浏览器中启用
      • 尊重用户的 prefers-reduced-motion 设置
  1. 降级处理:始终提供降级方案,确保在不支持的浏览器中也能正常使用。
  1. 主题切换时机
      • startViewTransition 的回调中执行主题切换
      • 浏览器会自动处理新旧视图的过渡
  1. 扩散中心计算
      • 使用 getBoundingClientRect() 获取按钮位置
      • 计算按钮中心作为扩散起点
      • 计算到屏幕最远角的距离作为扩散半径

完整代码实现位置

  • 组件:themes/anime/components/ThemeToggleButton.js
  • 样式:themes/anime/style.js (View Transitions CSS 部分)
推荐云服务

雨云 - 云服务器首选

稳定 · 高速 · 性价比超高

使用优惠码立享折扣,开启你的云端之旅~

一元试用秒级开通24h在线客服

优惠码

zqf
立即访问
Loading...
灵心小窝

灵心小窝

这里不是一个喧闹的地方,只是用来存放一些还不想遗忘的东西。

声明 © 2026 早清风
加载中...