Keyboard Lock API による全画面モードの改善

Keyboard Lock API を使用して、全画面表示モードで Esc キーをキャプチャします。

全画面表示のウェブゲームで、ゲーム内のダイアログがポップアップ表示され、Esc キーで本能的にキャンセルしたことがある場合、全画面表示モードが終了した経験があるかもしれません。この煩わしい現象は、ダイアログ モードと全画面モードが Escape キーを奪い合うことで発生します。デフォルトでは全画面モードが常に優先されるため、この戦いは不公平です。では、Escape キーでダイアログを優先するにはどうすればよいでしょうか?ここで役立つのが Keyboard Lock API です。

全画面モードを終了するには、Esc キーを押します。

ブラウザ サポート

Browser Support

  • Chrome: 68.
  • Edge: 79.
  • Firefox: not supported.
  • Safari: not supported.

Source

Keyboard Lock API を使用する

Keyboard Lock API は navigator.keyboard. で利用できます。Keyboard インターフェースの lock() メソッドは、物理キーボードのキーの押下をキャプチャできるようにした後に、Promise を返します。このメソッドは、基盤となるオペレーティング システムによってアクセス権が付与されたキーのみをキャプチャできます。幸い、Esc キーもその 1 つです。

アプリに全画面モードがある場合は、全画面をリクエストするときに Escape キーをキャプチャして、Keyboard Lock API をプログレッシブ エンハンスメントとして使用します。Keyboard インターフェースの unlock() メソッドを使用して全画面モードを終了するときに、キーボードのロックを解除(つまり、キャプチャを停止)します。

// Feature detection.
const supportsKeyboardLock =
    ('keyboard' in navigator) && ('lock' in navigator.keyboard);

if (supportsKeyboardLock) {
  document.addEventListener('fullscreenchange', async () => {
    if (document.fullscreenElement) {
      // The magic happens here… 🦄
      await navigator.keyboard.lock(['Escape']);
      console.log('Keyboard locked.');
      return;
    }
    navigator.keyboard.unlock();
    console.log('Keyboard unlocked.');
  });
}

つまり、ユーザーが全画面モードのときに Escape キーを押すと、デフォルトでダイアログがキャンセルされます。Esc キーを長押しすると、全画面モードを終了できます。両方の利点を活かすことができます。

全画面モードを終了するには、Esc キーを長押しします。

デモ

デフォルトのバリエーションとプログレッシブ エンハンスメントのバリエーションの両方をデモでテストできます。デモのソースコードは、両方の動作を示す必要があるため、前のスニペットよりもクリーンではありません。

全画面表示モードのデモを改善。

実施中

このプログレッシブ エンハンスメントを実際に使用するには、前のスニペットをコピーします。既存の全画面コードでも、変更を必要とせずに動作するように設計されています。例として、ゲーム FreecivPR をご覧ください。PR が統合されたら、Escape キーを押してゲーム内のすべてのダイアログをキャンセルできます。

Freeciv ゲームにキーボード ロックを追加する GitHub pull リクエスト。

ボーナス ブックマークレット

全画面モードをサポートするアプリやゲームがすべてオープンソースであるとは限りません。また、パッチを受け入れるとも限りません。次のブックマークレットをブックマーク バーに追加してクリックすると、より優れた全画面モードを有効にできます。