首页 > web前端 > css教程 > 正文

查看视口外的过渡

DDD
发布: 2024-11-19 07:28:02
原创
557 人浏览过

View Transitions outside the Viewport

CSS 视图转换已登陆 Chrome,并且(无论好坏)现在大多数最终用户都可以广泛使用。 Safari 也不甘落后,该功能已在 TP 中提供,而 Firefox 至少正在开发中。

我喜欢多页面转换的实现变得如此简单,但与此同时,我意识到它们的一个大问题:超出视口的元素开始疯狂地四处飘荡。

我的博客用一些 Javascript 来处理这个问题。 IntersectionObserver 在可见时在自定义属性中设置视图转换名称。只要它不在视线范围内,该属性就不会设置,并且不会触发转换。它可以工作,但需要 HTML、Javascript 和 CSS 相互依赖。本着让 CSS 表现更重要的精神,我想要一个更简单的解决方案。

Chrome 最近推出了另一个可能会有所帮助的功能:滚动驱动的动画。遗憾的是,这仅在 Chrome 中可用。 Firefox 将其置于标志后面,而 Safari 则没有显示任何活动迹象。但我们可以优雅地回退,要么使用前面提到的 Javascript 解决方案,要么干脆忽略视口检测并显示动画(在撰写本文时,Safari 就是这种情况)。

一个简单的过渡

让我们把它们放在一起,从视图转换本身开始:

@media (prefers-reduced-motion: no-preference) {
    @view-transition {
        navigation: auto;
    }

    [data-view-transition] {
        view-transition-name: var(--view-transition-name, default-view-transition);
    }
}
登录后复制
登录后复制
<!-- on page1.html: -->
<div data-view-transition>Whoosh!</div>

<!-- on page2.html: -->
<div data-view-transition>Whoosh!</div>
登录后复制

现在您将看到 page1.html 中的 div 在导航时转换为 page2.html 上的版本。 CSS 中的 @view-transition at-rule 也会对整个文档启动交叉淡入淡出。过渡持续时间默认设置为 0.4 秒,但我们可以添加几行来控制它:

@property --view-transition-duration {
    syntax: "<time>";
    inherits: true;
    initial-value: 0.4s;
}

::view-transition-group(*) {
    animation-duration: var(--view-transition-duration);
}
登录后复制

持续时间由 --view-transition-duration 设置 顶部的 @property 规则完全是可选的,但当我们设置 --view- 时,它会让动画持续时间回落到 0.4 秒而不是无效值过渡持续时间:假的。

处理视口

尽管如此,当页面转换时元素位于视口之外时,它仍然会动画,有时会进入或越过整个可见屏幕,而不指示它来自哪里或要去哪里。我觉得这种行为非常令人恼火。

通过滚动驱动的动画,我们现在有了一个可以根据滚动和视口相对位置控制样式的工具。所以我们还可以控制视图转换的触发:

@media (prefers-reduced-motion: no-preference) {
    @view-transition {
        navigation: auto;
    }

    [data-view-transition] {
        view-transition-name: var(--view-transition-name, default-view-transition);
    }
}
登录后复制
登录后复制

enable-vt 关键帧动画无法从无平滑过渡到带有文本字符串的自定义属性,因此会进行硬剪切。当元素部分进入或离开视口时,动画范围就会触发。动画本身将 --enable-view-transition 设置为 0.1% 和 99.9% 以尽快触发。我想在我们获得动画开始或结束位置的提示后立即启用视图转换。

最后 --enable-view-transitions 由滚动驱动动画设置为无或名为 --view-transition-name 的新自定义属性。它被设置为屏幕覆盖率的 0.1% 到 99.9% 之间,禁用视口上方和下方(或左侧和右侧,无论您想要以哪种方式握住它)的视图过渡。这个新属性对于在不同元素上设置单独的动画非常有用。每个元素都可以通过为 --view-transition-name 设置唯一值来获得自己的转换。

<div>



<p>这需要在源页面和目标页面上完成。如果没有设置值,则默认为default-view-transition,它统一控制所有剩余的data-view-transition元素。</p>

<h2>
  
  
  现实世界的实施
</h2>

<p>我将此实现添加到我的 CSS 样板 Ssstyles 中。在源页面和目标页面上为元素提供 data-view-transition 属性将使其在两者之间进行转换。给它一个 --view-transition-name 将让它拥有自己独特的动画,独立于其他类似元素。设置 --view-transition-duration 控制过渡的持续时间。</p>


          </div>

            
        
登录后复制

以上是查看视口外的过渡的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板