视图转换动画是浏览器提供的一种视觉过渡效果,可以实现页面切换时的视觉过渡效果,实现无缝过渡,打造更加流畅的用户体验。我们先通过下面两个例子来体验下:

可以看到,网站的切换元素是平滑过渡的,实在是非常丝滑,如何实现类似的效果呢?在单页应用快速启用视图过渡方法,只需要使用 document.startViewTransition 方法,确保每个过渡元素都有 view-transition-name、内嵌或使用 JavaScript 动态创建 DOM 节点即可。

document.startViewTransition(async () => {
  await new Promise((resolve) => setTimeout(resolve, 1000));
});

现场实操

我们现在来实现一个列表视觉过渡动画,现在有一个评论列表:

<ul class="comment-list">
  <li class="comment-item">
    <div class="comment-content">
      <div class="username">用户一</div>
      <div class="comment-text">这是第一条评论内容,写得很精彩!</div>
    </div>
    <span class="delete-icon">×</span>
  </li>
  <li class="comment-item">
    <div class="comment-content">
      <div class="username">用户二</div>
      <div class="comment-text">非常同意楼上的观点,确实很有见地。</div>
    </div>
    <span class="delete-icon">×</span>
  </li>
  <li class="comment-item">
    <div class="comment-content">
      <div class="username">用户三</div>
      <div class="comment-text">这个话题很有意思,我也来分享一下我的看法。</div>
    </div>
    <span class="delete-icon">×</span>
  </li>
</ul>

接下来实现一个删除评论功能,我们可以这样写。

document.querySelectorAll(".delete-icon").forEach((icon) => {
  icon.addEventListener("click", (e) => {
    e.target.closest(".comment-item").remove();
  });
});

这样功能是实现了,但是没有过渡效果,比较生硬。

0a0ed33f-fcc7-4fd1-89b3-7f3f15df5099.gif

接下实现视觉过渡效果,非常非常简单,只需要在删除元素的脚本放在 document.startViewTransition 的回调函数里面即可:

document.startViewTransition(() => {
  // 在这里执行动画
  e.target.closest(".comment-item").remove();
});

24da78b8-3723-474f-9608-c02f43a5cc16.gif

除了单页应用支持视觉过渡效果之外,从 Chrome 126 开始,Chrome 支持跨文档视图转换。前提有两点:

  • 这两个文档需要位于同一来源。
  • 这两个网页都需要选择启用 @view-transition,才能允许视图转换,只需要在页面引入下面代码即可:
@view-transition {
  navigation: auto;
}

随着更多浏览器对视图转换的支持以及 Web 标准的进一步发展,我们可以期待看到更多创新的动画效果和更丰富的用户互动模式。