CSS视图过渡入门指南
想象一下,您的网站可以在页面之间平滑地动画过渡 - 比如从index.html跳转到about.html - 而不会出现令人不适的重新加载。由于现代浏览器对视图过渡API的支持,这现在已经成为可能。
视图过渡曾经是单页面应用程序(SPA)的专属功能。在本文中,我们将探索视图过渡如何为多页面应用程序(MPA)带来流畅的动画导航效果。
MPAs与SPAs快速回顾
多页面应用程序(MPA)和单页面应用程序(SPA)是Web开发的两种常见方法,各有优缺点。
MPA为每次导航从服务器加载新页面,导致完全页面重新加载。对于具有许多不同页面的大型应用程序,MPA构建更简单。
另一方面,SPA加载单个HTML页面,并通过JavaScript动态更新其内容,提供更快的交互和更流畅的用户体验,但通常需要更复杂的客户端路由和状态管理。
长期以来,平滑的动画过渡仅在SPA中可能实现。通过视图过渡API - 以及现在的CSS @view-transition规则 - MPA现在可以实现类似效果。CSS视图过渡设计时考虑了渐进增强。因此,如果浏览器不支持它们,网站仍然可以正常工作,因为CSS被视为提示,仅在受支持时应用。
视图过渡的浏览器支持
在我们深入了解如何使用此功能之前,值得注意的是视图过渡目前在哪些地方受支持。CSS视图过渡规范有两个级别:
级别1使用视图过渡API在单个页面内启用过渡。这已在Chrome、Edge和Safari中得到支持。Firefox支持在版本144中可用(目前处于测试版)。
级别2通过@view-transition规则允许跨多个页面的过渡。目前支持Chrome 126+、Edge 126+和Safari 18.2+。在撰写本文时,级别2在Firefox中仍在进行中,但预计将来会支持。
在没有视图过渡支持的浏览器中,网站将继续正常使用标准页面导航,因为过渡被视为渐进增强,不会破坏您的网站。
创建您的第一个视图过渡
让我们深入了解并查看视图过渡的实际效果。
作为最简单的示例,您可以通过向代码中添加几行CSS来启用过渡:
|
|
就是这样!基本版本只有几行CSS,如果您问我,这真是太不可思议了。
要查看这行代码的效果,让我们构建两个演示页面。您也可以尝试将此代码添加到任何现有的多页面应用程序中。
第一个页面index.html只包含一个标题、几个段落和指向第二个页面的链接:
|
|
让我们准备好第二个页面hobbies.html。这也是一个简单的页面,包含一个标题、两个短段落和返回第一个页面的链接:
|
|
最后,将以下配方添加到您的style.css文件中:
|
|
这就是创建视图过渡所需的一切。只需这一行CSS,您将看到两个页面之间的无缝过渡。过去,这种平滑过渡仅在使用JavaScript的SPA中可能实现。通过CSS @view-transition规则,浏览器现在可以本机处理多页面应用程序中的过渡,而无需JavaScript。
超越默认过渡
现在让我们更进一步,自定义视图过渡。在这里,我们将创建一个滑入和滑出效果,这是一个简单的动画,用于理解视图过渡在底层的工作原理。
让我们向两个HTML页面添加两个不同的样式表。将此添加到index.html:
|
|
…并将此添加到hobbies.html:
|
|
是时候熟悉一些控制视图过渡的CSS选择器(伪元素)了:
::view-transition-old- 表示旧页面的伪元素::view-transition-new- 表示新页面的伪元素
让我们了解这些伪元素如何工作:::view-transition-old和::view-transition-new伪元素分别引用旧页面和新页面,允许我们在它们之间设置过渡样式。当我们从index.html导航到hobbies.html时,旧页面是我们来自的页面(index.html),新页面是我们前往的页面(hobbies.html)。
让我们添加一个滑动动画,使hobbies.html以平滑的滑动效果进入。我们将此动画称为slide-from-right。将以下代码添加到hobbies.css:
|
|
注意:
默认情况下,浏览器的视图过渡动画通过在旧页面和新页面之间动画化它们的不透明度并应用mix-blend-mode: plus-lighter来创建交叉淡入淡出效果。
在此示例中,我们清除了浏览器的默认动画(animation: none)并将其替换为slide-from-right动画。如果保留默认的交叉淡入淡出,您可以尝试不同的mix-blend-mode值以查看各种过渡效果。
以下是滑入效果的样子:
![滑入效果演示]
现在让我们通过添加另一个滑动动画来完成此效果,以确保hobbies.html以相同的方式滑出。在这种情况下,我们将从hobbies.html导航到index.html;因此,hobbies.html现在是我们的旧页面,index.html是新页面。
我们将此动画称为slide-to-right。将此代码添加到index.css:
|
|
请注意,我只在两个方向上动画化了hobbies.html,而没有向index.html添加任何动画。如果您喜欢,可以同时动画化两者。
以下是过渡最终的样子,包括hobbies.html的滑入和滑出效果:
![完整过渡效果演示]
查看演示页面以在浏览器中查看结果。如果您想扩展此演示,请随意使用mdn/dom-examples存储库中的代码,并为index.html页面添加动画(在index.css文件中查找animation: none)。
我很高兴看到您想出的所有酷炫视图过渡效果。
总结
您可以在MDN的Mastodon上观看我关于此主题的演讲视频。
愉快的视图过渡!愿您的多页面应用程序在页面之间轻松切换。