隨著 iPhone X 的發布以及後續的發展,Apple 引入了所謂的安全區域,後來 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>
為了告訴我們的組件我們的應用程式是全螢幕應用程式,並且我們需要考慮安全區域,我們需要在 Konsta UI 組件的父元素中新增 safe-areas
類別,最好是新增到根應用程式元素。
/* App.jsx */
import React from 'react';
export default function MyApp() {
return (
<>
{/* add "safe-areas" class to the app root element */}
<div id="my-app" className="safe-areas">
...
</div>
</>
);
}
如果您使用 Konsta UI 的 App 組件,則可以使用 safeAreas
屬性啟用它
/* App.jsx */
import React from 'react';
import { App, ... } from 'konsta/react';
export default function MyApp() {
return (
<>
{/* enable with safeAreas prop */}
<App safeAreas theme="ios">
...
</App>
</>
);
}
這是 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 className="left-safe bottom-4-safe">...</div>;