学习这些视口相关的 CSS 单位(100vh、100dvh、100lvh、100svh)

原文信息: 查看原文查看原文

Learn These Viewport-Relative CSS Units (100vh, 100dvh, 100lvh, 100svh)

- George Martsoukos

在本教程中,我们将讨论使用经典的 100vh 单位创建全屏部分时面临的挑战,并讨论一些出色的替代 CSS 单位。

英雄或全屏部分是 UI 设计的重要组成部分。它们存在于不同类型的网站中,从登陆页面到作品集网站,旨在在首次吸引访客的注意力。英雄部分的常见组成部分包括幻灯片、图片、视频、标题、文本、行动链接等。

100vh

近年来,创建全屏部分的最简单方法是将其高度设置为 100vh,假设其宽度等于视口宽度。

vh 的当前支持

当前对 vh 的支持

在桌面浏览器上,一切都按预期工作。

然而,在移动浏览器上,默认情况下全屏部分并不完全可见。只有在滚动时,当用户代理的浮动地址栏缩小时,我们才能看到它们全部。请注意,地址栏的位置可能会出现在顶部或底部。

如果我们的部分包含垂直居中的内容或位于其底部位置的行动链接等内容,并且因此最初对访问者部分可见,这可能会导致糟糕的用户体验。

为了演示该行为,我创建了一个包含带有背景图片和垂直居中内容的全屏部分的 GitHub 页面

请继续使用您的移动设备访问该页面。您会注意到英雄图片默认情况下并不完全可见。

100vh 行为初始状态和滚动时

还有一个 指向第二个页面的链接,其中包含一个粘性标题。

幸运的是,现代 CSS 提供了一些 新的视口相关单位,这些单位在写作时具有很好的浏览器支持(超过 90%)。它们在桌面浏览器上的行为与 100vh 相同,因为没有任何动态 UA 接口。但是它们在移动设备上的行为有所不同。

100dvh

这些单位中的第一个是动态视口高度单位(dvh)。

以下是它在 W3C 工作草案 文档中的定义:

动态视口百分比单位(dv*)是相对于动态视口大小定义的:根据动态考虑任何 UA 接口的视口大小,这些接口可以动态展开和收缩。这允许作者调整内容的大小,以使其可以完全适合视口,无论是否存在这样的接口。

理解其行为最简单的方法是重新访问我们的页面,并点击 dvh 按钮将 100dvh 应用于英雄部分。

dvh 的当前支持

当前对 dvh 的支持

您会注意到,默认情况下,英雄部分将完全显示。然后,当您滚动时,地址栏折叠,它会更新部分的高度,并且表现得像 100vh 一样。

尽管如此,由于这个单位始终试图匹配视口高度,而不管工具栏是否存在,这会导致滚动时出现瞬间跳跃/闪烁,从而导致我们的居中内容重新定位—这在大多数情况下并不是 100vh 的理想替代品,并且可能会对用户和/或性能产生影响。

100dvh 行为初始状态和滚动时

100lvh

接下来,我们有大视口高度单位(lvh)。

以下是它在 W3C 工作草案 文档中的定义:

大视口百分比单位(lv*)和默认视口百分比单位(v*)是相对于大视口大小定义的:假设任何 UA 接口被动态展开和收缩时的视口大小。这允许作者调整内容的大小,以确保填充视口,注意到当这些接口展开时,这样的内容可能被隐藏。

同样,理解其行为最简单的方法是重新访问我们的页面,并点击 lvh 按钮将 100lvh 应用于英雄部分。

lvh 的当前支持

当前对 lvh 的支持

您会注意到我们的部分行为与将其高度设置为 100vh 时完全相同。也就是说,默认情

况下,英雄部分不会完全显示,但当地址栏收缩时会完全显示。

换句话说,这个单位总是返回在工具栏最小时滚动时出现的最大可见视口高度—在写作时,这当然不是 100vh 的理想替代品,因为它并没有提供任何新功能。

100lvh 行为初始状态和滚动时

100svh

最后,我们有小视口高度单位(svh)。

以下是它在 W3C 工作草案 文档中的定义:

小视口百分比单位(sv*)是相对于小视口大小定义的:假设任何 UA 接口被动态展开和收缩时的视口大小。这允许作者调整内容的大小,以确保即使存在这样的接口,内容也可以适合视口,注意到当这样的接口被展开时,这样的内容可能不会填充视口。

请再次查看我们的页面,并点击 svh 按钮将 100svh 应用于英雄部分,以查看其行为。

svh 的当前支持

当前对 svh 的支持

您会注意到我们的部分将始终可见,并且行为与 100dvh 的初始状态(滚动之前)相同。

换句话说,在写作时,这个单位将始终返回最小的可见视口高度,当工具栏展开时出现—这当然使其成为 100vh 的理想替代品。

100svh 行为初始状态和滚动时

回退

如果您对前述任何单位感到满意,并希望使用它,但同时需要回退到 100vh 单位以确保更安全,请尝试类似于这样的老式 CSS:

.hero {
  height: 100svh;
  height: 100vh;
}

这样,不受支持的浏览器将忽略第一个属性值。

结论

在本教程中,我们讨论了在使用不同的视口相关单位时在所有设备上制作真正的全屏部分所面临的挑战。

让我们回顾一下在移动浏览器上的行为:

  • 100vh100lvh 设置为一个部分将产生相同的结果。该部分将具有固定高度(除非我们调整视口大小),但除非我们滚动并且地址栏被收缩,否则我们将无法完全看到它。
  • 100dvh 设置为一个部分意味着它不会有固定的高度,但会随着我们滚动而重新计算。因此,该部分内部的元素可能会重新定位。在某些场景下,它的行为可能有用,但可能会令用户感到烦恼。
  • 100svh 设置为一个部分意味着它将始终具有固定的高度(除非我们调整视口大小),该高度将等于初始视口高度(在我们滚动之前)—当地址栏展开时。该部分将默认完全可见,就像 100dvh 的初始状态一样。

我的建议是,此时此刻,使用 100svh 创建全屏英雄部分,并回退到 100vh

分享于 2024-04-01

访问量 485

预览图片