Copyright © 2025 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
Screen Orientation 명세는 기기의 화면 방향의 유형과 각도를 표준화하고, 이를 잠그고 잠금 해제하는 수단을 제공합니다. 이 명세에서 정의된 API는 기기의 화면 방향의 현재 유형과 각도를 노출하고, 변경될 때 이벤트를 발생시킵니다. 이를 통해 웹 애플리케이션은 CSS와 함께 작동하여 여러 화면 방향에 맞게 사용자 경험을 프로그래밍 방식으로 적응시킬 수 있습니다. 이 API는 사용자가 기기를 물리적으로 회전시키지만 화면 방향 자체는 변경되지 않아야 하는 컴퓨터 게임과 같은 애플리케이션에 특히 유용합니다. API는 화면 방향 잠금을 특정 사전 잠금 조건이 충족된 경우에만 허용하도록 제한합니다.
이 절은 이 문서가 발행된 시점의 상태를 설명합니다. 현재의 W3C 발행물 목록과 이 기술 보고서의 최신 개정본은 W3C 표준 및 초안 색인에서 찾을 수 있습니다.
이 문서는 진행 중인 작업입니다.
이 문서는 웹 애플리케이션 워킹 그룹에서 권고 절차를 따라 워킹 드래프트로 발행하였습니다.
워킹 드래프트로 발행되었다고 해서 W3C 및 그 회원들의 승인을 의미하지는 않습니다.
이 문서는 초안이며 언제든지 다른 문서로 업데이트, 대체 또는 폐기될 수 있습니다. 진행 중인 작업 외의 목적으로 이 문서를 인용하는 것은 적절하지 않습니다.
이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성되었습니다. W3C는 그룹의 결과물과 관련하여 공개된 특허 목록을 유지합니다. 해당 페이지에는 특허 공개 방법에 대한 안내도 포함되어 있습니다. 특정 특허가 필수 청구항을 포함한다고 믿는 사람이 실제로 그 특허를 알고 있다면 W3C 특허 정책 6항에 따라 정보를 공개해야 합니다.
이 문서는 2025년 8월 18일 W3C 프로세스 문서의 적용을 받습니다.
이 절은 비규범적입니다.
이 예제에서 "Lock" 버튼을 선택하면 전체 화면으로 전환하도록 요청한 다음 화면을 반대 방향으로 고정합니다. "Unlock" 버튼을 선택하면 화면 잠금이 해제됩니다.
<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>
화면 방향을 고정한다는 것은 OrientationLockType orientation(으)로
화면을 고정한다는 의미이다. 화면은 오직 사용자가 특정 화면 방향으로만 회전할 수 있으며, 다른 방향으로는 회전이 제한될 수
있다. 화면이 회전될 수 있는 가능한 방향은 사용자 에이전트, 사용자 설정, 운영체제의 관례 또는 화면 자체에 의해 결정된다. 예를 들어, 가로 방향으로 고정하면, 사용자는 화면을 가로-주 방향 또는 시스템이 허용한다면 가로-보조 방향으로 회전할 수 있지만, 세로-보조 방향으로는 변경되지 않는다.
화면 방향을 해제한다는 것은 최종 사용자가 시스템이 허용하는 모든 화면 방향으로 자유롭게 화면을 회전할 수 있음을 의미한다.
화면은 다음의 화면 방향 중 하나에 있거나, 고정될 수 있습니다:
null인 경우)에 대한 기기의 기본
동작입니다. 이 방향은 기기의 운영체제, 사용자 에이전트, 최종 사용자에 의해 제어되거나, 또는 설치된 웹 애플리케이션에 의해 설정될 수 있습니다. 예를 들어, 화면
방향이 잠금 해제되어 있고 사용자가 기기를 회전시키면, 일부 기기는 방향 변환을 세로-주, 가로-주, 가로-보조로 제한할 수 있지만, 세로-보조로는 변경하지 않습니다.
출력 장치의 화면에는 다음과 같은 개념들이 연관되어 있습니다:
OrientationLockType으로 나타냅니다. 잠금 해제된 경우 null입니다.
OrientationType으로 나타냅니다.
아래의 화면 방향 값 목록은 서로 다른 자연스러운 방향을 가진 화면에 대하여 각 화면 방향 유형에 대응하는 각도를 표준화합니다:
Document 인터페이스는 다음과 같은 내부 슬롯으로 확장됩니다:
| 내부 슬롯 | 설명 |
|---|---|
| [[orientationPendingPromise]] |
null 또는 Promise 중 하나입니다. Promise가 할당된 경우,
해당 프로미스는 화면 방향 고정 요청을 나타냅니다.
|
WebIDLpartial interface Screen {
[SameObject] readonly attribute ScreenOrientation orientation;
};
Window 객체는 연관된
ScreenOrientation을 가진다.
이는 Screen의 orientation 객체(즉,
ScreenOrientation 인스턴스,
window.screen.orientation)이다.
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;
};
| 내부 슬롯 | 설명 |
|---|---|
| [[angle]] |
화면의 마지막으로 알려진 현재 방향 각도를 도(degree)
단위의 unsigned short 값으로 나타냅니다.
이 값은
화면 방향 값 목록에서
도출됩니다.
|
| [[initialType]] | 현재 방향 유형을 탐색 컨텍스트가 생성될 때의 값으로 나타냅니다. |
| [[type]] |
화면의 마지막으로 알려진 현재 방향 유형을 OrientationType
열거형 값으로 나타냅니다.
|
사전 잠금 조건은 화면 방향 잠금을 허용하기 전에 사용자 에이전트가 MAY 부과할 수 있는 선택적 요구 사항이다. 일반적인 사전 잠금 조건에는 문서가 전체 화면 모드여야 하거나 설치된 웹 애플리케이션의 일부여야 한다는 요구가 포함된다. 구체적인 예시는 10. 웹 애플리케이션 매니페스트와의 상호작용 및 9. Fullscreen API와의 상호작용을 참고하라.
lock() 메서드가
OrientationLockType
orientation과 함께 호출되면,
사용자 에이전트는
다음 단계를 MUST 수행해야 한다.
Document로 둔다.
NotSupportedError"
DOMException으로
거부된 프라미스를 반환하고 이 단계들을 중단한다.
NotAllowedError"
DOMException으로
거부된 프라미스를 반환하고 이 단계들을 중단한다.
[[orientationPendingPromise]]가
null이 아니라면, 현재 잠금 프라미스를 거부하고 무효화한다
document의
"AbortError"로.
[[orientationPendingPromise]]를
새 프라미스로 설정한다.
[[orientationPendingPromise]]를
반환한다.
unlock() 메서드가 호출되면, user agent는 MUST 다음 단계를 수행해야 한다:
Document로 둔다.
null이면,
undefined를 반환한다.
[[orientationPendingPromise]]가
null이 아니면, document의 현재 잠금 promise
거부 및 null 처리를
"AbortError"로 실행한다.
null을 document에 적용한다.
unlock()는 프로미스를 반환하지
않는다. 그 이유는 이것이 기본 화면 방향으로 고정하는 것과 동등한데, 이
기본 방향이 user agent에 의해 알 수 있을 수도 있고 아닐 수도 있기 때문이다. 따라서, user agent는
새로운 방향이 무엇이 될지, 심지어 방향이 바뀔지조차 예측할 수 없다.
공통 안전성
검사는 Document
document에 대해 다음 단계로 이루어진다:
InvalidStateError"
DOMException.
SecurityError" DOMException.
SecurityError" DOMException.
가져올 때, angle 속성은 this의
[[angle]]를 반환한다.
onchange 속성은
이벤트 핸들러 IDL 속성이며,
onchange
이벤트 핸들러를 위한 것이다. 이 때
이벤트 핸들러 이벤트 타입은
change이다.
WebIDLenum OrientationLockType {
"any",
"natural",
"landscape",
"portrait",
"portrait-primary",
"portrait-secondary",
"landscape-primary",
"landscape-secondary"
};
OrientationLockType 열거형은
화면이 잠길 수 있는 잠재적인 화면 방향들을 나타냅니다(lock될 수 있는 방향).
any"는 any를 나타냅니다.
natural"는 natural을 나타냅니다.
landscape"는 landscape를 나타냅니다.
portrait"는 portrait를 나타냅니다.
portrait-primary"는 portrait-primary를 나타냅니다.
portrait-secondary"는 portrait-secondary를 나타냅니다.
landscape-primary"는 landscape-primary를 나타냅니다.
landscape-secondary"는
landscape-secondary를 나타냅니다.
WebIDLenum OrientationType {
"portrait-primary",
"portrait-secondary",
"landscape-primary",
"landscape-secondary"
};
OrientationType 열거형 값들은 화면의
현재 방향 타입을 나타내는 데 사용됩니다.
portrait-primary"는 portrait-primary를 나타냅니다.
portrait-secondary"는 portrait-secondary를
나타냅니다.
landscape-primary"는 landscape-primary를 나타냅니다.
landscape-secondary"는 landscape-secondary를
나타냅니다.
browsing context context가 생성될 때, user agent는 MUST 다음을 수행해야 한다:
ScreenOrientation로 둡니다.
[[initialType]] 내부 슬롯을
화면의 현재 방향 타입으로 초기화합니다.
[[type]] 내부 슬롯을
화면의 현재 방향 타입으로 초기화합니다.
[[angle]] 내부 슬롯을
화면의 현재 방향 각도로 초기화합니다.
단계에서 현재 잠금 promise를 거부 및 null 처리해야 할 때, Document document와 DOMString
exceptionName이 주어지면, user agent는 MUST 다음을 수행해야 한다:
[[orientationPendingPromise]]가
null이 아님을 보장한다.
[[orientationPendingPromise]]로 둔다.
DOMException와 함께) 한다.
[[orientationPendingPromise]]를
null로 설정한다.
단계에서 방향 잠금을
적용해야 할 때,
OrientationLockType?
orientation을 Document document에 적용하려면,
user agent는 MUST 다음 단계를 수행해야 한다:
[[orientationPendingPromise]]가
null이 아니면, 현재 잠금 프라미스를 거부하고 무효화한다
document
에 대하여 "AbortError"와 함께.
[[orientationPendingPromise]]
가
null이면 continue.
AbortError"와 함께.
[[orientationPendingPromise]]
가 null이 아니라면, 현재 잠금 프라미스를 거부하고
무효화한다
document에
"AbortError"와 함께,
이 단계들을 중단한다.
null이면,
화면 방향 잠금을 해제한다.
null로 설정한다.
[[orientationPendingPromise]]
가 null이 아니면,
현재 잠금
프라미스를 거부하고 무효화한다
document에 대해
"NotSupportedError"와
함께.
사용자가 웹 애플리케이션이 화면 방향을 변경하는 것을 방지하는 환경설정을 적용했거나, 사용자 에이전트가 아닌 기본 플랫폼에서 해당 orientation으로의 화면 방향 잠금을 허용하지 않는 경우에 이런 일이 발생할 수 있습니다. 사용자 환경설정 혹은 플랫폼 능력치의 차이는 잠금 실패 행동의 패턴을 통해 지문 채집에 악용될 수 있으니 주의가 필요합니다.
[[orientationPendingPromise]]
값을 대입한다.
[[orientationPendingPromise]]
를 null로 설정한다.
null이 아니면,
resolve
promise를 undefined로 해결한다.
사용자 에이전트가 최상위 트래버서블의 화면 방향이 변경되었음을 감지하거나, 사용자가 최상위 브라우징 컨텍스트를 다른 화면으로 이동시키는 경우, 해당 화면 방향 변경 단계를 최상위 트래버서블의 활성 문서와 함께 실행한다.
화면 방향 변경 단계는
Document document에 대해 다음과 같다:
ScreenOrientation로 둔다.
[[type]]와 같고,
angle이 screenOrientation의
[[angle]]와 같다면,
이 단계들을 중단한다.
[[angle]]를
angle로 설정한다.
[[type]]
를 type로 설정한다.
[HTML]의 "visibility state 업데이트" 알고리즘은 화면 방향 변경 단계를 실행한다.
unloading document cleanup steps가 document에 대해 실행될 때마다, user agent는 MUST 다음 단계를 실행해야 한다:
화면 방향 완전 해제 단계는
Document document에 대해 다음과 같다:
[[orientationPendingPromise]]가
null이 아니라면, 현재 잠금 프라미스를 거부하고 무효화한다
document에 대해
"AbortError"와 함께.
null을
topDocument에 실행한다.
사용자 에이전트는 MUST lock()의 사용을
단순 전체 화면 문서로 제한해야 하며, 이는 사전 잠금 조건이다.
이 요구 사항은 화면 방향 잠금 권한에 관한 사용자 에이전트의 동작 차이로 인한 지문 채집을 방지하기 위한 것이다. [fullscreen]
문서가 전체 화면을 종료할 때, 화면 방향 완전 잠금 해제 단계도 실행된다. [fullscreen]
Web Application Manifest 명세는 웹 애플리케이션이 기본 화면 방향을 orientation 멤버를 통해 설정할 수 있도록 허용한다.
user agent는 SHOULD 설치된 웹 애플리케이션이 "fullscreen" display mode로 표시되도록 요구해야 하며, 이는 사전 잠금 조건 중 하나이다.
사용자가 기기를 고정된 방향으로 장착할 수 있기 때문에(예: 휠체어 팔대에 장착), 개발자가 화면 방향을 잠글 때 사용자가 기기를 회전시키기를 기대하는 경우에는 Web Content Accessibility Guidelines (WCAG) 2.1의 Orientation Success Criterion을 인지해야 합니다. 이 기준은 콘텐츠와 기능이 화면 방향에 관계없이 이용 가능해야 한다는 것을 필수적으로 규정합니다. 특정 방향이 필수적인 경우, 웹 애플리케이션은 사용자가 필요한 방향 요구사항을 고지해야 합니다.
화면의 type과 angle은 잠재적인 지문 채집 벡터입니다. 다음과 같은 완화 방안은 사용자의 프라이버시를 보호하기 위해 기기가 어떻게 들려있는지 노출하지 않으며, secondary 방향 유형 및 관련 각도가 지문 채집에 사용되는 것을 방지합니다.
사용자 프라이버시를 보호하기 위해, 방향 변경 이벤트는 여러 전달 제한을 받습니다:
문서가 사용자 주의가 있는 최상위 트래버서블의 완전히 활성화된 자손이어야 한다는 요구 사항은 방향 이벤트가 시스템 수준에서 보기 가능하며 사용자의 주의(포커스 또는 키 입력 등)를 받는 윈도우에만 전달되도록 보장합니다. 추가적인 가시성 상태 검사는 심층 방어를 제공합니다. 이러한 제한 덕분에 백그라운드 탭, 숨겨진 창, 최소화된 애플리케이션이 지문 채집 목적의 방향 데이터를 수집하는 것을 방지합니다.
지문 채집을 막기 위해, 사용자 에이전트는 특히 프라이버시에 민감한 환경(예: 비공개 브라우징 모드)에서 다음 보호 기능을 SHOULD 구현해야 합니다:
[[initialType]]인 것처럼 동작합니다.
type getter의 반환값을
"portrait-primary" 또는
"landscape-primary"로 제한합니다.
화면 비율에 따라 둘 중 무엇이 반환될지 결정합니다.
[[initialType]]과 같으면,
angle getter를 위해 0을
반환하고,
그렇지 않으면 90을 반환합니다.
비규범적인 것으로 표시된 섹션뿐만 아니라, 이 명세서의 모든 작성 가이드라인, 다이어그램, 예시, 그리고 주석은 모두 비규범적입니다. 그 외의 모든 내용은 규범적입니다.
이 문서에서 MAY, MUST, SHOULD와 같은 핵심 용어는 BCP 14 [RFC2119] [RFC8174] 에서 설명된 대로, 오직 여기에 나온 것처럼 모두 대문자로 표기될 때에만 해당 의미로 해석되어야 합니다.
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"
};
angle 속성
(ScreenOrientation용)
§5.
[[angle]] 내부 슬롯
(ScreenOrientation용)
§5.1
"any"
(OrientationLockType의 열거값)
§6.
[[initialType]] 내부 슬롯
(ScreenOrientation용)
§5.1
"landscape"
(OrientationLockType의 열거값)
§6.
lock 메서드
(ScreenOrientation용)
§5.
"natural"
(OrientationLockType의 열거값)
§6.
onchange 속성
(ScreenOrientation용)
§5.
orientation 속성
(Screen용)
§4.
OrientationLockType 열거형
§6.
[[orientationPendingPromise]] 내부 슬롯
(Document용)
§3.1
OrientationType 열거형
§7.
"portrait"
(OrientationLockType의 열거값)
§6.
ScreenOrientation 인터페이스
§5.
type 속성
(ScreenOrientation용)
§5.
[[type]] 내부 슬롯
(ScreenOrientation용)
§5.1
unlock 메서드
(ScreenOrientation용)
§5.
Screen
인터페이스
Document 인터페이스
EventTarget 인터페이스
Document용)
EventHandler
Document용)
Document용)
Document용)
Window
인터페이스
list용)
AbortError 예외
DOMException 인터페이스
DOMString 인터페이스
[Exposed] 확장 특성
InvalidStateError 예외
NotAllowedError 예외
NotSupportedError 예외
Promise 인터페이스
[SameObject] 확장 특성
SecurityError 예외
undefined 타입
unsigned short 타입
유용한 의견을 주신 Christophe Dumez, Anne van Kesteren, Chundong Wang, Fuqiao Xue, 및 Chaals McCathie Nevile에게 감사드립니다.
이 API 초기 설계에 기여한 Chris Jones와 Jonas Sicking에게 특별히 감사드립니다.
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: