屏幕配置

在许多方面,自适应网页设计是对手机的一种回应。在智能手机出现之前,很少有人认真考虑网站在手持设备上的外观和感觉。但随着内置 Web 浏览器的手机的迅速崛起,这种情况发生了变化。

自适应网页设计提倡一种质疑假设的思维模式。以前,人们通常假设网站只会显示在台式计算机上,而现在,为手机和平板电脑设计同一个网站已成为标准做法。实际上,移动设备的使用量现在已经超过了网络上的台式机使用量

这种自适应思维模式将在未来为您提供良好的服务。您的网站完全有可能在今天我们甚至无法想象的设备和屏幕上被查看。这种思维模式甚至超越了屏幕。即使现在,人们也在使用没有屏幕的设备来访问您的内容。如果您使用强大的语义 HTML 基础,语音助手可以使用您的网站。

屏幕世界也在进行实验。今天市场上有一些带有可折叠屏幕的设备。这给您的设计带来了一些挑战。

A montage of foldable phones in different configurations.

双屏幕

可折叠设备的用户可以选择让他们的 Web 浏览器仅占用一个屏幕,还是跨越两个屏幕。如果浏览器跨越两个屏幕,则显示的网站将被两个屏幕之间的铰链分隔开。这看起来不太好。

A website spanning across two screens. The horizontal flow of text is interrupted by the hinge between the screens.

视口分段

有一种实验性的媒体功能旨在检测您的网站是否显示在双屏设备上。提议的媒体功能名称为 viewport-segments。有两种变体:horizontal-viewport-segmentsvertical-viewport-segments

如果 horizontal-viewport-segments 媒体功能报告的值为 2,并且 vertical-viewport-segments 报告的值为 1,则表示设备上的铰链从上到下运行,将您的内容分成两个并排的面板。

@media (horizontal-viewport-segments: 2) and (vertical-viewport-segments: 1) {
  // Styles for side-by-side screens.
}

如果 vertical-viewport-segments 媒体功能报告的值为 2,并且 horizontal-viewport-segments 报告的值为 1,则铰链从一侧到另一侧运行,将您的内容分成两个面板,一个在另一个之上。

@media (vertical-viewport-segments: 2) and (horizontal-viewport-segments: 1) {
  // Styles for stacked screens.
}
Diagram demonstrating viewport segments.
图表来自 Microsoft Edge Explainers

如果 vertical-viewport-segmentshorizontal-viewport-segments 都报告的值为 1,则表示网站仅在一个屏幕上显示,即使设备有多个屏幕也是如此。这相当于不使用任何媒体查询。

环境变量

viewport-segments 媒体功能本身无法帮助您围绕那个恼人的铰链进行设计。您需要一种了解铰链尺寸的方法。这就是 environment 变量可以提供帮助的地方。

CSS 中的环境变量允许您将笨拙的设备侵入因素纳入您的样式中。例如,您可以使用环境值 safe-area-inset-topsafe-area-inset-rightsafe-area-inset-bottomsafe-area-inset-left 围绕 iPhone X 上的“刘海”进行设计。这些关键字都包含在 env() 函数中。

body {
  padding-top: env(safe-area-inset-top);
  padding-right: env(safe-area-inset-right);
  padding-bottom: env(safe-area-inset-bottom);
  padding-left: env(safe-area-inset-left);
}

环境变量的工作方式类似于自定义属性。这意味着您可以传入一个回退选项,以防环境变量不存在。

body {
  padding-top: env(safe-area-inset-top, 1em);
  padding-right: env(safe-area-inset-right, 1em);
  padding-bottom: env(safe-area-inset-bottom, 1em);
  padding-left: env(safe-area-inset-left, 1em);
}

为了让这些环境变量在 iPhone X 上工作,请更新指定 viewport 信息的 meta 元素

<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">

现在,您的页面布局将占用整个视口,并使用设备提供的插值安全地填充文档。

对于可折叠屏幕,正在提议六个新的环境变量:viewport-segment-widthviewport-segment-heightviewport-segment-topviewport-segment-leftviewport-segment-bottomviewport-segment-right

Diagram showing environment variables for dual screens.
图表来自 Microsoft Edge Explainers

这是一个包含两列布局的示例,其中一列比另一列宽。

@media (min-width: 45em) {
  main {
    display: flex;
    flex-direction: row;
  }
  main article {
    flex: 2;
  }
  main aside {
    flex: 1;
  }
}

The layout is split across two screens with the hinge interrupting the wider column.

对于带有垂直铰链的双屏幕,将第一列设置为第一个屏幕的宽度,将第二列设置为第二个屏幕的宽度。

@media (horizontal-viewport-segments: 2) and (vertical-viewport-segments: 1) {
  main article {
    flex: 1 1 env(viewport-segment-width 0 0);
  }
  main aside {
    flex: 1;
  }
}

The layout is split evenly across two screens with no visible interruption.

将双屏幕视为一种机会。也许一个屏幕可以用于显示可滚动的文本内容,而另一个屏幕可以显示固定元素(如图或地图)。

Diagram illustrating a location service split over two screens, with the map on one screen and directions on the other.
图表来自 Microsoft Edge Explainers

未来

可折叠显示器会成为下一个热门事物吗?谁知道呢。没有人能够预测移动设备会变得多么流行,因此值得对未来的外形尺寸保持开放的心态。

最重要的是,值得确保您的网站能够响应未来可能带来的任何变化。这就是自适应设计为您提供的:不仅仅是一套实用的技术,更是一种思维模式,它将在您构建未来的网络时为您提供良好的服务。

检查您的理解情况

测试您对屏幕配置的知识

哪个媒体查询以分屏横向模式定位可折叠设备?

@media (horizontal-viewport-segments: 2) and (vertical-viewport-segments: 1)
屏幕配置为 2 列 1 行,分屏横向。
@media (vertical-viewport-segments: 2) and (horizontal-viewport-segments: 1)
2 行 1 列,分屏纵向。
@media (vertical-viewport-segments: 2) and (horizontal-viewport-segments: 2)
2 行 2 列,四分屏。
@media (vertical-viewport-segments: 1) and (horizontal-viewport-segments: 1)
单单元格,无分屏。

什么是环境变量?例如 env(safe-area-inset-top)

关于用户所在天气的变量。
环境错误,这些 CSS 变量与用户所处的物理世界环境无关。
自定义构建时变量。
虽然构建时、编译方式的变量很有用,但它们与指定的环境变量不同。
包含浏览器特定属性的变量,用于调整站点以适应该浏览器和设备。
这是浏览器和作者协作处理独特的视口上下文或影响浏览器的属性的一种方式。
已变为绿色且对环境更安全的环境变量。
CSS 及其变量无法减少世界污染。