🔥 遇见我们的新项目 t0ggles - 您终极的项目管理工具! 🔥

安全区域

随着 iPhone X 的发布以及后续,苹果推出了所谓的安全区域,后来由 Google Chrome 实施并在 Android 中得到支持。

在具有安全区域的设备(如具有顶部屏幕缺口的设备)上,应用程序 UI 必须在纵向模式下包含额外的顶部/底部间距(以考虑顶部缺口和底部栏),以及在横向模式下包含额外的左右间距(以考虑左右缺口)。

视窗

如果您的应用程序针对全屏移动设备,请确保您的<meta name="viewport">中包含viewport-fit=cover,例如

<!DOCTYPE html>
<html lang="en">
  <head>
    ...
    <!-- Make sure you have viewport-fit=cover in content -->
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, viewport-fit=cover"
    />
  </head>

  <body>
    ...
  </body>
</html>

安全区域

为了告诉我们的组件我们的应用程序是一个全屏应用程序,我们需要考虑安全区域,我们需要将safe-areas类添加到 Konsta UI 组件的父元素中,最好是添加到根应用程序元素中。

<!-- App.vue  -->
<template>
  <!-- add "safe-areas" class to the app root element -->
  <div id="my-app" class="safe-areas">...</div>
</template>

如果您使用 Konsta UI 的 应用程序组件,则可以使用safeAreas道具启用它

<!-- App.vue -->
<template>
  <!-- enable with safeAreas prop -->
  <k-app safe-areas theme="ios">
    <HomePage />
  </k-app>
</template>
<script>
  import { kApp } from 'konsta/vue';

  export default {
    components: {
      kApp,
    },
  };
</script>

这就是safe-areas类在 CSS 中的定义方式

:root: {
  --k-safe-area-left: 0px;
  --k-safe-area-right: 0px;
  --k-safe-area-top: 0px;
  --k-safe-area-bottom: 0px;
}

@supports (left: env(safe-area-inset-left)):  {
  .safe-areas: {
    --k-safe-area-left: env(safe-area-inset-left);
    --k-safe-area-right: env(safe-area-inset-right);
    --k-safe-area-top: env(safe-area-inset-top);
    --k-safe-area-bottom: env(safe-area-inset-bottom);
  }
}

禁用安全区域

在模态窗口和侧边面板(不是全屏元素)上禁用安全区域可能很有用。

我们可以使用以下实用程序类在某些元素上禁用安全区域

.no-safe-areas在元素上禁用所有安全区域
.no-safe-areas-top在元素上禁用顶部安全区域
.no-safe-areas-right在元素上禁用右侧安全区域
.no-safe-areas-bottom在元素上禁用底部安全区域
.no-safe-areas-left在元素上禁用左侧安全区域

这就是no-safe-areas类在 CSS 中的定义方式

@supports (left: env(safe-area-inset-left)):  {
  .no-safe-areas: {
    --k-safe-area-left: 0px;
    --k-safe-area-right: 0px;
    --k-safe-area-top: 0px;
    --k-safe-area-bottom: 0px;
  }
  .no-safe-areas-top: {
    --k-safe-area-top: 0px;
  }
  .no-safe-areas-right: {
    --k-safe-area-right: 0px;
  }
  .no-safe-areas-bottom: {
    --k-safe-area-bottom: 0px;
  }
  .no-safe-areas-left: {
    --k-safe-area-left: 0px;
  }
}

安全间距和放置

我们也可以在放置元素时考虑安全区域

CSS
.top-safetop: var(--k-safe-area-top)
.top-[value]-safetop: calc([value] + var(--k-safe-area-top))
.right-saferight: var(--k-safe-area-right)
.right-[value]-saferight: calc([value] + var(--k-safe-area-right))
.bottom-safebottom: var(--k-safe-area-bottom)
.bottom-[value]-safebottom: calc([value] + var(--k-safe-area-bottom))
.left-safeleft: var(--k-safe-area-left)
.left-[value]-safeleft: calc([value] + var(--k-safe-area-left))

以及边距和填充

CSS
.pt-safepadding-top: var(--k-safe-area-top)
.pt-[value]-safepadding-top: calc([value] + var(--k-safe-area-top))
.pr-safepadding-right: var(--k-safe-area-right)
.pr-[value]-safepadding-right: calc([value] + var(--k-safe-area-right))
.pb-safepadding-bottom: var(--k-safe-area-bottom)
.pb-[value]-safepadding-bottom: calc([value] + var(--k-safe-area-bottom))
.pl-safepadding-left: var(--k-safe-area-left)
.pl-[value]-safepadding-left: calc([value] + var(--k-safe-area-left))
CSS
.mt-safemargin-top: var(--k-safe-area-top)
.mt-[value]-safemargin-top: calc([value] + var(--k-safe-area-top))
.mr-safemargin-right: var(--k-safe-area-right)
.mr-[value]-safemargin-right: calc([value] + var(--k-safe-area-right))
.mb-safemargin-bottom: var(--k-safe-area-bottom)
.mb-[value]-safemargin-bottom: calc([value] + var(--k-safe-area-bottom))
.ml-safemargin-left: var(--k-safe-area-left)
.ml-[value]-safemargin-left: calc([value] + var(--k-safe-area-left))

例如

<!--
"left-safe" class will set:
  left: var(--k-safe-area-top);

"bottom-4-safe" class will set:
  bottom: calc(1rem + var(--k-safe-area-bottom));
-->
<div class="left-safe bottom-4-safe">...</div>;
代码许可证: MIT.
2022 © Konsta UI 由 nolimits4web.