CSS 오버스크롤 동작 모듈 레벨 1

W3C 최초 공개 작업 초안,

이 버전:
https://www.w3.org/TR/2019/WD-css-overscroll-1-20190606/
최신 공개 버전:
https://www.w3.org/TR/css-overscroll-1/
에디터의 초안:
https://drafts.csswg.org/css-overscroll-1/
편집자:
(Google)
이 명세에 대한 수정 제안:
GitHub 에디터
이슈 추적:
GitHub 이슈

개요

이 모듈은 overscroll-behavior를 정의하여 스크롤 컨테이너의 스크롤 위치가 스크롤포트의 끝에 도달할 때의 동작을 제어합니다. 이를 통해 콘텐츠 작성자가 경계 기본 동작 (예: 스크롤 체이닝 및 오버스크롤)이 트리거되지 않도록 힌트를 줄 수 있습니다.

CSS는 구조화된 문서(HTML, XML 등)의 렌더링을 화면, 종이 등에서 기술하기 위한 언어입니다.

이 문서의 상태

이 섹션은 출판 당시 이 문서의 상태를 설명합니다. 다른 문서가 이 문서를 대체할 수 있습니다. 최신 W3C 출판물과 이 기술 보고서의 최근 버전 목록은 https://www.w3.org/TR/의 W3C 기술 보고서 색인에서 확인할 수 있습니다.

이 문서는 최초 공개 작업 초안입니다.

최초 공개 작업 초안으로 발행되었다고 해서 W3C 회원의 승인이나 지지를 의미하지 않습니다. 이 문서는 초안이며 언제든지 업데이트, 대체 또는 폐기될 수 있습니다. 진행 중인 작업 외의 용도로 이 문서를 인용하는 것은 부적절합니다.

이 명세에 대한 논의는 GitHub Issues를 사용하는 것이 좋습니다. 이슈 등록 시 제목에 “css-overscroll”이라는 텍스트를 포함해 주세요. 예시: “[css-overscroll] …코멘트 요약…”. 모든 이슈와 의견은 아카이브로 보관되며, 과거 아카이브도 있습니다.

이 문서는 CSS 작업 그룹에서 작성되었습니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹이 제작했습니다. W3C는 그룹 산출물과 관련된 특허 공개의 공개 목록을 유지합니다. 해당 페이지에는 특허 공개 방법도 안내되어 있습니다. 특정인이 필수 청구항이 포함된 특허를 실제로 알고 있다고 생각하는 경우, W3C 특허 정책 6절에 따라 정보를 공개해야 합니다.

이 문서는 2019년 3월 1일 W3C 프로세스 문서에 따라 관리됩니다.

1. 소개

이 섹션은 규범적이지 않습니다.

콘텐츠 작성자는 모든 스크롤 체이닝이 모든 스크롤 컨테이너에서 발생하길 원하지 않을 수 있습니다. 일부 스크롤 컨테이너컨테이닝 블록 체인의 일부일 수 있지만, 문서 내에서 다른 논리적 목적을 가지고 있고 스크롤이 스크롤 체인을 따라 계속되는 것을 막고 싶을 수 있습니다. 이를 위해 콘텐츠 작성자는 passive 플래그를 설정하지 않고 이벤트 리스너를 설치하며, 스크롤 체이닝이 발생할 위험이 있는 경우 preventDefault를 사용합니다. 이는 다음과 같은 이유로 바람직하지 않습니다:

따라서 콘텐츠 작성자가 스크롤 체이닝과 오버스크롤을 견고하고, 성능 면에서, 미래 호환적으로 제어하는 것은 불가능합니다. overscroll-behavior 속성은 이러한 문제를 해결합니다.

2. 동기 예시

고정 위치의 왼쪽 내비게이션 바는 스크롤 제스처가 거의 항상 문서를 스크롤하는 목적이 아니기 때문에 스크롤을 문서로 넘기고 싶지 않습니다. 네이티브 오버스크롤 피드백은 여전히 바람직하지만, 스크롤 체이닝은 방지되어야 합니다.
#sidebar {
  overscroll-behavior: contain;
}

이 경우, 작성자는 사이드바에 contain을 사용하여 스크롤이 상위 문서 요소로 체인되는 것을 방지할 수 있습니다.

한 페이지가 자체 풀-투-리프레시 효과를 구현하려고 하여 브라우저의 네이티브 오버스크롤 동작을 비활성화해야 하는 경우입니다.
html {
  /* 풀-투-리프레시만 비활성화하고 스와이프 내비게이션은 허용 */
  overscroll-behavior-y: contain;
}

이 경우, 작성자는 뷰포트 정의 요소에 contain을 사용하여 오버스크롤이 내비게이션 동작을 트리거하지 않도록 할 수 있습니다.

무한 스크롤러가 사용자가 경계에 도달할 때 더 많은 콘텐츠를 로드하므로, 스크롤 체이닝과 함께 혼란스러운 러버 밴딩 효과도 비활성화하고자 합니다.
#infinite_scroller {
  overscroll-behavior-y: none;
}

이 경우, 작성자는 무한 스크롤러에 none을 사용하여 스크롤 체이닝과 오버스크롤 피드백 모두를 방지할 수 있습니다.

3. 스크롤 체이닝 및 경계 기본 동작

운영체제는 스크롤 체이닝 및 오버스크롤 피드백과 같은 스크롤 규칙을 가지고 있습니다. 이 명세는 스크롤 체이닝이나 오버스크롤 피드백이 어떻게 구현되는지, 또는 구현 여부를 요구하지 않습니다. 이 명세는 구현된 경우, 콘텐츠 작성자가 이를 비활성화할 수 있도록만 합니다.

스크롤 체이닝이란 하나의 스크롤 컨테이너에서 상위 스크롤 컨테이너스크롤 체인을 따라 스크롤이 전파되는 것입니다. 일반적으로 스크롤 체이닝은 이벤트 타겟에서 시작해 컨테이닝 블록 체인을 따라 재귀적으로 진행됩니다. 이 체인에 있는 스크롤 컨테이너가 스크롤 이벤트나 제스처를 받으면 이를 처리하거나, 체인을 따라 상위로 넘길 수 있습니다. 체이닝은 스크롤포트가 경계에 도달했을 때 주로 발생합니다.

스크롤 체인은 하나의 스크롤 컨테이너에서 다른 컨테이너로 스크롤이 전파되는 순서를 의미합니다. 뷰포트는 문서의 스크롤 체이닝scrollingElement로서 참여하며, 스크롤 체인 내 위치와 적용되는 체이닝 규칙 모두에 해당됩니다.

스크롤 경계스크롤 컨테이너의 스크롤 위치가 스크롤포트의 끝에 도달한 상태를 의미합니다. 만약 스크롤 컨테이너가 스크롤 가능성이 없고, 스크롤 방향으로 overflow하지 않으면, 해당 요소는 항상 스크롤 경계에 있는 것으로 간주됩니다.

경계 기본 동작사용자 에이전트가 정의한 기본 동작으로, 스크롤이 스크롤포트의 끝에서 수행됩니다. 로컬 경계 기본 동작경계 기본 동작 중 페이지와 상호작용하지 않고, 예를 들어 오버스크롤 UI 피드백을 표시하는 것과 같이 스크롤 컨테이너 자체에서 수행되는 동작입니다. 반대로 비로컬 경계 기본 동작은 페이지와 상호작용하는 동작(예: 스크롤 체이닝 또는 내비게이션 동작)입니다.

4. 오버스크롤 동작 속성

오버스크롤 동작경계 기본 동작스크롤 컨테이너 요소의 스크롤포트가 스크롤 박스의 경계에 도달할 때 허용되는지를 제어합니다.

overscroll-behavior 속성은 오버스크롤 동작스크롤 컨테이너 요소에 대해 지정합니다. 콘텐츠 작성자가 스크롤 컨테이너 요소가 스크롤 체이닝 또는 오버스크롤 피드백을 방지해야 함을 지정할 수 있습니다.

스크롤 컨테이너가 아닌 요소는 이 속성 값을 받아들이지만 무시해야 합니다. 이 속성은 사용자 에이전트가 지원하는 모든 스크롤 방식에 적용되어야 합니다.

참고: 이 속성은 스크롤 체이닝 및 오버스크롤 방지에 대해 최소한 preventDefault만큼 강력한 보장을 제공해야 합니다. 그렇지 않으면 콘텐츠 작성자는 대신 preventDefault를 사용하게 됩니다.

Name: overscroll-behavior
Value: [ contain | none | auto ]{1,2}
Initial: auto auto
Applies to: 스크롤 컨테이너 요소
Inherited: 아님
Percentages: 해당 없음
Computed value: 개별 속성 참고
Canonical order: 문법 순서대로
Animation type: : 불연속적
Media: 시각적

overscroll-behavior 속성은 overscroll-behavior-xoverscroll-behavior-y에 지정된 값을 순서대로 설정하는 축약 속성입니다. 하나의 값만 지정되면, 두 번째 값은 동일한 값으로 기본 설정됩니다.

값의 의미는 다음과 같습니다:

contain
이 값은 해당 요소가 스크롤 체이닝이나 내비게이션과 같은 비로컬 경계 기본 동작을 수행하지 않아야 함을 의미합니다. 사용자 에이전트는 스크롤이 이 요소 또는 그 하위에서 발생했는지와 관계없이 스크롤 체인을 따라 상위로 스크롤 체이닝을 수행하지 않아야 합니다. 이 값은 로컬 경계 기본 동작(예: 오버스크롤 피드백 표시)의 동작에는 영향을 주지 않습니다.
none
이 값은 contain과 동일한 동작을 의미하며, 추가로 해당 요소에서 로컬 경계 기본 동작도(예: 오버스크롤 피드백 표시) 수행하지 않아야 합니다.
auto
이 값은 사용자 에이전트가 경계 기본 동작을 스크롤 체이닝, 오버스크롤, 내비게이션 제스처에 대해 통상적으로 수행해야 함을 의미합니다.

참고: 사용자 에이전트가 스크롤 체이닝과 오버스크롤 피드백을 구현하지 않는 경우, 준수 구현에서는 이러한 값이 부작용을 일으키지 않습니다.

참고: 프로그래밍 방식으로 스크롤되는 경우에는 스크롤이 클램프되며, 어떤 경계 기본 동작도 트리거되지 않습니다.

4.1. overscroll-behavior의 물리적 롱핸드

이름: overscroll-behavior-x, overscroll-behavior-y
값: contain | none | auto
초기값: auto
적용 대상: 스크롤 컨테이너 요소
상속: 아님
퍼센트값: 해당 없음
계산값: 지정한 대로
정규 순서: 문법 순서대로
애니메이션 타입: : 불연속적
미디어: 시각적

overscroll-behavior-x 속성은 가로 축에서의 오버스크롤 동작을 지정하며, overscroll-behavior-y 속성은 세로 축에서의 오버스크롤 동작을 지정합니다. 스크롤이 가로와 세로 축 모두에서 동시에 수행될 때, 각 축의 오버스크롤 동작은 독립적으로 고려되어야 합니다.

4.2. overscroll-behavior의 플로우 상대 롱핸드

이름: overscroll-behavior-inline, overscroll-behavior-block
값: contain | none | auto
초기값: auto
적용 대상: 스크롤 컨테이너 요소
상속: 아님
퍼센트값: 해당 없음
계산값: 지정한 대로
정규 순서: 문법 순서대로
애니메이션 타입: : 불연속적
미디어: 시각적

이 속성들은 overscroll-behavior-xoverscroll-behavior-y 속성에 대응합니다. 매핑 방식은 요소의 writing-mode에 따라 달라집니다.

5. 보안 및 프라이버시 고려사항

이 기능에는 알려진 보안 또는 프라이버시 영향이 없습니다. 이 기능은 오버스크롤 피드백이나 오버스크롤 내비게이션(예: 풀-투-리프레시, 스와이프 내비게이션)과 같은 일부 네이티브 UI 기능을 방지하는 데 사용될 수 있습니다. 그러나 이는 이미 플랫폼에서 이벤트의 기본 동작을 막는 등 가능한 범위를 넘어 추가적인 능력을 노출하지 않습니다.

적합성

문서 규칙

적합성 요구사항은 설명적 주장과 RFC 2119 용어의 조합으로 표현됩니다. 규범 부분에서 “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL” 등의 주요 단어는 RFC 2119에 명시된 대로 해석해야 합니다. 다만, 가독성을 위해 이 명세에서는 해당 단어들이 모두 대문자로 표기되지 않습니다.

이 명세의 모든 텍스트는 명시적으로 비규범으로 표시된 섹션, 예제, 참고를 제외하고 규범적입니다. [RFC2119]

이 명세의 예제는 “예를 들어”라는 문구로 도입되거나, class="example"로 규범 텍스트와 구분되어 표시됩니다. 예시:

이것은 정보성 예제입니다.

정보성 참고는 “참고”라는 단어로 시작하며, class="note"로 규범 텍스트와 구분되어 표시됩니다:

참고, 이것은 정보성 참고입니다.

권고문은 특별한 주의가 필요하도록 스타일링된 규범 섹션이며, 다른 규범 텍스트와 <strong class="advisement">로 구분되어 표시됩니다. 예: UA는 반드시 접근 가능한 대안을 제공해야 합니다.

적합성 클래스

이 명세에 대한 적합성은 세 가지 적합성 클래스로 정의됩니다:

스타일 시트
CSS 스타일 시트.
렌더러
UA는 스타일 시트의 의미를 해석하고 이를 사용하는 문서를 렌더링합니다.
저작 도구
UA는 스타일 시트를 작성합니다.

스타일 시트가 이 명세에 적합하려면, 이 모듈에서 정의된 문법을 사용하는 모든 선언이 일반 CSS 문법 및 각 기능의 개별 문법에 따라 유효해야 합니다.

렌더러가 이 명세에 적합하려면, 관련 명세에 정의된 대로 스타일 시트를 해석하는 것 외에도, 이 명세에서 정의된 모든 기능을 올바르게 구문 분석하고 문서를 적절히 렌더링해야 합니다. 단, UA가 디바이스의 한계로 인해 문서를 정확히 렌더링하지 못해도 UA가 비적합하다고 간주되지는 않습니다. (예: UA가 흑백 모니터에서 색상을 렌더링할 필요는 없음)

저작 도구가 이 명세에 적합하려면, 이 모듈의 일반 CSS 문법 및 각 기능의 개별 문법에 따라 문법적으로 올바른 스타일 시트를 작성하고, 이 모듈에서 설명된 스타일 시트의 기타 모든 적합성 요구사항을 충족해야 합니다.

CSS 책임 구현 요구사항

다음 섹션에서는 CSS를 책임 있게 구현하여 현재와 미래에 상호운용성을 높이는 여러 적합성 요구사항을 정의합니다.

부분 구현

작성자가 미래 호환 파싱 규칙을 활용해 대체 값을 지정할 수 있도록, CSS 렌더러는 지원되지 않는 모든 at-rule, 속성, 속성값, 키워드, 기타 구문 구조를 반드시 무효로 처리(그리고 적절히 무시해야 함)합니다. 특히, UA는 지원되지 않는 속성값을 선택적으로 무시하고, 하나의 다중값 속성 선언에서 지원되는 값만 적용해서는 안 됩니다: 어떤 값이라도 무효(지원되지 않는 값은 반드시 무효)로 간주될 경우, CSS는 전체 선언을 무시해야 함을 요구합니다.

불안정 및 독점 기능 구현

향후 안정적인 CSS 기능과 충돌을 피하기 위해 CSSWG는 모범 사례를 따를 것을 권장합니다. 불안정 기능 및 독점 확장 구현 시 참고 바랍니다.

CR-레벨 기능 구현

명세가 Candidate Recommendation 단계에 도달하면, 구현자는 명세에 따라 올바르게 구현할 수 있음을 입증할 수 있는 모든 CR-레벨 기능에 대해 접두어 없는 구현을 릴리스해야 하며, 해당 기능의 접두어 변형 노출은 피해야 합니다.

CSS의 구현 간 상호운용성 확보 및 유지를 위해 CSS 작업 그룹은 비실험적 CSS 렌더러가 접두어 없는 구현을 릴리스하기 전에 구현 보고서(필요시 구현 보고서에 사용된 테스트케이스 포함)를 W3C에 제출할 것을 요청합니다. W3C에 제출된 테스트케이스는 CSS 작업 그룹의 검토 및 수정 대상이 됩니다.

테스트케이스와 구현 보고서 제출에 대한 더 많은 정보는 CSS 작업 그룹 웹사이트 https://www.w3.org/Style/CSS/Test/에서 확인할 수 있습니다. 관련 문의는 public-css-testsuite@w3.org 메일링리스트로 보내주세요.

색인

이 명세에서 정의한 용어

참조로 정의된 용어

참고 문헌

규범적 참고 문헌

[CSS-OVERFLOW-3]
David Baron; Elika Etemad; Florian Rivoal. CSS Overflow Module Level 3. 2018년 7월 31일. WD. URL: https://www.w3.org/TR/css-overflow-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2019년 1월 31일. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 2018년 5월 24일. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997년 3월. Best Current Practice. URL: https://tools.ietf.org/html/rfc2119

속성 색인

이름 초기값 적용 대상 상속 %값 애니메이션 타입 정규 순서 계산값 미디어
overscroll-behavior [ contain | none | auto ]{1,2} auto auto 스크롤 컨테이너 요소 아님 해당 없음 : 불연속적 문법 순서대로 개별 속성 참고 시각적
overscroll-behavior-block contain | none | auto auto 스크롤 컨테이너 요소 아님 해당 없음 : 불연속적 문법 순서대로 지정한 대로 시각적
overscroll-behavior-inline contain | none | auto auto 스크롤 컨테이너 요소 아님 해당 없음 : 불연속적 문법 순서대로 지정한 대로 시각적
overscroll-behavior-x contain | none | auto auto 스크롤 컨테이너 요소 아님 해당 없음 : 불연속적 문법 순서대로 지정한 대로 시각적
overscroll-behavior-y contain | none | auto auto 스크롤 컨테이너 요소 아님 해당 없음 : 불연속적 문법 순서대로 지정한 대로 시각적