用几行原生JS就可以实现丝滑的元素过渡效果
zhezhongyun 2025-07-08 00:22 2 浏览
作者: ConardLi
大家可以看下下面这个应用的页面切换体验,是不是很丝滑~
做过体验优化的朋友应该都清楚,如果用原生的 CSS 或者 JS 动画去实现,想要实现出类似的效果,不会特别简单,而且也要考虑性能问题。
不过,最近有一个新的提案,可以帮助我们快速实现这样的效果。
Shared Element Transitions 是一个新的 script 提案,它可以帮助我们在 SPA 或者 MPA 页面中实现元素过渡效果。
本项提案的灵感来自于 Material Design(设计届的天花板) 中的过渡效果。
试用
这个 API 从 Chrome 92 版本中开始试用,你可以通过在 Chrome 的 about:flags 中搜索 #document-transition 来开启这项试用。
你可以测试下 document 上是否存在 documentTransition 来验证 API 是否支持。
if ('documentTransition' in document) {
// Feature supported
}
这个提案主要分为两部分,第一个是完整的根过渡,第二个是指定一组共享元素进行过渡。
简单的根过渡
顾名思义,跟过渡的意思就是转换整个页面的根节点,下面我们来看一个例子:
// When the user clicks on a link/button:
async function navigateToSettingsPage() {
// Capture the current state.
await document.documentTransition.prepare({
rootTransition: 'cover-left',
});
// This is a function within the web app that updates the DOM:
updateDOMForSettingsPage();
// Start the transition.
await document.documentTransition.start();
// Transition complete!
}
执行一次根过渡,只需要上面几行代码:
- 调用 documentTransition.prepare() 函数捕获当前页面的视觉状态
- 调用一个更新 DOM 的函数(比如改变页面的背景色),上面例子中用的是 updateDOMForSettingsPage() 函数
- 调用 documentTransition.start() 函数执行转换
另外,你还可以通过 rootTransition 属性来改变过渡的方向。
然后,你就拥有了一个非常丝滑的过渡效果。
你可以打开下面这个网站来看一个演示示例(注意一定要打开上面提到的实验 flag,不然没有效果):
https://root-transitions-demo.glitch.me/
不过,这个过渡也是有一些局限性的,比如下面几点:
- 过渡的页面会失去动画效果:过渡的页面会被捕获为单个帧,如果被过渡的元素上有一些 gif 或者 CSS 动画,可能会失效。
- 转换对整个文档生效:你还不能将过渡限制为某些内部 UI。
- 对过渡控制有限:现在还没法控制过渡的长度、透明度或者其他属性,未来可能会支持。
注意,你一旦调用了 documentTransition.prepare() ,后面做的所有 DOM 的更改都不会立即生效,浏览器会进行延迟渲染,直到后面的 documentTransition.start() 被调用。
共享元素过渡
你还可以指定一组特定的元素进行过渡,可以参考下面的效果(加了过渡状态的 preact 官网):
「https://preact-with-nav-transitions.netlify.app/」
我们可以通过指定 sharedElements 这个属性来实现共享元素过渡:
// When the user clicks on a link/button:
async function navigateToSettingsPage() {
// Capture and visually freeze the current state.
await document.documentTransition.prepare({
rootTransition: 'cover-up',
sharedElements: [element1, element2, element3],
});
// This is a function within the web app:
updateDOMForSettingsPage();
// Start the transition.
await document.documentTransition.start({
sharedElements: [element1, element4, element5],
});
// Transition complete!
}
在这种情况下,指定的 sharedElements 将会独立于页面的其他部分进行动画处理。
未来
- 多页应用:现在这个 API 还无法实现页面到页面的转换,documentTransition 正在努力支持中,类似下面的实现:
document.documentTransition.startOnNavigation(
url,
sharedElements: selectorList
);
- 多页跨域应用:跨域页面间的过渡转换,这个更难实现,而且还需要考虑一些安全限制,这个也是未来此 API 要支持的能力。
大家有更多的问题可以到 Github(https://github.com/WICG/shared-element-transitions) 进行讨论。
我觉得这个功能还是非常 nice 的,希望它尽早结束试用,在稳定版和我们见面。
相关推荐
- 不看必后悔!15个三星GoodLock隐藏小技巧~(上)
-
很多刚用三星手机的星粉们,一定对三星GoodLock这个宝藏App还不是很了解,今天就带大家一起详细去看看GoodLock这个大家族究竟有多少宝藏功能及成员呢?让我们一起来看看吧~由于Good...
- 惊魂幻象理智值监控WA!大字体+范围提示一目了然
-
一个WA助你轻松监控大幻象理智值,不再错过恢复时机这个WA用大字体实时同步我们的理智值下面的图标提示恢复宝珠的剩余次数上面的图标高亮则意味着我们在宝珠的恢复范围内我们可以将图标随意移动到适合自己观察的...
- 盘点十个超炫的jQuery插件(jquery插件是干什么的)
-
“DevExpress14.2新版发布会”即将推出。心动不如行动,赶快报名吧!我们期待与您相约。今天小编为大家搜罗了十个超酷的jQuery插件,这可以使你的网站界面更加友好。jQuery创造了令人难...
- Google官方梳理,Android 多返回栈技术详解
-
用户通过系统返回按钮导航回去的一组页面,在开发中被称为返回栈(backstack)。多返回栈即一堆"返回栈",对多返回栈的支持是在Navigation2.4.0-alpha0...
- 说三星手机系统不好用,因为没有玩明白三星,三星Diy功能超强大
-
都说三星手机系统不好用,其实真正用起来,挺好用的三星手机系统像块没打磨的玉,默认设置是基础款,用着普通。但你要是肯花点时间,它能变得特别顺手。关键就在一个叫GoodLock的工具,它是三星自家出的...
- Sam Helper三星手机用户必装神器(三星手机必装app)
-
SamHelper这款软件集合了三星手机主题工具当前主题o主题路径o主题安装系统设置屏幕模式o状态栏o文件o频段o暗码Lock&LabsGoodLockoGalaxyLa...
- 外卖套餐搭配的探索和应用(外卖套餐搭配技巧)
-
本文系外卖美食知识图谱系列的第三篇文章,从技术层面我们会介绍外卖套餐搭配的技术方案,包括离线、实时的套餐搭配的迭代,套餐质量评估方案,同时会介绍套餐搭配的业务应用。1.背景让用户更方便快捷地选购到满...
- 用几行原生JS就可以实现丝滑的元素过渡效果
-
作者:ConardLi大家可以看下下面这个应用的页面切换体验,是不是很丝滑~做过体验优化的朋友应该都清楚,如果用原生的CSS或者JS动画去实现,想要实现出类似的效果,不会特别简单,而且也要考...
- 速腾车主RNS315固件及2016年6月地图升级详细教程
-
本来打算买个大众原厂的地图卡,后来在网上看其实不需要原厂地图卡也可以升级,于是开始在网上收集资料,开始天真的以为只要有密匙文件修改一下就可以免费升级了,其实最主要的还是破解的固件,不知道为什么,网上找...
- 学习一个母词act,一次解析一串关联、复合、衍生词族
-
首先形义解读一下act的原始意象,A是力量与行动的开始C是范围的覆盖T是目标目的的接触与刻度合在一起,行动行为艺术力量的复合行为以下是关于act的复合词、词根词缀衍生词及其变形后的词根衍生词的详细...
- 优迈系统(一体化控制柜)快车调试(八)
-
逻辑故障和驱动故障分析段码管上显示警告码和故障码对照表警告码操作模式故障码操作模式或驱动故障AL000EPC(紧急电源管制模式)ER100DTC(门在设定时间内不能关到位)AL001COR(复位模式)...
- Layui简单实现左侧菜单和Tab选项卡动态操作
-
<!DOCTYPEhtml><html><head><metacharset="utf-8">...
- 码农如何快速打造一个有设计感的网站
-
像我这样的程序员来说经常被“设计”这个词吓到,因为我是一名程序员而不是设计师,我拥有的是计算机学位证,另外我对ComicSans字体并不介意。(注:ComicSans字体是Win95附带...
- vue3 新特性 computed、watch、watchEffect 看完就会
-
1、watchEffectwatchEffect侦听器是一个副作用函数,不需要指定监听的某个属性,监视的回调中用到哪个属性,就会监听哪个属性,一旦运行就会立即执行。watchEffect与com...
- 10个冷门但非常实用前端开发者很少用的CSS规则
-
许多开发者只学了基础——比如修改颜色、设置字体或创建弹性布局——就止步不前。但CSS是一门精深而多用途的语言,掌握后能帮你构建优雅、高效且无障碍的界面。无论你是从零搭建还是微调设计系统,掌握一些高...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 教程 (33)
- HTML 简介 (35)
- HTML 实例/测验 (32)
- HTML 测验 (32)
- JavaScript 和 HTML DOM 参考手册 (32)
- HTML 拓展阅读 (30)
- HTML常用标签 (29)
- HTML文本框样式 (31)
- HTML滚动条样式 (34)
- HTML5 浏览器支持 (33)
- HTML5 新元素 (33)
- HTML5 WebSocket (30)
- HTML5 代码规范 (32)
- HTML5 标签 (717)
- HTML5 标签 (已废弃) (75)
- HTML5电子书 (32)
- HTML5开发工具 (34)
- HTML5小游戏源码 (34)
- HTML5模板下载 (30)
- HTTP 状态消息 (33)
- HTTP 方法:GET 对比 POST (33)
- 键盘快捷键 (35)
- 标签 (226)
- HTML button formtarget 属性 (30)
- CSS 水平对齐 (Horizontal Align) (30)