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>
</>
);
}
これはCSSで定義されたsafe-areas
クラスです。
: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 | 要素の左側のセーフエリアを無効にする |
これはCSSで定義されたno-safe-areas
クラスです。
@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>;