ウィンドウ コントロール オーバーレイを使用してタイトル バー領域にコンテンツを表示する

デスクトップにインストールされているプログレッシブ Web アプリ (PWA) は、ウィンドウ コントロール オーバーレイ API を使用して、タイトル バーが通常配置されている場所にコンテンツを表示し、PWA をよりネイティブに感じさせることができます。

ウィンドウ コントロール オーバーレイ API は、次の処理を行います。

  • アプリのサーフェス領域全体に Web コンテンツを表示できます。
  • システムに必要な重要なウィンドウ コントロールをオーバーレイに移動します。
  • コンテンツでこのオーバーレイを回避できるようにします。

プログレッシブ Web アプリ (PWA) は、Web アプリのマニフェスト ファイル内の 表示 メンバーを使用して、モバイル プラットフォームでの表示方法を定義できます。 ただし、ネイティブのようなイマーシブなエクスペリエンスを作成するために、 デスクトップ PWA は別のアプローチを使用できます。

既定では、デスクトップにインストールされている PWA は、予約済みのタイトル バー領域のすぐ下から始まる領域にコンテンツを表示できます。

予約済みのタイトル バー領域の下にアプリ コンテンツが表示されていることを示している Windows の PWA アプリ

タイトル バーが通常配置されている場所にコンテンツを表示することで、PWA がよりネイティブに感じられるようになります。 Visual Studio Code、Microsoft Teams、Microsoft Edge などの多くのデスクトップ アプリケーションでは、既にこれが行われています。

Visual Studio Code は、タイトル バー領域にコンテンツを表示します

アプリでウィンドウ コントロール オーバーレイを有効にする

最初に、アプリの Web アプリ マニフェスト ファイルでウィンドウ コントロール オーバーレイ機能を有効にします。 これを行うには、マニフェスト ファイルで display_override プロパティを設定します。

{
  "display_override": ["window-controls-overlay"]
}

関連項目:

CSS 環境変数を使用して、オーバーレイを避けます

env() CSS 関数を使用して、ユーザーエージェントが定義した環境変数にアクセスできます。

ウィンドウ コントロール オーバーレイ機能により、次の 4 つの環境変数が追加されます。

変数 説明
titlebar-area-x ウィンドウの左側から、タイトル バーが通常占める領域からの距離 ( px)
titlebar-area-y ウィンドウの上側から、タイトル バーが通常占める領域からの距離 ( px)
titlebar-area-width タイトル バー領域の幅 (インチ) px
titlebar-area-height タイトル バー領域の高さ (単位) px

これらの環境変数を使用して、ウィンドウ コントロール オーバーレイ機能が無効になっている場合に、タイトル バーが通常表示される場所に独自のコンテンツを配置およびサイズ調整できます。

#title-bar {
  position: fixed;
  left: env(titlebar-area-x, 0);
  top: env(titlebar-area-y, 0);
  height: env(titlebar-area-height, 50px);
  width: env(titlebar-area-width, 100%);
}

position: fixed; を使用すると、タイトル バーは他のコンテンツと一緒にスクロールされず、代わりにウィンドウ コントロール オーバーレイと位置合わせが維持されます。

オーバーレイの場所と大きさを知ることは重要です。 オーバーレイがウィンドウの同じ側にあるとは限りません。macOS では、オーバーレイは左側にありますが、Windows では、オーバーレイは右側にあります。 また、オーバーレイのサイズが常に同じであるとは限りません。

env() CSS 関数は、ウィンドウ コントロール オーバーレイ機能が見つからないか無効になっている場合に、アプリ コンテンツの位置を定義するのに役立つ 2 番目のパラメーターを受け取ります。

領域をウィンドウのドラッグ ハンドルにする

タイトル バーを非表示にすると、システムクリティカルなウィンドウ コントロール ([ 最大化]、[ 最小化]、[ 閉じる]、 および [アプリ情報 ] アイコン) のみが表示されたままになります。 つまり、ユーザーがアプリケーション ウィンドウを移動できる領域がほとんどありません。

app-region CSS プロパティを使用すると、ユーザーがアプリをドラッグする方法を増やすことができます。 たとえば、アプリに独自のタイトル バーがある場合は、そのタイトル バーをウィンドウのドラッグ ハンドルに変えることができます。

#title-bar {
  position: fixed;
  left: env(titlebar-area-x, 0);
  top: env(titlebar-area-y, 0);
  height: env(titlebar-area-height, 50px);
  width: env(titlebar-area-width, 100%);
  app-region: drag;
}

オーバーレイの変更にReact

ユーザーは、アプリの実行中にタイトル バーを切り替えたり、ウィンドウの寸法を変更したりできます。 これらのことがいつ発生するかを把握することは、アプリにとって重要になる場合があります。 アプリでは、タイトル バーに表示されているコンテンツの一部を並べ替えたり、ページ上の別の場所でレイアウトを並べ替えたりする必要がある場合があります。

変更をリッスンするには、navigator.windowControlsOverlay オブジェクトの geometrychange イベントを使用します。 タイトル バーが表示されているかどうかを検出するには、navigator.windowControlsOverlay オブジェクトの visible プロパティを使用します。

geometrychange イベントは、ユーザーがウィンドウのサイズを変更するときに頻繁に発生します。 レイアウト変更コードが頻繁に実行されて、アプリでパフォーマンスの問題が発生しないようにするには、 debounce 関数を使用してイベントの処理回数を制限します。 スロットリングとデバウンスの違いを確認します。

const debounce = (func, wait) => {
  let timeout;
  return function executedFunction(...args) {
    const later = () => {
      clearTimeout(timeout);
      func(...args);
    };
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
  };
};

if ('windowControlsOverlay' in navigator) {
  navigator.windowControlsOverlay.addEventListener('geometrychange', debounce(e => {
    // Detect if the Window Controls Overlay is visible.
    const isOverlayVisible = navigator.windowControlsOverlay.visible;

    // Get the size and position of the title bar area.
    const titleBarRect = e.titlebarAreaRect;

    console.log(`The overlay is ${isOverlayVisible ? 'visible' : 'hidden'}, the title bar width is ${titleBarRect.width}px`);
  }, 200));
}

デモ アプリ

1DIV は、ウィンドウ コントロール オーバーレイ機能を使用する PWA デモ アプリです。

  1. Microsoft Edge で、新しいウィンドウまたはタブで 1DIV デモ アプリを開きます。

  2. アドレス バーで、[ 利用可能なアプリ] をクリックします。1DIV をインストールします ("利用可能なアプリ アプリ。1DIV のインストール」アイコン) ボタンをクリックします。 「 1DIVアプリのインストール」 ダイアログが開きます。

  3. [ インストール] ボタンをクリックします。 1DIVアプリが独自のウィンドウで開き、 アプリがインストール済み のダイアログが開きます。

    1DIVアプリが独自のウィンドウに表示され、「アプリがインストールされました」ダイアログが表示されます。

  4. ダイアログの 閉じ る (X) ボタンをクリックします。 (または、チェック ボックスをオンまたはオフにして、[ 許可 ] ボタンをクリックします。)

    アプリのタイトル バーには、少なくとも次のウィンドウ コントロールが含まれています。

    アイコン ヒント
    [設定など] アイコン 設定など
    [最小化] アイコン Minimize
    [復元] アイコン 復元
    [閉じる] アイコン Close

    アプリは、タイトル バーがあるとされたウィンドウ フレームの最上部までコンテンツを表示するようになりました。

    マップの上部領域は、ウィンドウの移動に使用できます

    アプリの上部領域はドラッグ ハンドルで、ユーザーがウィンドウを移動できるようにします。

このデモ アプリのソース コードは、 1DIV リポジトリにあります。

  • manifest.json ソース ファイルは、アプリによるウィンドウ コントロール オーバーレイ機能の使用を宣言します。

  • app.js ソース ファイルでは navigator.windowControlsOverlay オブジェクトが使用されます。

  • app.css ソース ファイルでは、titlebar-area-* CSS 環境変数が使用されます。

PWA をインストールせずにカスタム オーバーレイをプレビューする

Microsoft Edge DevTools の アプリケーション ツールでは、最初に PWA をインストールして WCO 機能を有効にすることなく、ウィンドウ コントロール オーバーレイ (WCO) 機能をシミュレートできます。 DevTools 内から WCO 機能をシミュレートすることで、改訂された PWA を再インストールするよりも早く、タイトル バー領域の CSS コードの変更をテストできます。

シミュレートされたオーバーレイは静止画像です。 CSS 変数 env(titlebar-area-left)env(titlebar-area-top)env(titlebar-area-width)env(titlebar-area-height) の値は、選択したプラットフォームに合わせて設定されます。

PWA をインストールせずにウィンドウ コントロール オーバーレイ API をシミュレートする」を参照してください。

関連項目

MDN:

ブログ:

YouTube:

デモ: