随着 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-safe | top: var(--k-safe-area-top) |
.top-[value]-safe | top: calc([value] + var(--k-safe-area-top)) |
.right-safe | right: var(--k-safe-area-right) |
.right-[value]-safe | right: calc([value] + var(--k-safe-area-right)) |
.bottom-safe | bottom: var(--k-safe-area-bottom) |
.bottom-[value]-safe | bottom: calc([value] + var(--k-safe-area-bottom)) |
.left-safe | left: var(--k-safe-area-left) |
.left-[value]-safe | left: calc([value] + var(--k-safe-area-left)) |
以及边距和填充
类 | CSS |
---|---|
.pt-safe | padding-top: var(--k-safe-area-top) |
.pt-[value]-safe | padding-top: calc([value] + var(--k-safe-area-top)) |
.pr-safe | padding-right: var(--k-safe-area-right) |
.pr-[value]-safe | padding-right: calc([value] + var(--k-safe-area-right)) |
.pb-safe | padding-bottom: var(--k-safe-area-bottom) |
.pb-[value]-safe | padding-bottom: calc([value] + var(--k-safe-area-bottom)) |
.pl-safe | padding-left: var(--k-safe-area-left) |
.pl-[value]-safe | padding-left: calc([value] + var(--k-safe-area-left)) |
类 | CSS |
---|---|
.mt-safe | margin-top: var(--k-safe-area-top) |
.mt-[value]-safe | margin-top: calc([value] + var(--k-safe-area-top)) |
.mr-safe | margin-right: var(--k-safe-area-right) |
.mr-[value]-safe | margin-right: calc([value] + var(--k-safe-area-right)) |
.mb-safe | margin-bottom: var(--k-safe-area-bottom) |
.mb-[value]-safe | margin-bottom: calc([value] + var(--k-safe-area-bottom)) |
.ml-safe | margin-left: var(--k-safe-area-left) |
.ml-[value]-safe | margin-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>;