下面这段代码在 PC 端下不会出现滚动条, 但在移动端下会出现滚动条

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>playground</title>
    <style>
      body {
        margin: 0;
      }
      .container {
        height: 100vh;
        background-color: red;
      }
    </style>
  </head>
  <body>
    <div class="container"></div>
  </body>
</html>

按理说 vh 表示视口高度的百分比, 但视口又分为小视口和大视口

某些浏览器会在用户滚动页面时动态隐藏和显示浏览器 UI 以便展示更多页面区域

小视口是指浏览器 UI 显示时剩下的区域

大视口是指浏览器 UI 隐藏时剩下的区域

小视口高度和大视口高度的百分比可以分别用 svh 和 lvh 表示

vh 等同于 lvh

实测, 在本人的移动端上, 浏览器的 UI 不会出现动态隐藏和显示的情况, 也就是说页面的可见区域是小视口, 设置成 100vh, 相当于页面铺满包括浏览器 UI 的高度, 所以被浏览器 UI 遮挡, 需要向下滚动显示完整内容

如果设置成 svh, 在一些浏览器上, 隐藏 UI 后可能会出现空白区域

svh 和 lvh 都有利弊, 所以还有一种单位 dvh, 可以跟随浏览器 UI 动态调整视口高度, 但也有缺点, 可能会导致用户滚动页面过程不断重排

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>playground</title>
    <style>
      body {
        margin: 0;
      }
      .container {
        height: 100dvh;
        background-color: red;
      }
    </style>
  </head>
  <body>
    <div class="container"></div>
  </body>
</html>