Android 版 Chrome のエッジツーエッジ移行ガイド

公開日: 2025 年 2 月 28 日

エッジ ツー エッジは、Android システムバーの背後に描画することで、ディスプレイの幅と高さ全体にアプリケーションを広げることができる Android の機能です。

Chrome 135 より前の Android 版 Chrome では、エッジ ツー エッジで描画されませんでした。このガイドでは、この変更がウェブサイトに与える影響と、デベロッパーとしてこの変更に対応するためにできることについて説明します。

バーがどこにでもある

Android には、オペレーティング システム自体が提供するシステムバーが付属しています。

ステータスバー、キャプション バー、ナビゲーション バーをまとめてシステムバーと呼びます。バッテリー残量、時刻、通知アラートなどの重要な情報を表示し、どこからでもデバイスを直接操作できます。

画面の上部にはステータスバーがあり、通知アイコンやシステム アイコンが表示されます。

システムバーがハイライト表示されている Android デバイスの上部のイラスト。
Android のステータスバーがハイライト表示されている(ソース)。

画面の下部にはナビゲーション バーがあり、[戻る]、[ホーム]、[概要] のコントロールを使用してナビゲーションを操作できます。従来の 3 ボタン ナビゲーションまたは最新のジェスチャー ナビゲーション バーを使用できます。

ジェスチャー ナビゲーション バーが表示されている Android デバイスの下部のイラスト。
ジェスチャー ナビゲーション バー(ソース)

Android のシステムバーに加えて、Chrome 自体にもアドレスバーが搭載されており、スクロールに合わせて動的に拡大縮小します。

Chrome が狭額縁エクスペリエンスに変更される

ウェブサイトにアクセスすると、そのウェブサイトはレイアウト ビューポートと呼ばれる長方形の中に表示されます。

Android 版 Chrome では、Chrome 135 より前は、レイアウト ビューポートは上部のステータスバーと下部のジェスチャー ナビゲーション バーの間に描画されていました。Chrome のアドレスバーの有無はビューポートのサイズに影響する可能性がありますが、ビューポートが上部のシステムバーや下部のジェスチャー ナビゲーション バーに拡大することはありません。

Android 版 Chrome が端から端まで表示されていない Android デバイスのイラスト。左側のイラストは、アドレスバーが開いた状態の Chrome を示しています。アドレスバーとジェスチャー ナビゲーション バーの間に、緑色でハイライト表示された 100svh のサイズのボックスがあります。右側のイラストは、アドレスバーが縮小された Chrome を示しています。ステータス バーとジェスチャー ナビゲーション バーの間に、緑色でハイライト表示された 100lvh のサイズのボックスがあります。ビューポート自体には青い点線の枠線が表示されます。
Chrome 135 より前の Android 版 Chrome のビューポートの最小サイズと最大サイズ。これらのサイズは、小と大のビューポートと呼ばれます。ビューポート自体には青い破線の枠線が表示されます。

Chrome 135 以降では、ビューポートを Android のジェスチャー ナビゲーション バーまで拡張できるようになります。これがエッジ ツー エッジと呼ばれる動作です。

Android 版 Chrome のビューポートのイラスト。左側はエッジ ツー エッジではない場合、右側はエッジ ツー エッジの場合。各可視化には、高さ 100vh にサイズ設定された要素を表す青いボックスがあります。左側のテキストは、クロームがエッジ ツー エッジでない場合に何が起こるかを明確にしています。「ビューポートは上部のステータスバーと下部のジェスチャー ナビゲーション バーの間に固定されたままになります」と表示されます。右側のテキストでは、Chrome がエッジ ツー エッジの場合に何が起こるかを説明しています。「ビューポートがジェスチャー ナビゲーション バーにまで広がっている」と表示されます。
Android 版 Chrome で表示される、エッジ ツー エッジではない大きなビューポート(左)と、エッジ ツー エッジのビューポート(右)。エッジ ツー エッジをサポートする Chrome では、Chrome の動的ツールバーが格納されると、ビューポートがジェスチャー ナビゲーション バーの領域まで拡張されます。

エッジ ツー エッジなしの Chrome の動作

次の録画は、エッジ ツー エッジに対応していない Android 版 Chrome を示しています。ページをスクロールすると、Chrome のアドレスバー(上部)が動的に非表示になります。ただし、Android ネイティブの上部ステータスバーと下部の Android ネイティブ ナビゲーション バーは固定されたままです。

以前の動作: エッジ ツー エッジのサポートがない Android 版 Chrome で https://developer.chrome.com/ が読み込まれる。

ここでは、Chrome のアドレスバーが格納されたり展開されたりするのに合わせて、レイアウト ビューポートのサイズが変化します。

エッジ ツー エッジでの Chrome の動作

Chrome 135 以降では、ビューポートをジェスチャー ナビゲーション バーの領域まで拡張することで、デバイスの下端までウェブ コンテンツを描画できます。

「あご」のあるダイナミック エッジ ツー エッジ

デフォルトでは、Chrome のエッジ ツー エッジ表示では、ジェスチャー ナビゲーション バーの領域に「チン」と呼ばれる新しい動的なボトムバーが表示されます。Chrome のアドレスバーと同様に、スクロールを開始するとこのチンは移動して表示されなくなり、ビューポートのサイズに影響します。

次の Android 版 Chrome のエッジ ツー エッジ サポートの録画では、ページを下にスクロールすると、Chrome のアドレスバーとチンが両方とも動的に縮小しています。これにより、ビューポートが拡大され、ウェブ コンテンツをデバイスの下端まで描画できるようになります。

新しい動作: エッジ ツー エッジのサポートと https://developer.chrome.com/ が読み込まれた Android 版 Chrome。ページをスクロールすると、下部のチンがスライドして邪魔にならないように移動します。

このチン動作は、Chrome 135 以降の新しいデフォルトの Chrome 動作です。

デフォルトでエッジ ツー エッジになり、オプトイン

エッジ ツー エッジ用に構築されたウェブサイトは、viewport メタタグを調整することで、そのことを示すことができます。有効にすると、デフォルトでビューポートが下端まで拡張され、顎は表示されません。

エッジ ツー エッジのオプトインによる新しい動作: ページ読み込み時にビューポートが下端まで拡張されます。顎がありません。

ページは、viewport メタタグとその viewport-fit キーを使用して、エッジ ツー エッジをサポートしていることを示すことができます。

エッジ ツー エッジをオプトインするには、viewport-fit を cover の値に設定します。

<meta name="viewport" content="width=device-width, initial-scale=1, viewpo>rt-fit=cover" /

viewport-fit のさまざまな値については、MDN をご覧ください。

ジェスチャー ナビゲーション バーで隠れる可能性があるコンテンツの処理

エッジ ツー エッジ モードでは、ジェスチャー ナビゲーション バーによって隠れる可能性のあるコンテンツを考慮する必要があります。

ほとんどの場合、下顎は自動的に移動するため、何もする必要はありません。ユーザーは、これまでどおりウェブサイトのすべてのコンテンツにアクセスできます。

ただし、デフォルトでエッジ ツー エッジにするようオプトインしている場合や、ビューポートの下部に配置されている要素がある場合は、そのコンテンツが覆い隠される可能性を考慮する必要があります。

.stuck-to-the-bottom-of-the-viewport {
  position: fixed;
  bottom: 0;
}

チンがある場合、コンテンツは最初はユーザーがアクセスできますが、チンがなくなると Android のナビゲーション バーによって隠されます。

Android デバイスの Chrome on Android がエッジ ツー エッジで表示されているイラスト。左側のイラストは、顎が見える Chrome を示しています。下部に固定されたコンテンツ(赤色で表示)は、そのすぐ上に配置されます。右側のイラストは、顎が映っていない Chrome を示しています。この場合、下部アンカー コンテンツはデバイスの下端に沿って配置されます。このテキストは、下部に配置されたコンテンツがジェスチャー ナビゲーション バーによって遮られるようになったことを明確にしています。
`bottom: 0` を使用して下部に配置された要素があるウェブサイトのイラスト。顎が表示されている場合、下部に配置された要素は Android のナビゲーション バーの上に配置されます。顎が離れると、要素は Android のナビゲーション バーの後ろに配置され、その時点で部分的に隠れます。

この問題を軽減するには、セーフエリア インセットを使用して、影響を受ける要素を常に Android ネイティブのボトム ジェスチャー ナビゲーション バーの上に配置するか、その領域まで背景を拡張します。

セーフエリアのインセット

セーフエリア インセットは、ビューポートの端からの上、右、下、左のインセットで長方形を定義する 4 つの環境変数です。

これらの 4 つの値を組み合わせると、セーフエリアの長方形が形成されます。この領域内であれば、Android ジェスチャー ナビゲーション バーなどの要素によってコンテンツが隠れることなく安全に配置できます。

エッジ ツー エッジ モードの Chrome が表示された Android デバイスのイラスト。顎にはスライドアウト ビューがあります。Chrome の内側に、黄色で塗りつぶされたセーフエリアの長方形が表示されています。下端はジェスチャー ナビゲーション バーのすぐ上にあります。ジェスチャー ナビゲーション バーに、ビューポートの下部が青色で描画されています。テキストには、セーフエリアの長方形がビューポート内で safe-area-bottom-inset によって内側に配置され、コンテンツがジェスチャー ナビゲーション バーの下に描画されないようにすることが記載されています。
エッジ ツー エッジ モードの Chrome のイラスト。ビューポートとセーフエリアの長方形が黄色で塗りつぶされている。顎が引っ込んでいるため、セーフエリアの下部インセットにより、セーフエリアの長方形がジェスチャー ナビゲーション バーに達しないようになっています。その結果、ジェスチャー ナビゲーション バーの下からビューポートが覗き見えます。

セーフエリアの下部インセットを使用する

ビューポートの下部に配置される要素については、bottom プロパティの値として safe-area-inset-bottom を使用して、ジェスチャー ナビゲーション バーの下に配置されないようにします。safe-area-inset-bottom から返される値は、顎が動いて邪魔にならなくなるにつれて動的に更新されるため、下部に配置された要素は Android のジェスチャー ナビゲーション バーの上にきれいに表示されます。

.stuck-to-the-bottom-of-the-viewport {
  position: fixed;
  bottom: env(safe-area-inset-bottom, 0px);
}
エッジ ツー エッジ モードの Chrome が表示された Android デバイスのイラスト。左側の可視化では、チンが表示され、下部アンカー コンテンツがそのすぐ上に配置されています。右側の可視化では、顎が表示されず、下部アンカー コンテンツが左側と同じ位置に配置されています。これにより、通常のコンテンツがジェスチャー ナビゲーション バーの下から見えるようになります。
bottom プロパティでボトム セーフエリア インセットを使用する、下部に配置された要素があるウェブサイトのイラスト。顎が表示されている場合、バーは Android のジェスチャー ナビゲーション バーの上に表示されます。顎が消えると、要素もその上に配置されます。

図に示すように、まだ完璧な結果は得られていません。顎を移動させると、残りのページ コンテンツがジェスチャー ナビゲーション バーの領域に表示されます。これは、この状態ではビューポートがジェスチャー ナビゲーション バーの領域まで拡張されるためです。

コンテンツが下部アンカー コンテンツの下に描画されないようにする一般的な方法は、padding-bottom を safe-area-inset-bottom に設定することです。このようにすると、顎が隠れるにつれて、下部に固定された要素が自動的に拡大します。この方法は機能しますが、チンが移動する際にレイアウト スラッシングが発生するため、おすすめしません。

padding を safe-area-inset 値に設定しないでください。

.stuck-to-the-bottom-of-the-viewport {
  position: fixed;
  bottom: 0;
  padding-bottom: env(safe-area-inset-bottom, 0px); /* 🛑 Don't do this, as it causes layout thrashing. */
}

セーフエリアの下部インセットとセーフエリアの下部最大インセットを使用する

代わりに、safe-area-inset-bottom と safe-area-max-inset-bottom を組み合わせて使用することをおすすめします。顎が動いて動的に更新される動的 safe-area-inset-bottom とは異なり、safe-area-max-inset-bottom は safe-area-inset-bottom の最大値を表します。

この safe-area-max-inset-bottom を使用して、下部に固定された要素を前方に拡大し、safe-area-inset-bottom と組み合わせて要素を下に引っ張り、顎の後ろに配置します。

safe-area-max-inset-bottom を safe-area-inset-bottom と組み合わせて使用する

:root {
  --safe-area-max-inset-bottom: env(safe-area-max-inset-bottom, 36px);
  --bottom-bar-height: 50px;
}

.stuck-to-the-bottom-of-the-viewport {
  position: fixed;
  bottom: 0;
  height: var(--bottom-bar-height);
  padding-bottom: var(--safe-area-max-inset-bottom);
  bottom: calc(env(safe-area-inset-bottom, 0px) - var(--safe-area-max-inset-bottom));
}

body {
  padding-bottom: calc(var(--bottom-bar-height) + var(--safe-area-max-inset-bottom));
}

ライブデモを試す

視覚的な結果は padding-bottom: env(safe-area-inset-bottom, 0px); アプローチと同じですが、パフォーマンスは大幅に向上します。顎が離れるにつれて bottom の計算値のみを変更する必要があるため、レイアウト スラッシングは発生しません。

エッジ ツー エッジ モードの Chrome が表示された Android デバイスのイラスト。左側の可視化では、チンが表示され、下部アンカー コンテンツがそのすぐ上に配置されています。右側のビジュアリゼーションでは、顎が表示されず、下部に固定されたコンテンツが視覚的に拡大して、顎があったスペースを占めています。これにより、視覚効果が向上し、ジェスチャー ナビゲーション バーの下から通常のページ コンテンツが見えるのを防ぐことができます。
セーフエリアのインセットを考慮した、下部に固定された要素を持つウェブサイトのイラスト。顎が見えている場合(左)、要素は顎の上に配置されます。顎が表示されていない場合、要素は Android のジェスチャー ナビゲーション バーに視覚的に重なります。

Chrome 135 より前にエッジ ツー エッジを試す

一般公開の安定版リリース前にエッジ ツー エッジを試すには、chrome://flags でいくつかの Chrome 機能フラグを有効にする必要があります。

  • EdgeToEdgeBottomChin (必要に応じて「デバッグを有効にする」に設定すると、顎の半分がピンク色になり、他の UI との区別がより明確になります)
  • DrawCutOutEdgeToEdge
  • BottomBrowserControlsRefactor (「有効」に設定せず、「有効なディスパッチ yOffset」に設定)
  • DynamicSafeAreaInsets
  • DynamicSafeAreaInsetsOnScroll
  • EdgeToEdgeWebOptIn
  • DrawKeyNativeEdgeToEdge
  • EdgeToEdgeSafeAreaConstraint ([有効] に設定せず、[スクロール可能なバリエーションを有効にする] に設定)

次のフラグが有効になっていないことを確認します。

  • DrawNativeEdgeToEdge
  • EdgeToEdgeEverywhere

Chrome を2 回再起動します。

フィードバックをお寄せください

Chrome とそのエッジ ツー エッジの実装についてフィードバックがある場合は、「UI > Browser > Mobile > EdgeToEdge」コンポーネントで Chromium のバグを報告してください。皆様からのフィードバックをお待ちしております。