🔥 隆重介紹我們的新專案 t0ggles - 您終極的專案管理工具! 🔥

安全區域

隨著 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-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 className="left-safe bottom-4-safe">...</div>;
程式碼以以下授權條款授權 MIT.
2022 © Konsta UI by nolimits4web.