CSS 스크롤 앵커링 모듈 레벨 1

W3C 워킹 드래프트,

이 버전:
https://www.w3.org/TR/2020/WD-css-scroll-anchoring-1-20201111/
최신 공개 버전:
https://www.w3.org/TR/css-scroll-anchoring-1/
에디터스 드래프트:
https://drafts.csswg.org/css-scroll-anchoring
이전 버전:
이슈 추적:
CSSWG 이슈 저장소
에디터:
Steve Kobes (Google)
Tab Atkins-Bittner (Google)
이 명세에 대한 수정 제안:
GitHub 에디터

요약

보이는 영역 위에 있는 스크롤 박스의 DOM 요소 변경은 사용자가 콘텐츠를 소비하는 도중 페이지가 움직이게 만들 수 있습니다.

이 명세는 앵커 노드의 위치를 추적하고 스크롤 오프셋을 조정하여 이러한 불편한 사용자 경험을 완화하는 메커니즘을 제안합니다.

이 명세는 또한 웹 개발자가 이러한 동작을 옵트아웃할 수 있는 API도 제안합니다.

CSS는 구조화된 문서(HTML 및 XML 등)가 화면, 종이 등에서 렌더링되는 방식을 기술하는 언어입니다.

이 문서의 상태

이 섹션은 이 문서가 공개된 시점의 상태를 설명합니다. 다른 문서가 이 문서를 대체할 수 있습니다. 현재 W3C에서 공개된 문서 목록과 이 기술 보고서의 최신 개정본은 W3C 기술 보고서 색인 https://www.w3.org/TR/에서 확인할 수 있습니다.

이 문서는 CSS 워킹 그룹에 의해 워킹 드래프트로 공개되었습니다. 워킹 드래프트로 공개되었다고 해서 W3C 회원의 승인임을 의미하지는 않습니다.

이 문서는 초안이며, 언제든지 업데이트, 교체 또는 폐기될 수 있습니다. 진행 중인 작업 외의 목적으로 이 문서를 인용하는 것은 적절하지 않습니다.

피드백은 GitHub에서 이슈를 작성해(권장) “css-scroll-anchoring” 명세 코드를 제목에 포함해서, 예시: “[css-scroll-anchoring] …코멘트 요약…”. 모든 이슈와 코멘트는 아카이브됩니다. 또는, 피드백은 (아카이브됨) 공개 메일링 리스트 www-style@w3.org로 보낼 수 있습니다.

이 문서는 2020년 9월 15일 W3C 프로세스 문서에 따라 관리됩니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에 의해 작성되었습니다. W3C는 그룹의 산출물과 관련하여 공개된 특허 공개 목록을 유지합니다; 해당 페이지에는 특허 공개 방법도 안내되어 있습니다. 특허가 실질적으로 필수적인 권리청구를 포함한다고 믿는 개별은 W3C 특허 정책 6절에 따라 정보를 공개해야 합니다.

1. 소개

오늘날 웹 사용자들은 뷰포트 외부에서 발생하는 변화로 인해 콘텐츠가 움직이면서 자주 방해를 받습니다. 예를 들어, 스크립트가 광고가 들어있는 iframe을 삽입하거나, 크기가 지정되지 않은 이미지가 느린 네트워크에서 로드될 때 등이 있습니다.

역사적으로 브라우저의 기본 동작은 이러한 변화가 발생할 때 절대적인 스크롤 위치를 유지하는 것이었습니다. 즉, 콘텐츠 이동을 방지하기 위해 웹페이지는 나중에 로드될 항목을 위해 페이지에 공간을 미리 예약할 수 있습니다. 실제로는 대부분의 웹사이트가 이를 일관되게 수행하지 않습니다.

스크롤 앵커링은 예기치 않은 콘텐츠 이동을 최소화하는 것을 목표로 합니다. 뷰포트 외부의 변화에 맞춰 스크롤 위치를 조정하여 이를 달성합니다.

설명서 문서는 스크롤 앵커링에 대한 비공식적인 개요를 제공합니다.

1.1. 값 정의

이 명세는 CSS 속성 정의 규약[CSS2]에서 따르며, 값 정의 문법[CSS-VALUES-3]에서 사용합니다. 이 명세에서 정의되지 않은 값 타입은 CSS Values & Units [CSS-VALUES-3]에서 정의됩니다. 다른 CSS 모듈과의 결합으로 이러한 값 타입의 정의가 확장될 수 있습니다.

속성별 값 정의에 나열된 값 외에도, 이 명세에서 정의된 모든 속성은 CSS-전체 키워드를 속성 값으로 허용합니다. 가독성을 위해 명시적으로 반복하지 않았습니다.

2. 설명

스크롤 앵커링은 레이아웃 변화에도 사용자가 문서를 보는 뷰를 안정적으로 유지하려고 시도합니다. 이는 DOM 노드( 앵커 노드 )를 선택해서 그 움직임을 기준으로 스크롤 위치 조정을 결정하는 방식으로 동작합니다.

그러나 스크롤 컨테이너가 현재 스냅된 요소에 맞춰져 있으면, ( [CSS-SCROLL-SNAP-1] 참조 ) 스크롤 앵커링은 재스냅에 의해 허용되는 조정으로 제한됩니다.

2.1. 앵커 노드 선택

스크롤 박스는 DOM 구조상 깊은 곳에 있고 중요한 DOM 노드로 우선시되거나, 최적 시야 영역의 블록 시작 가장자리와 가까운 앵커 노드를 선택하려고 합니다.

참고: 사용자 에이전트가 scroll-padding 속성을 지원하지 않는 경우, 스크롤 박스의 최적 시야 영역은 콘텐츠 영역과 동일합니다.

앵커 노드는 박스 중에서, 비-atomic inline 박스를 제외한 어떤 것이든 될 수 있습니다. 앵커 노드는 항상 후손이어야 하며, 스크롤 박스의 후손입니다. 경우에 따라 스크롤 박스가 앵커 노드를 선택하지 않을 수도 있습니다.

요소 C는 스크롤 박스 S의 스크롤 앵커 후보가 될 유효 후보입니다. 다음 조건을 모두 만족하면:

일부 요소는 앵커 선택 시 우선 후보로 간주됩니다:

  1. DOM 앵커 ( 문서의 포커스 영역의).

  2. find-in-page 사용자 에이전트 알고리즘의 현재 활성 선택 매치를 포함하는 요소. 매치가 여러 요소에 걸쳐 있으면, 첫 번째 해당 요소만 고려합니다.

우선 후보가 비-atomic inline 요소인 경우, 대신 가장 가까운 비-atomic inline 조상 요소를 우선 후보로 간주합니다.

스크롤 박스 S에 대한 앵커 노드 선택 알고리즘은 다음과 같습니다:
  1. Soverflow-anchor 속성의 계산값이 none인 요소와 연결된 경우, S에 대해 앵커 노드를 선택하지 않습니다.

  2. 그 외의 경우, 지정된 순서대로 각 우선 후보 PC에 대해, PC유효 후보인지 S에서 확인합니다. 그렇다면 앵커 노드로 선택하고 종료합니다.

  3. 그 외의 경우, S와 연결된 요소 또는 문서의 각 DOM 자식 N에 대해, 후보 검사 알고리즘N에 대해 S에서 수행하고, 앵커 노드를 선택하면 종료합니다.

후보 DOM 노드 N에 대해 스크롤 박스 S에서 후보 검사 알고리즘은 다음과 같습니다:
  1. N제외된 서브트리이거나, N완전히 잘림 상태라면 (S에서), 아무것도 하지 않습니다 (N 및 그 후손은 건너뜁니다).

  2. N완전히 보임 상태라면 (S에서), N을 앵커 노드로 선택합니다.

  3. N이 부분적으로 보임 상태라면:

    1. N의 각 DOM 자식 C에 대해, 후보 검사 알고리즘C에 대해 S에서 수행하고, 앵커 노드를 선택하면 종료합니다.

    2. N컨테이닝 블록인, DOM 부모가 N이 아닌 절대 위치 요소 A 각각에 대해, 후보 검사 알고리즘A에 대해 S에서 수행하고, 앵커 노드를 선택하면 종료합니다.

    3. N을 앵커 노드로 선택합니다. (이 단계에 도달하면, N의 후손 중에 적합한 앵커 노드가 없었던 것입니다.)

    참고: 더 깊은 노드를 우선시하면, 뷰포트 외부에서 앵커 노드 내부의 콘텐츠가 변경되어 스크롤 앵커링 조정 없이 가시 콘텐츠가 이동하는 가능성을 줄일 수 있습니다.

개념적으로, 모든 스크롤 박스의 스크롤 위치가 변경될 때마다 새로운 앵커 노드가 계산됩니다. (성능 최적화를 위해, 구현에서는 앵커 노드가 필요할 때까지 계산을 지연할 수 있습니다.)

DOM 노드 N제외된 서브트리입니다. 다음 조건 중 하나라도 충족하면:
DOM 노드 N은 스크롤 박스 S에서 완전히 보임 입니다. N스크롤 앵커링 바운딩 rect최적 시야 영역 내에 완전히 포함되어 있을 때입니다.
DOM 노드 N은 스크롤 박스 S에서 완전히 잘림 입니다. N스크롤 앵커링 바운딩 rect최적 시야 영역 밖에 완전히 있을 때입니다.
DOM 노드 N은 스크롤 박스 S에서 부분적으로 보임 입니다. N완전히 보임도 아니고, 완전히 잘림도 아닐 때입니다.
DOM 노드 N스크롤 앵커링 바운딩 rectN스크롤 가능 오버플로우 사각형입니다.

2.2. 스크롤 조정

앵커 노드가 선택된 경우, 앵커 노드가 이동할 때, 브라우저는 앵커 노드의 스크롤 앵커링 바운딩 rect의 블록 시작 가장자리의 이전 오프셋 y0와 현재 오프셋 y1를 계산합니다. 이 오프셋은 스크롤러의 블록 흐름 방향에서 스크롤 콘텐츠의 블록 시작 가장자리 기준입니다.

그 후 y1 - y0 만큼의 스크롤 위치 조정이 블록 흐름 방향으로 큐에 쌓이고, 억제 윈도우가 끝날 때 수행됩니다.

스크롤 조정은 [CSSOM-VIEW]에서 정의된 [[cssom-view-1#scrolling-events#scrolling]]의 한 종류이며, 거기서 설명된 방식대로 scroll 이벤트를 생성합니다.

2.2.1. 억제 윈도우

앵커 노드의 모든 이동은 억제 윈도우라 불리는 시간창 내에서 발생하며, 다음과 같이 정의됩니다:

참고: 억제 윈도우의 경계는 스크롤 앵커링 API가 안정화되면 HTML 표준에 통합되어야 합니다.

하나의 억제 윈도우 내에서 여러 번의 앵커 노드 이동이 발생할 수 있습니다.

억제 윈도우 끝에서, 사용자 에이전트는 윈도우 동안 큐에 쌓였지만 억제 트리거로 억제되지 않은 모든 스크롤 조정을 수행합니다.

2.2.2. 억제 트리거

억제 트리거는 앵커 노드 이동에 대해, 해당 이동의 억제 윈도우 내에서 발생하면 스크롤 앵커링 조정을 억제하는 동작입니다. 트리거는 다음과 같습니다:

참고: 억제 트리거는 스크롤 이벤트 핸들러에서 콘텐츠 이동으로 인해 스크롤 앵커링과 부정적 상호작용이 있는 기존 웹 콘텐츠와의 호환성을 위해 존재합니다.

3. 제외 API

스크롤 앵커링은 출시 시 기본 동작 모드가 되는 것을 목표로 하며, 사용자가 레거시 콘텐츠에서도 혜택을 받을 수 있도록 합니다. overflow-anchor는 웹페이지의 일부 또는 전체에서 스크롤 앵커링을 비활성화(옵트아웃)하거나, 앵커 노드 선택 알고리즘에서 DOM의 일부를 제외할 수 있습니다.

Name: overflow-anchor
Value: auto | none
Initial: auto
Applies to: 모든 요소
Inherited: 아님
Percentages: 해당 없음
Computed value: 지정된 키워드
Canonical order: 문법에 따라
Animation type: 불연속적(discrete)

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

auto

이 요소가 자신이나 조상이 생성한 모든 스크롤 박스의 앵커 노드 선택 알고리즘에 참여할 자격이 있음을 선언합니다.

none

이 요소와 그 후손(다른 스크롤 요소에 중첩되어 있지 않은)은 자신이나 조상이 생성한 모든 스크롤 박스의 앵커 노드 선택 알고리즘참여 자격이 없음을 선언합니다.

참고: overflow-anchor: none 요소의 후손에 대해 스크롤 앵커링을 "다시 켜는" 것은 불가능합니다. 그러나 후손 스크롤 컨테이너는 (자신의 스크롤 박스에 대해) 자동으로 "다시 켜집니다" 단, 명시적으로 overflow-anchor: none이 설정된 경우는 제외입니다.

참고: overflow-anchor 속성은 (다른 값으로) CSS Sticky Scrollbars에도 제안된 바 있으며, 이는 현재 대체됨 상태입니다.

4. 개인정보 및 보안 고려사항

이 명세는 스크롤 위치 계산 방식만 조정할 뿐, 새로운 개인정보 또는 보안 고려사항을 도입하지 않습니다.

변경사항

2020년 2월 11일 워킹 드래프트 이후 변경점

준수성

문서 규칙

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

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

이 명세의 예시는 “for example”로 시작하거나 class="example"로 구분되어 있습니다. 예:

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

정보성 참고는 “Note”로 시작하며 class="note"로 구분되어 있습니다. 예:

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

권고 문구는 규범적 섹션으로 특별히 강조되며, <strong class="advisement">로 구분되어 있습니다. 예: UA는 접근 가능한 대안을 반드시 제공해야 합니다.

준수 클래스

이 명세에 대한 준수는 세 가지 준수 클래스로 정의됩니다:

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

스타일 시트가 이 명세에 준수하려면 이 모듈에서 정의된 문법과 각 기능의 개별 문법에 따라, 해당 모듈에서 사용하는 모든 구문이 유효해야 합니다.

렌더러가 이 명세에 준수하려면 적절한 명세에 정의된 대로 스타일 시트를 해석하는 것에 더해, 이 명세에서 정의한 모든 기능을 올바르게 파싱하고 문서를 그에 따라 렌더링해야 합니다. 다만, UA가 장치의 한계로 인해 문서를 올바르게 렌더링하지 못하더라도 비준수로 간주하지 않습니다. (예: UA는 흑백 모니터에서 색상을 렌더링할 필요는 없습니다.)

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

부분 구현

저자가 하위 호환 구문 규칙을 활용해 대체값을 지정할 수 있도록, CSS 렌더러는 반드시 지원 수준이 없는 at-규칙, 속성, 속성값, 키워드, 기타 구문 구조를 무효로 취급(그리고 적절하게 무시)해야 합니다. 특히, 사용자 에이전트는 선택적으로 지원되지 않는 구성값만 무시하고 지원되는 값만 적용하는 멀티값 속성 선언을 지원하면 안 됩니다: 어떤 값이라도 무효(지원되지 않는 값은 반드시 무효)로 간주되면, CSS는 전체 선언이 무시되도록 요구합니다.

불안정 및 독점적 기능의 구현

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

비실험적 구현

명세가 후보 권고 단계에 도달하면, 비실험적 구현이 가능해지며, 구현자는 명세에 따라 올바르게 구현됨을 입증할 수 있는 모든 CR 수준 기능에 대해 접두어 없는 구현을 출시해야 합니다.

CSS 구현 간의 상호운용성을 확립 및 유지하기 위해 CSS 워킹 그룹은 비실험적 CSS 렌더러가 구현 보고서(필요 시 해당 테스트 케이스도)를 W3C에 제출한 후 CSS 기능의 접두어 없는 구현을 출시할 것을 요청합니다. W3C에 제출된 테스트 케이스는 CSS 워킹 그룹이 검토 및 수정할 수 있습니다.

테스트 케이스 및 구현 보고서 제출에 대한 추가 정보는 CSS 워킹 그룹 웹사이트 https://www.w3.org/Style/CSS/Test/에서 확인할 수 있습니다. 문의는 public-css-testsuite@w3.org 메일링 리스트로 하면 됩니다.

인덱스

이 명세에서 정의된 용어

참조로 정의된 용어

참고 문헌

규범적 참고 문헌

[CSS-BOX-4]
Elika Etemad. CSS Box Model Module Level 4. 2020년 4월 21일. WD. URL: https://www.w3.org/TR/css-box-4/
[CSS-DISPLAY-3]
Tab Atkins Jr.; Elika Etemad. CSS Display Module Level 3. 2020년 5월 19일. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-OVERFLOW-3]
David Baron; Elika Etemad; Florian Rivoal. CSS Overflow Module Level 3. 2020년 6월 3일. WD. URL: https://www.w3.org/TR/css-overflow-3/
[CSS-POSITION-3]
Elika Etemad; et al. CSS Positioned Layout Module Level 3. 2020년 5월 19일. WD. URL: https://www.w3.org/TR/css-position-3/
[CSS-SCROLL-SNAP-1]
Matt Rakow; et al. CSS Scroll Snap Module Level 1. 2019년 3월 19일. CR. URL: https://www.w3.org/TR/css-scroll-snap-1/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS Box Sizing Module Level 3. 2020년 10월 23일. WD. URL: https://www.w3.org/TR/css-sizing-3/
[CSS-TRANSFORMS-1]
Simon Fraser; et al. CSS Transforms Module Level 1. 2019년 2월 14일. CR. URL: https://www.w3.org/TR/css-transforms-1/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2019년 6월 6일. CR. URL: https://www.w3.org/TR/css-values-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. 2019년 7월 30일. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011년 6월 7일. REC. URL: https://www.w3.org/TR/CSS21/
[CSSOM-VIEW]
Simon Pieters. CSSOM View Module. 2016년 3월 17일. WD. URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
S. Bradner. RFC에서 요구 수준을 표시하기 위한 키워드. 1997년 3월. Best Current Practice. URL: https://tools.ietf.org/html/rfc2119

속성 인덱스

이름 초기값 적용 대상 상속 %치 애니메이션 타입 정식 순서 계산된 값
overflow-anchor auto | none auto all elements no n/a 불연속적(discrete) 문법에 따라 지정된 키워드