画面の向き

W3C 作業草案

この文書の詳細
このバージョン:
https://www.w3.org/TR/2025/WD-screen-orientation-20251021/
最新の公開版:
https://www.w3.org/TR/screen-orientation/
最新の編集者ドラフト:
https://w3c.github.io/screen-orientation/
履歴:
https://www.w3.org/standards/history/screen-orientation/
コミット履歴
テストスイート:
https://wpt.live/screen-orientation/
編集者:
Marcos Cáceres (Apple Inc.)
前編集者:
Mounir Lamouri (Google Inc.)
Johanna Herman (招待専門家)
フィードバック:
GitHub w3c/screen-orientation (プルリクエスト, 新しい Issue, オープンな Issue)
ブラウザのサポート:
caniuse.com

概要

Screen Orientation 仕様は、デバイスの画面の向きの種類と角度を標準化し、 そのロックおよびロック解除の手段を提供する。この仕様で定義される API は、デバイスの画面の向きの現在の種類と角度を公開し、変更時にイベントを ディスパッチする。これにより、CSS と連携しながら、複数の画面の向きに対して Web アプリケーションがプログラム的にユーザー体験を適応できる。この API は、 ユーザーがデバイスを物理的に回転させても、画面の向き自体は変更させたくない コンピューターゲームなどのアプリケーションに特に有用である。API は、特定の ロック前条件 が満たされている場合にのみ、 画面の向きのロックを許可する。

この文書のステータス

このセクションは、本書が公開された時点でのステータスを説明します。現在の W3C の出版物一覧や、この技術レポートの最新版は、 W3C 標準および草案一覧 で確認できます。

本書は作業中の文書です。

本書は Web Applications Working Group によって、 勧告プロセス を用いて ワーキングドラフトとして公開されました。

ワーキングドラフトとしての公開は、W3C およびその会員による支持を意味するものではありません。

本書はドラフト文書であり、今後いつでも他の文書によって更新、差し替え、または廃止される可能性があります。進行中の作業以外のものとして本書を引用することは適切ではありません。

本書は W3C 特許ポリシーのもとで活動するグループによって作成されました。 W3C は、 グループの成果物に関連して提出された特許開示の公開リスト を管理しています。そのページには特許の開示方法も記載されています。ある者が必須特許請求項を含むと信じる特許を実際に知っている場合、 必須請求項 を含むと信じる場合は、 W3C特許ポリシー第6節 に従ってその情報を開示しなければなりません。

本書は 2025年8月18日 W3C プロセス文書 に従って管理されています。

1. 使用例

このセクションは規範的ではありません。

この例では、「Lock」ボタンを選択するとフルスクリーンへの移行を要求し、その後、画面を反対の向きにロックします。 「Unlock」ボタンを選択すると画面のロックが解除されます。

1: 特定の向きにロックし解除する
<script>
function updateLockButton() {
  const lockButton = document.getElementById("button");
  const newOrientation = getOppositeOrientation();
  lockButton.textContent = `Lock to ${newOrientation}`;
}

function getOppositeOrientation() {
  return screen
    .orientation
    .type
    .startsWith("portrait") ? "landscape" : "portrait";
}

async function rotate(lockButton) {
  if (!document.fullscreenElement) {
    await document.documentElement.requestFullscreen();
  }
  const newOrientation = getOppositeOrientation();
  await screen.orientation.lock(newOrientation);
  updateLockButton(lockButton);
}

screen.orientation.addEventListener("change", updateLockButton);

window.addEventListener("load", updateLockButton);
</script>

<button onclick="rotate(this)" id="button">
  ロックする...
</button>
<button onclick="screen.orientation.unlock()">
  アンロック
</button>

2. 概念

画面の向きをロックするとは、OrientationLockType orientation に対して、ユーザーが画面を特定の 画面の向き にしか回転できないようにすることを意味します。他の向きへの回転が制限される場合もあります。画面を回転できる向きは、ユーザーエージェント、ユーザーの設定、オペレーティングシステムの慣例、または画面自体によって決まります。例えば、 横向き にロックすると、ユーザーは画面を 横向き(主) やシステムが許せば 横向き(副) に回転できますが、 縦向き(副) には向きません。

画面の向きをアンロックするとは、エンドユーザーが、システムが許す任意の 画面の向き に自由に画面を回転できるようにすることを意味します。

2.1 画面の向きの種類

画面は、以下のいずれかの 画面の向き であるか、ロック されることがあります。

Any
ユーザーは、デバイスのオペレーティングシステムやエンドユーザーによって許可された任意の向きに画面を回転できます。
Default(アンロック時)
画面がアンロックされているとき(すなわち、有効な向きロックnullである場合)のデバイスのデフォルト挙動です。この向きは、デバイスのオペレーティングシステムやユーザーエージェント、エンドユーザー、あるいは インストールされたウェブアプリケーション によって決定されることがあります。例えば、画面の向きがアンロックされていてユーザーがデバイスを回転させた場合、一部のデバイスでは向きの変更が portrait-primarylandscape-primarylandscape-secondary のみ許可され、portrait-secondary にはならない場合があります。
Landscape
画面のアスペクト比の幅が高さより大きい状態です。
Natural
ユーザーエージェント、ユーザー、オペレーティングシステム、または画面自体によって決定されるデバイスディスプレイにとって最も自然な向きです。例えば、ユーザーの手でデバイスを立てて持ち、画面がユーザーに向いている状態です。コンピュータモニターは一般的に landscape-primary が自然な向きですが、携帯電話は多くの場合 portrait-primary が自然な向きです。
Portrait
画面のアスペクト比の高さが幅より大きい状態です。
Primary
デバイスの画面の自然な向き(portrait または landscape のいずれか)です。
Secondary
デバイスの画面のprimary向きとは逆の portrait または landscape です。

2.2 現在の画面の向きの種類と角度

出力デバイスの画面には、次の概念が関連付けられています:

アクティブな向きロック
画面がロックされている画面の向きOrientationLockTypeとして表される)、またはアンロック時はnull
現在の向きの角度
画面が自然な向きから反時計回りに回転している角度(度)。この角度は画面の向き値リストから導出されます。
現在の向きタイプ
画面の画面の向きOrientationTypeとして表される)。

下記の画面の向き値リストは、異なる自然な向きを持つ画面における各画面の向きタイプに関連付けられる角度を標準化します:

自然な縦向きの画面の場合:
自然な横向きの画面の場合:

3. Document インターフェースへの拡張

3.1 内部スロット

Document インターフェイスは、次の内部スロットで拡張されます:

内部スロット 説明
[[orientationPendingPromise]] null または Promise のいずれかです。 Promise が割り当てられている場合、そのプロミスは画面の向きをロックするリクエストを表します。

4. Screen インターフェースへの拡張

WebIDLpartial interface Screen {
  [SameObject] readonly attribute ScreenOrientation orientation;
};

Window オブジェクトには、関連付けられた ScreenOrientationがあり、これは Screenorientation オブジェクト(すなわち ScreenOrientation インスタンス、window.screen.orientation)です。

5. ScreenOrientation インターフェース

WebIDL[Exposed=Window]
interface ScreenOrientation : EventTarget {
  Promise<undefined> lock(OrientationLockType orientation);
  undefined unlock();
  readonly attribute OrientationType type;
  readonly attribute unsigned short angle;
  attribute EventHandler onchange;
};

5.1 内部スロット

内部スロット 説明
[[angle]] 画面の最後に認識された現在の向きの角度(度単位)を、 unsigned short として 画面の向き値リストから導出して表します。
[[initialType]] 現在の向きタイプを、閲覧コンテキストが作成された時点での値として表します。
[[type]] 画面の最後に認識された現在の向きタイプOrientationType 列挙値として表します。

5.2 lock() メソッド

ロック前条件 は、画面の向きのロックを許可する前に ユーザーエージェントMAY 課すことができる任意の要件である。 一般的なロック前条件には、ドキュメントがフルスクリーンモードであること、またはインストール済みのウェブアプリケーションの一部であることなどが含まれる。具体例は 10. Web Application Manifest との相互作用 および 9. Fullscreen API との相互作用 を参照。

lock() メソッドが OrientationLockType orientation を指定して呼び出されたとき、ユーザーエージェントMUST 次の手順を実行する。

  1. document を、this関連グローバルオブジェクト関連付けられた Document とする。
  2. 共通の安全性チェックdocument に対して実行する。例外スロー された場合は、その例外で 拒否されたプロミス を返し、これらの手順を中止する。
  3. もし ユーザーエージェント が画面の向きを orientation にロックすることをサポートしていない場合は、 拒否されたプロミス( "NotSupportedError" DOMException)を返し、これらの手順を中止する。
  4. もし ユーザーエージェント が、画面の向きを ロック するために document とその関連する 閲覧コンテキストロック前条件 を満たすことを要求し、 その条件が満たされていない場合は、"NotAllowedError" DOMException拒否されたプロミス を返し、これらの手順を中止する。
  5. もし document[[orientationPendingPromise]]null でない場合、現在のロックのプロミスを拒否して無効化するdocument に対して "AbortError" で)。
  6. document[[orientationPendingPromise]]新しいプロミス に設定する。
  7. 向きロックを適用するorientationdocument に適用する。
  8. document[[orientationPendingPromise]] を返す。

5.3 unlock() メソッド

unlock() メソッドが呼び出されたとき、ユーザーエージェントMUST 次の手順を実行しなければなりません:

  1. documentthis関連グローバルオブジェクト関連付けられた Document を代入します。
  2. document共通安全性チェック を実行します。例外スロー された場合、その例外を再スローし、これらの手順を中止します。
  3. screen の アクティブな向きロックnull の場合、 undefined を返します。
  4. document[[orientationPendingPromise]]null でない場合、現在のロックプロミスを却下しnullにするdocument で "AbortError" で実行します。
  5. 向きロックを適用nulldocument で実行します。
: なぜ unlock() は Promise を返さないのか?

unlock() は Promise を返しません。なぜなら、これは デフォルトの画面の向き にロックすることと同義ですが、 ユーザーエージェント がその向きを知っている場合と知らない場合があるためです。そのため、ユーザーエージェント は新たな向きがどうなるか、あるいは実際に変化するかどうかすら予測できません。

5.4 共通の安全チェック

共通安全性チェックは、Document document に対して次の手順を実行します。

  1. もし documentユーザーの注目を受けているトップレベルのトラバーサブルの完全にアクティブな子孫 でない場合、スロー する "InvalidStateError" DOMException
  2. もし documentサンドボックス化された画面の向きロック閲覧コンテキスト・フラグ が設定されている場合、 スロー する "SecurityError" DOMException
  3. もし document可視性状態 が "hidden" の場合、スロー する "SecurityError" DOMException

5.5 type 属性

取得時、type 属性は this[[type]] を返します。

5.6 angle 属性

取得時、angle 属性は this[[angle]] を返します。

: angle の値は何を表すか?

5.7 onchange イベントハンドラ属性

onchange 属性は、イベントハンドラIDL属性です。 onchange イベントハンドラに対応し、 そのイベントハンドラのイベント型change です。

6. OrientationLockType 列挙型

WebIDLenum OrientationLockType {
  "any",
  "natural",
  "landscape",
  "portrait",
  "portrait-primary",
  "portrait-secondary",
  "landscape-primary",
  "landscape-secondary"
};

OrientationLockType 列挙型は、画面が潜在的に ロック され得る画面の向きを表します。

: 向きのサポート

7. OrientationType 列挙型

WebIDLenum OrientationType {
  "portrait-primary",
  "portrait-secondary",
  "landscape-primary",
  "landscape-secondary"
};

OrientationType 列挙値は、画面の現在の向きの種類を表すために使用されます。

8. アルゴリズム

8.1 ScreenOrientation オブジェクトの初期化

閲覧コンテキスト context が作成されるとき、ユーザーエージェントMUST 以下を実行しなければなりません:

  1. screenOrientationcontext関連付けられた ScreenOrientation にします。
  2. screenOrientation[[initialType]] 内部スロットを、画面の 現在の向きの種類 に初期化します。
  3. screenOrientation[[type]] 内部スロットを、画面の 現在の向きの種類 に初期化します。
  4. screenOrientation[[angle]] 内部スロットを、画面の 現在の向きの角度 に初期化します。

8.2 ドキュメントの現在のロックプロミスを拒否する

手順で、現在のロックプロミスを却下しnullにすることが Document documentDOMString exceptionName で要求された場合、ユーザーエージェントMUST 以下を実行しなければなりません:

  1. アサート: [[orientationPendingPromise]]null でないこと。
  2. promise に、document[[orientationPendingPromise]] を代入します。
  3. グローバルタスクをキューに追加します。DOM操作タスクソース上で document関連グローバルオブジェクトを用い、reject を使い promise を新しい exceptionNameDOMException で拒否します。
  4. document[[orientationPendingPromise]]null に設定します。

8.3 向きのロックを適用する

手順で 向きロックを適用することが OrientationLockType? orientationDocument document に対して要求された場合、 ユーザーエージェントMUST 以下の手順を実行しなければなりません:

  1. もし document完全にアクティブ でなくなった場合、かつ 並列処理中で、さらに [[orientationPendingPromise]]null でない場合は、現在のロックのプロミスを拒否して無効化するdocument に "AbortError" を指定)。
  2. topDocumentdocumentトップレベル・トラバーサブルアクティブなドキュメント とする。
  3. descendantDocs を、順序付き集合 で、 topDocument子孫ナビゲーブルアクティブなドキュメントを木構造順に並べたものとする。
  4. それぞれ docdescendantDocs の中で反復する:
    1. もし docdocument であれば、スキップする。
    2. もし doc[[orientationPendingPromise]]null であれば、スキップする。
    3. 現在のロックのプロミスを拒否して無効化するdoc に "AbortError" を指定)。
  5. 次のサブステップを 並列処理中に実行する:
    1. もし document完全にアクティブ でなくなり、 document[[orientationPendingPromise]]null でなければ、現在のロックのプロミスを拒否して無効化するdocument に "AbortError" を指定)、これ以降の手順を中止する。
    2. もし orientationnull なら、画面の向きをロック解除する
    3. それ以外の場合、プラットフォームの慣習に従い、orientation に画面の向きをロックしようと試み、ビューポートの描画方法を orientation に合わせて変更する。
    4. もしこの試行がユーザーによる設定済みの制限、プラットフォームの仕様、その他の理由で失敗した場合:
      1. 画面の 有効な向きロックnull に設定する。
      2. タスクをキューに追加する(DOM操作タスクソースに、 document関連グローバルオブジェクト を渡して):
        1. もし document[[orientationPendingPromise]]null でなければ、 現在のロックのプロミスを拒否して無効化するdocument に "NotSupportedError" を指定)。
        2. これ以降の手順を中止する。
      Note

      これは、ユーザーがスクリーンの向き変更をウェブアプリケーションから防ぐように設定している場合や、 ユーザーエージェントではなくプラットフォーム自体が指定した向きへの画面ロックを許可しない場合に発生します。 ユーザー設定や端末機能による違いがロック失敗の傾向に現れるため、フィンガープリンティングに利用される可能性がある点にも注意が必要です。

    5. 画面の 有効な向きロックorientation に設定し、 現在の向きタイプ現在の向き角度 を画面の向きの変更を反映するように更新する。
  6. グローバルタスクをキューに追加する(DOM操作タスクソースに、 document関連グローバルオブジェクト を渡して):
    1. promisedocument[[orientationPendingPromise]] とする。
      Note
    2. document[[orientationPendingPromise]]null に設定する。
    3. 画面の向き変更ステップtopDocument で実行する。
    4. もし promisenull でなければ、 resolvepromiseundefined で解決する。

8.4 画面の向きの変更

ユーザーエージェントが トップレベル・トラバーサブル の画面の向きが変更されたと判断した場合や、ユーザーが トップレベル閲覧コンテキスト を別の画面に移動した場合は、画面の向き変更ステップトップレベル・トラバーサブルアクティブなドキュメント に対して実行する。

画面の向き変更ステップDocument document 用)は以下の通り:

  1. もし documentユーザーの注目を受けているトップレベル・トラバーサブルの完全にアクティブな子孫 でない場合は、これらの手順を中止する。
  2. type および angle を画面の 現在の向きタイプおよび 現在の向き角度 とする。
  3. screenOrientationdocument関連グローバルオブジェクト関連付けられた ScreenOrientation とする。
  4. もし typescreenOrientation[[type]] に等しく、かつ anglescreenOrientation[[angle]] に等しい場合、これらの手順を中止する。
  5. グローバルタスクをキューに追加ユーザー操作タスクソースdocument関連グローバルオブジェクト を渡して)下記を実行:
    1. screenOrientation[[angle]]angle に設定する。
    2. screenOrientation[[type]]type に設定する。
    3. "change" イベントを screenOrientation に発火する
  6. descendantDocs順序付き集合として、 document子孫ナビゲーブルアクティブなドキュメント(あれば)を木構造順に並べたものとする。
  7. それぞれ docdescendantDocs で反復し、 画面の向き変更ステップdoc で実行する。

8.5 ページの表示状態の変更の処理

[HTML] の「可視状態を更新する」アルゴリズムは、画面の向き変更手順を実行します。

注記

8.6 ドキュメントのアンロードの処理

アンロードドキュメントクリーンアップ手順document で実行されるとき、ユーザーエージェントは MUST 次の手順を実行しなければなりません:

  1. もし documentトップレベル・トラバーサブルアクティブなドキュメント でなければ、これらの手順を中止する。
  2. 画面の向き完全ロック解除ステップdocument に対して実行する。

8.7 向きの完全なロック解除

画面の向きを完全にアンロックする手順 は、Document document に対して次の通りです:

  1. もし document[[orientationPendingPromise]]null でなければ、 現在のロックのプロミスを拒否して無効化するdocument に "AbortError")。
  2. topDocumentdocumentトップレベル・トラバーサブルアクティブなドキュメント とする。
  3. 向きロックを適用するnulltopDocument に適用する。

9. フルスクリーン API との相互作用

ユーザーエージェントは MUSTlock() の利用を シンプルなフルスクリーンドキュメントにのみ制限する ロック前条件 を課さなければならない。 この要件は、画面の向きロック権限に関するユーザーエージェントの挙動の違いによるフィンガープリンティングを防ぐためである。[fullscreen]

document がフルスクリーンを終了する際は、画面の向きを完全にロック解除する手順も実行される。[fullscreen]

10. Web アプリケーションマニフェストとの相互作用

Web Application Manifest 仕様は、ウェブアプリケーションが デフォルトの画面の向きorientation メンバーで設定できるようにします。

ユーザーエージェントは SHOULDインストール済みウェブアプリケーション が「fullscreen」display mode で表示されることをロック前条件として要求するべきです。

11. アクセシビリティに関する考慮事項

車椅子のアーム等にデバイスが固定された向きで設置されているユーザーがいる可能性があるため、画面の向きをロックする際にユーザーがデバイスを回転させることを前提とする開発者は、Web コンテンツアクセシビリティ ガイドライン (WCAG) 2.1Orientation 成功基準 を認識しておく必要があります。該当の基準は、コンテンツと機能が 画面の向き にかかわらず利用可能であることを 必須 としています。特定の向きが 重要 である場合、ウェブアプリケーションはユーザーに向きの要件を通知しなければなりません。

12. プライバシーおよびセキュリティに関する考慮事項

画面のタイプ角度は、フィンガープリンティングの潜在的な手段となり得ます。以下の緩和策は、端末の保持方法を明かさずユーザーのプライバシーを保護するとともに、 セカンダリの向きタイプや関連する角度がフィンガープリンティングに利用されることも防ぎます。

12.1 イベント配信の制限

ユーザーのプライバシー保護のため、向き変更イベントの配信にはいくつかの制限が課されます:

documentユーザーの注目を受けているトップレベル・トラバーサブルの完全にアクティブな子孫 であることが求められるのは、 向きイベントがシステムレベルで表示され、ユーザーの注目やキーボード入力などを受けられるウィンドウのドキュメントのみがイベントを受けることを保証するためです。 追加の可視性状態チェックは多層防御となります。これらの制限により、バックグラウンドタブ、隠れウィンドウ、最小化アプリケーションがフィンガープリンティング目的で向きデータを取得できなくなります。

12.2 フィンガープリンティング対策

フィンガープリンティングに対抗するために、ユーザーエージェントは特にプライバシー重視の環境(例えばプライベートブラウズモードなど)では、以下の保護策を SHOULD 実装すべきです:

  1. トップレベル・トラバーサブル の存続期間中、画面の自然な向きが [[initialType]] であるかのように動作する。
  2. type ゲッターで返す値は "portrait-primary" または "landscape-primary" に制限される。画面のアスペクト比によってどちらが返されるかが決まる。
  3. もし 現在の向きタイプ[[initialType]] と一致する場合は、 angle ゲッターは 0 を返し、それ以外の場合は 90 を返す。
  4. 画面の向きが変化するときは、 change イベントは 現在の向きタイプportrait から landscape へ、または逆にタイプが変化した場合のみ発火する。

13. 適合性

非規範と明記されたセクションに加えて、この仕様書中のすべての著作ガイドライン、図、例、および注記は非規範です。それ以外の内容はすべて規範となります。

この文書中のキーワード MAYMUST、および SHOULD は、 BCP 14 [RFC2119] [RFC8174] に記載されている通り、ここに示すようにすべて大文字で出現した場合に限り、その意味で解釈されます。

A. IDL インデックス

WebIDLpartial interface Screen {
  [SameObject] readonly attribute ScreenOrientation orientation;
};

[Exposed=Window]
interface ScreenOrientation : EventTarget {
  Promise<undefined> lock(OrientationLockType orientation);
  undefined unlock();
  readonly attribute OrientationType type;
  readonly attribute unsigned short angle;
  attribute EventHandler onchange;
};

enum OrientationLockType {
  "any",
  "natural",
  "landscape",
  "portrait",
  "portrait-primary",
  "portrait-secondary",
  "landscape-primary",
  "landscape-secondary"
};

enum OrientationType {
  "portrait-primary",
  "portrait-secondary",
  "landscape-primary",
  "landscape-secondary"
};

B. 索引

B.1 本仕様で定義された用語

B.2 参照で定義された用語

C. 謝辞

Christophe Dumez、Anne van Kesteren、Chundong Wang、Fuqiao Xue、 および Chaals McCathie Nevile に有益なコメントをいただいたことに感謝します。

本 API の初期設計への貢献に対し、Chris Jones および Jonas Sicking に特に感謝します。

D. 参考文献

D.1 規範的参考文献

[appmanifest]
Web Application Manifest。Marcos Caceres、Kenneth Christiansen、Diego Gonzalez-Zuniga、Daniel Murphy、Christian Liebel。W3C。2025年9月3日。W3C作業草案。URL: https://www.w3.org/TR/appmanifest/
[cssom-view]
CSSOM View Module。Simon Fraser、Emilio Cobos Álvarez。W3C。2025年9月16日。W3C作業草案。URL: https://www.w3.org/TR/cssom-view-1/
[dom]
DOM Standard。Anne van Kesteren。WHATWG。リビングスタンダード。URL: https://dom.spec.whatwg.org/
[fullscreen]
Fullscreen API Standard。Philip Jägenstedt。WHATWG。リビングスタンダード。URL: https://fullscreen.spec.whatwg.org/
[HTML]
HTML Standard。Anne van Kesteren、Domenic Denicola、Dominic Farolino、Ian Hickson、Philip Jägenstedt、Simon Pieters。WHATWG。リビングスタンダード。URL: https://html.spec.whatwg.org/multipage/
[infra]
Infra Standard。Anne van Kesteren、Domenic Denicola。WHATWG。リビングスタンダード。URL: https://infra.spec.whatwg.org/
[mediaqueries-5]
Media Queries Level 5。Dean Jackson、Florian Rivoal、Tab Atkins Jr.、Daniel Libby。W3C。2021年12月18日。W3C作業草案。URL: https://www.w3.org/TR/mediaqueries-5/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels。S. Bradner。IETF。1997年3月。Best Current Practice。URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words。B. Leiba。IETF。2017年5月。Best Current Practice。URL: https://www.rfc-editor.org/rfc/rfc8174
[WCAG21]
Web Content Accessibility Guidelines (WCAG) 2.1。Michael Cooper、Andrew Kirkpatrick、Joshue O'Connor、Alastair Campbell。W3C。2025年5月6日。W3C勧告。URL: https://www.w3.org/TR/WCAG21/
[WEBIDL]
Web IDL Standard。Edgar Chen、Timothy Gu。WHATWG。リビングスタンダード。URL: https://webidl.spec.whatwg.org/