惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

有赞技术团队
有赞技术团队
B
Blog
IT之家
IT之家
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
人人都是产品经理
人人都是产品经理
博客园 - 聂微东
量子位
博客园 - 叶小钗
T
Tailwind CSS Blog
小众软件
小众软件
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - Franky
雷峰网
雷峰网
博客园 - 三生石上(FineUI控件)
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Blog — PlanetScale
Blog — PlanetScale
V
V2EX
博客园_首页
I
InfoQ
B
Blog RSS Feed
Microsoft Azure Blog
Microsoft Azure Blog

新锐博客

vscode连接cnb并推送仓库 - 新锐博客 twikoo不用token查询文章浏览量 - 新锐博客 基于Astro构建的支持对话与生图的Web应用 - 新锐博客 deepseek-v4-flash-0731使用体验 - 新锐博客 基元律动免费送68元额度 - 新锐博客 Linux更换软件源 - 新锐博客 华为鸿蒙7.0花粉beta版发布 - 新锐博客 使用测速脚本测一下服务器带宽 - 新锐博客 trae告别白嫖时代,auto也需排队了 - 新锐博客 流量不够用?大流量卡免费领 - 新锐博客 推荐一个免费在线图片处理网站 - 新锐博客 AI清理C盘的优缺点 - 新锐博客 twikoo不算bug的bug - 新锐博客 最近网站的一些变动 - 新锐博客 腾讯EO开始发多余套餐啦!速领 - 新锐博客 hi168停止对个人用户的运营 - 新锐博客 哪吒监控曝高危漏洞,请尽快升级 - 新锐博客 IndexDB实现大文件下载的思路 - 新锐博客 鱼鱼api使用教程 - 新锐博客 服务器安装Dokploy替代vercel - 新锐博客 对于近几年的电视剧的无力吐槽 - 新锐博客 关于网站被攻击的后续 - 新锐博客 使用sessionStorage给音乐播放进度存储 - 新锐博客 修复了一些bug,网站基本上趋于稳定了 - 新锐博客 AI模型掺水?如何辨别真假? - 新锐博客 感谢一九云给我防住了攻击 - 新锐博客 对一些新手使用AI编程的建议 - 新锐博客 Edgeone标记过期和直接删除有何区别? - 新锐博客 用Navigation Timing API给博客添加上加载时间 - 新锐博客 使用 Astro 自建博客,从零开始鏖战 14 小时 - 新锐博客
使用View Transition api给模式切换添加过渡动画 - 新锐博客
莫忘 · 2026-02-11 · via 新锐博客

前言

最近在访问网站的过程,有个网站是呢喃Ninc,发现它切换日夜模式就会有过渡动画。

所以就询问群里的人,果然有大佬给了我一个地址,https://vitepress.dev/zh/guide/extending-default-theme#on-appearance-toggle

于是就配合AI给自己网站添加了过渡动画。

下面就是关于View Transition API的一些介绍。

View Transition API 是 Chrome 推出的一项新特性,它允许开发者在 DOM 状态变化时创建平滑的过渡动画。与传统的 CSS 动画不同,它能够在页面元素变化前后捕获快照,并自动计算差异进行插值动画。

基础实现

首先,我们需要一个切换按钮和基本的样式结构:

<button id="theme-toggle">切换模式</button>
:root {
  --bg-color: #ffffff;
  --text-color: #333333;
}

[data-theme="dark"] {
  --bg-color: #1a1a1a;
  --text-color: #e0e0e0;
}

body {
  background-color: var(--bg-color);
  color: var(--text-color);
  transition: background-color 0.3s, color 0.3s;
}

添加 View Transition 动画

核心代码非常简单,只需要在切换主题时调用 document.startViewTransition

const toggleBtn = document.getElementById('theme-toggle');
const html = document.documentElement;

toggleBtn.addEventListener('click', async (e) => {
  // 检查浏览器是否支持 View Transition API
  if (!document.startViewTransition) {
    toggleTheme();
    return;
  }

  // 获取点击位置,作为动画起点
  const x = e.clientX;
  const y = e.clientY;

  // 创建圆形扩散动画
  const transition = document.startViewTransition(() => {
    toggleTheme();
  });

  await transition.ready;

  // 自定义动画效果
  const clipPath = [
    `circle(0% at ${x}px ${y}px)`,
    `circle(150% at ${x}px ${y}px)`
  ];

  document.documentElement.animate({
    clipPath: html.dataset.theme === 'dark' ? clipPath.reverse() : clipPath
  }, {
    duration: 500,
    easing: 'ease-in-out',
    pseudoElement: '::view-transition-new(root)'
  });
});

function toggleTheme() {
  const currentTheme = html.dataset.theme;
  html.dataset.theme = currentTheme === 'dark' ? 'light' : 'dark';
}

进阶技巧

1. 为特定元素添加独立过渡

::view-transition-old(header),
::view-transition-new(header) {
  animation-duration: 0.3s;
}

2. 处理不支持 API 的浏览器

if (!document.startViewTransition) {
  // 降级方案:使用普通 CSS 过渡
  toggleTheme();
}

3. 性能优化

View Transition API 会自动处理大部分性能优化,但我们应该避免在过渡期间执行复杂计算。

浏览器兼容性

目前 View Transition API 在 Chrome 111+ 和 Edge 111+ 中得到支持。对于其他浏览器,建议提供渐进增强方案。

总结

View Transition API 极大地简化了复杂页面过渡动画的实现。通过简单的几行代码,我们就能为日夜模式切换添加专业级的动画效果。随着浏览器支持度的提升,这项技术必将成为 Web 动画的标准方案。

莫忘

君子喻以义,小人喻以利

本文是原创文章,采用 CC BY-NC-SA 4.0 协议,完整转载请注明来自 新锐博客