CSS 스크롤 스냅 모듈 레벨 2

W3C 최초 공개 작업 초안,

이 문서에 대한 추가 정보
이 버전:
https://www.w3.org/TR/2024/WD-css-scroll-snap-2-20240723/
최신 공개 버전:
https://www.w3.org/TR/css-scroll-snap-2/
편집자 초안:
https://drafts.csswg.org/css-scroll-snap-2/
변경 이력:
https://www.w3.org/standards/history/css-scroll-snap-2/
구현 보고서:
https://wpt.fyi/results/css/css-scroll-snap
피드백:
CSSWG 이슈 저장소
명세 내 인라인
편집자:
Tab Atkins-Bittner (Google)
Elika J. Etemad / fantasai (Apple)
Adam Argyle (Google)
이전 편집자:
Matt Rakow (Microsoft)
Jacob Rossi (Microsoft)
명세에 대한 수정 제안:
GitHub 편집자

요약

이 모듈은 “스냅 위치”를 사용하여 팬 및 스크롤 동작을 제어하는 기능을 포함합니다.

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

이 문서의 상태

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

이 문서는 CSS 작업 그룹에서 최초 공개 작업 초안으로 권고안 트랙을 사용하여 발행되었습니다. 최초 공개 작업 초안으로 발행되었다고 해서 W3C 및 회원의 승인이나 지지를 의미하지는 않습니다.

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

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

이 문서는 2023년 11월 3일 W3C 프로세스 문서에 의해 관리됩니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성되었습니다. W3C는 그룹 산출물과 관련하여 이루어진 특허 공개의 공개 목록을 유지합니다. 해당 페이지에는 특허 공개 방법에 대한 안내도 포함되어 있습니다. 개인이 필수 청구권(Essential Claim(s))이 포함되어 있다고 믿는 특허를 실제로 인지한 경우, W3C 특허 정책 6장에 따라 정보를 공개해야 합니다.

테스트 스위트와 구현 보고서는 CR 기간 중에 제작될 예정입니다.

1. 소개

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

현재 이 명세는 Scroll Snap 1에 대한 델타 명세입니다.

스크롤 경험은 항상 처음부터 시작되는 것이 아닙니다. 캐러셀, 스와이프 컨트롤, 리스트뷰와 같은 상호작용은 종종 스크롤 컨테이너의 시작 위치가 아닌 어떤 요소에서 시작하도록 의도됩니다. JavaScript를 사용하여 스크롤 컨테이너가 처음에 해당 요소로 스크롤되도록 해야 했습니다. CSS로 어떤 요소를 처음에 스크롤하도록 지정할 수 있게 하여, 사용자, 페이지 저자, 브라우저 모두가 이점을 얻을 수 있습니다.

초기 스크롤 대상을 설정하는 것뿐만 아니라, 개발자는 Scroll Snap에 대한 인사이트와 이벤트가 필요합니다. 어느 축에서 어떤 요소가 스냅되는지, 스냅 이벤트가 변경되는 시점, 스냅이 완료되는 시점, 그리고 자식 요소로 프로그래밍적으로 스냅하는 편의 기능 등과 같은 이벤트가 필요합니다.

1.1. 첫 번째 레이아웃

이 이벤트는 애니메이션 코드 경로를 따라야 합니다. 애니메이션 객체가 생성되어 이벤트를 발생시킬 때, 박스가 첫 번째 레이아웃을 가지는 시점입니다.

2. 동기부여 예시

캐러셀이 가운데 이미지에 스크롤된 상태로 시작되는 예시:
.carousel {
    overflow-inline: auto;
}
.carousel .origin {
    scroll-start-target: auto;
}
<div class="carousel">
    <img src="img1.jpg">
    <img src="img2.jpg">
    <img src="img3.jpg" class="origin">
    <img src="img4.jpg">
    <img src="img5.jpg">
</div>
사용자가 맨 위로 스크롤하면 검색창을 사용할 수 있는 예시:
.scrollport {
    overflow-block: auto;
}

main {
    scroll-start-target: auto;
}
<div class="scrollport">
    <nav>
        ...
    </nav>
    <main>
        ...
    </main>
</div>

3. 스크롤 시작 위치 설정

3.1. scroll-start-target 속성

3.1.1. 초기 스크롤 대상

initial scroll targetscroll container scrollcontainer의 요소 또는 가상 요소로, 'scroll-start-target’ 속성이 none이 아니고, 가장 가까운 scroll containerscrollcontainer인 경우입니다. 이러한 요소나 가상 요소가 여러 개 있을 경우, 사용자 에이전트는 트리 순서상 먼저 오는 것을 선택해야 합니다. 해당 요소나 가상 요소가 없을 경우, scrollcontainerinitial scroll target은 null입니다.

initial scroll targetscroll container에 대해 null이 아닌 경우, 다음 단계를 통해 initial scroll position을 결정해야 합니다:
  1. targetinitial scroll target으로 설정합니다. scrollcontainer에 대해.

  2. positionscroll-into-view position 결정의 결과로 설정합니다. target에 대해 behavior는 "auto", block은 "start", inline은 "nearest", 그리고 scrolling boxscrollcontainer로 합니다.

  3. scrollcontainerinitial scroll positionposition으로 설정합니다.

3.1.2. scroll-start-target 속성 정의

이름: scroll-start-target
값: [ none | auto ]
초기값: none
적용 대상: 모든 요소
상속 여부: 아니오
퍼센트 값: N/A
계산된 값: 개별 속성 참조
정규 순서: 문법에 따름
애니메이션 타입: 없음
none
이 요소는 initial scroll target이 아닙니다.
auto
이 요소는 가장 가까운 initial scroll target이 될 수 있습니다. 조상 scroll container에 대해.

3.1.3. place-content와의 상호작용

scroll containerinitial scroll positioncontent-distribution property와 하위 요소의 scroll-start-target에 의해 모두 잠재적으로 설정되는 경우, scroll-start-target이 우선합니다.

3.1.4. 첫 번째 레이아웃 이후 도착

문서가 업데이트되는 동안, scroll containerinitial scroll target이 해당 scroll container가 레이아웃된 후에 도착할 수 있습니다. 이 경우, 사용자 에이전트는 initial scroll target으로 여전히 스크롤해야 하며, 사용자 에이전트가 사용자가 더 이상 initial scroll position으로 스크롤하는 것에 관심이 없다고 판단할 이유가 없는 한 그렇습니다.

4. 스냅된 항목 스타일링

':snapped' 가상 클래스는 컨테이너 상태 쿼리 접근 방식으로 대체될 예정입니다.

4.1. 스냅된 요소 가상 클래스: :snapped

:snapped 가상 클래스는 축에 상관없이 모든 스크롤 스냅 타겟을 선택합니다. 물리적 및 논리적 장문의 가상 클래스 셀렉터는 개별 축을 타겟팅할 수 있기 때문에 보다 세분화된 스냅 자식 스타일링이 가능합니다.

더 구체적인 선택지는 아래와 같이 정의됩니다:

:snapped-x
가로 축에서 스냅된 자식을 선택합니다.
:snapped-y
세로 축에서 스냅된 자식을 선택합니다.
:snapped-inline
inline 축에서 스냅된 자식을 선택합니다.
:snapped-block
block 축에서 스냅된 자식을 선택합니다.

참고: 이슈 #6985
초기 프레임의 해상도 결정을 파악할 필요가 있습니다.

5. 스냅 이벤트

5.1. scrollsnapchangescrollsnapchanging

CSS 스크롤 스냅 포인트는 종종 스크롤 인터랙티브 "선택" 컴포넌트를 만들기 위한 메커니즘으로 사용됩니다. 선택은 JavaScript 교차점 관찰자와 스크롤 종료 추정으로 결정됩니다. 내장 이벤트를 만들면, 보이지 않는 상태가 적절한 순간에, 항상 정확하게 동작 가능한 상태가 됩니다.

5.1.1. 스냅 타겟

스냅 타겟은 사용자 에이전트가 선택하여 스냅 대상으로 삼은 스냅 컨테이너의 요소 또는 가상 요소입니다.

이벤트 인터페이스 타겟 설명
scrollsnapchange SnapEvent 스크롤 컨테이너 스크롤링 요소 또는 Document에서 스크롤 종료 시(scrollend 이벤트 직전), 또는 레이아웃 스냅 후 스크롤링 요소 또는 Document가 스냅된 스냅 타겟이 변경되었을 때 발생합니다.
scrollsnapchanging SnapEvent 스크롤 컨테이너 스크롤링 요소 또는 Document에서 스크롤 중(scroll 이벤트 직전), 스크롤로 인해 스크롤러가 스냅될 스냅 타겟이 마지막으로 발생한 scrollsnapchanging 이벤트에서 선택된 스냅 타겟과 다를 때 발생합니다.

5.1.2. scrollsnapchange

scrollsnapchange 이벤트는 스냅 컨테이너가 어느 축에서든 스냅된 영역이 변경되었음을 나타냅니다. scrollsnapchange 이벤트는 다음과 같은 경우에 발생합니다:

  1. 스크롤 작업이 완료될 때, block 또는 inline 축 중 하나라도 스냅 컨테이너가 스냅된 스냅 타겟이 최근에 해당 축에서 스냅된 스냅 타겟과 다르면 발생합니다. proximity 엄격도가 있는 스냅 컨테이너는 스크롤 결과로 더 이상 스냅 타겟에 스냅되지 않을 수 있습니다. CSS Scroll Snap 1 § 6.2 스냅 위치 선택는 UA가 스냅 영역 요소 또는 가상 요소 중 선택하는 방법을 설명합니다.
  2. 스냅 컨테이너의 스타일이 변경되어 none이 아닌 scroll-snap-type 값에서 none 값으로 또는 그 반대로 변경되는 경우.
  3. 레이아웃 변경 후, 스냅 컨테이너가 스냅된 스냅 타겟이 변경될 때(레이아웃 변경 후 스크롤 위치가 변경되지 않아도 해당).

스크롤 작업은 항상 scrollend 이벤트를 발생시킵니다. 만약 스크롤 작업이 scrollsnapchange 이벤트도 발생시키는 경우, scrollsnapchange 이벤트가 scrollend 이벤트 전에 발생해야 합니다.

Document대기 중인 scrollsnapchange 이벤트 타겟 목록을 가지고 있으며, 처음에는 비어 있습니다.

스냅 컨테이너에는 block 축과 inline 축에 대해 각각 scrollsnapchangeTargetBlockscrollsnapchangeTargetInline이 있으며, 해당 축에서 컨테이너가 스냅되지 않은 경우 null이거나, 스냅된 스냅 타겟입니다.

scrollsnapchange 타겟 업데이트를 요청받으면, 스냅 컨테이너 snapcontainer에 대해 다음 단계를 진행하세요:

  1. docsnapcontainer와 연결된 Document로 설정합니다.

  2. blockTargetscrollsnapchangeTargetBlock으로 설정합니다. snapcontainer에 연결된 값입니다.

  3. inlineTargetscrollsnapchangeTargetInline으로 설정합니다. snapcontainer에 연결된 값입니다.

  4. blockScrollSnapchangingTargetscrollsnapchanging block 축 타겟으로 설정합니다. snapcontainer에 연결된 값입니다.

  5. inlineScrollSnapchangingTargetscrollsnapchanging inline 축 타겟으로 설정합니다. snapcontainer에 연결된 값입니다.

  6. snap targets changed라는 불리언 플래그를 false로 초기화합니다.

  7. blockTarget스냅 타겟으로서 blockScrollSnapchangingTarget과 다르다면

    1. snapcontainer에 연결된 scrollsnapchangeTargetBlockblockScrollSnapchangingTarget으로 설정합니다.

    2. snap targets changed를 true로 설정합니다.

  8. inlineTarget스냅 타겟으로서 inlineScrollSnapchangingTarget과 다르다면:

    1. snapcontainer에 연결된 scrollsnapchangeTargetInlineinlineScrollSnapchangingTarget으로 설정합니다.

    2. snap targets changed를 true로 설정합니다.

  9. snap targets changed가 true라면:

    1. snapcontainerdoc대기 중인 scrollsnapchange 이벤트 타겟 목록에 이미 포함되어 있지 않다면:

      1. snapcontainerdoc대기 중인 scrollsnapchange 이벤트 타겟 목록에 추가합니다.

참고: 스크롤러에서(레이아웃 변경 또는 스크롤 작업으로 인해) 스냅이 발생할 때, 해당 스크롤러와 연결된 scrollsnapchanging block 축 타겟scrollsnapchanging inline 축 타겟은 업데이트되어 현재 스냅 타겟을 나타냅니다. 이로 인해 scrollsnapchange 타겟 업데이트 알고리즘에서 이 스냅 타겟을 사용해 scrollsnapchange 이벤트 발생 여부를 결정할 수 있습니다.

대기 중인 scrollsnapchange 이벤트 디스패치를 요청받으면, Document doc에 대해 다음 단계를 수행하세요:

  1. doc대기 중인 scrollsnapchange 이벤트 타겟 목록의 각 target에 대해:

    1. blockTargetinlineTarget를 처음에 null로 설정합니다.

    2. scrollsnapchangeTargetBlocktarget에 연결된 값이 가상 요소라면, blockTarget을 해당 scrollsnapchangeTargetBlock의 소유 요소로 설정합니다.

    3. 그렇지 않으면, blockTarget을 해당 scrollsnapchangeTargetBlock 값으로 설정합니다.

    4. scrollsnapchangeTargetInlinetarget에 연결된 값이 가상 요소라면, inlineTarget을 해당 scrollsnapchangeTargetInline의 소유 요소로 설정합니다.

    5. 그렇지 않으면, inlineTarget을 해당 scrollsnapchangeTargetInline 값으로 설정합니다.

    6. SnapEvent snapeventscrollsnapchange 이름으로 target에 발생시키고, snapeventsnapTargetBlocksnapTargetInline 속성을 각각 blockTarget, inlineTarget으로 설정합니다.

  2. doc대기 중인 scrollsnapchange 이벤트 타겟 목록을 비웁니다.

5.1.3. scrollsnapchanging

scrollsnapchanging 이벤트는 다음 상황에서 발생합니다:

스크롤 동작은 특정 위치로 애니메이션될 수 있습니다(예: 스크롤바 화살표 클릭, 방향키 입력, "behavior: smooth"로 프로그래밍된 스크롤) 또는 사용자의 입력을 직접 추적할 수 있습니다(예: 터치 스크롤, 스크롤바 드래그). 두 경우 모두, 사용자 에이전트는 선택한 각 축의 최종 스냅 대상에 대해, 스크롤러가 스크롤 동작이 의도한 스크롤 위치에 도달한 후 스냅하게 됩니다.

scrollsnapchanging 이벤트는 스크롤 동작으로 스냅 타겟이 변경될 것임을 웹 페이지에 가능한 한 빨리 알리기 위한 것입니다. 사용자 에이전트는 scrollsnapchanging 발생 여부를, 스크롤 동작이 의도된 위치에 도달했을 때 어떤 eventual snap target스냅될지에 따라 판단해야 합니다.

참고: scrollsnapchanging 이벤트는 미래의 스냅에 대한 힌트를 주므로, 해당 이벤트가 암시하는 스냅이 실제로 이루어지지 않을 수도 있습니다. 이후의 스크롤 입력에 따라 스냅 컨테이너의 스크롤 위치가 변경되어 다른 eventual snap target으로 이어질 수 있기 때문입니다.

scrollsnapchanging 이벤트는 scroll 이벤트보다 먼저 발생합니다.

Document대기 중인 scrollsnapchanging 이벤트 타겟 목록을 가지며, 처음에는 비어 있습니다.

스냅 컨테이너에는 block 축과 inline 축에 대해 각각 scrollsnapchanging block-axis targetscrollsnapchanging inline-axis target이 있으며, 해당 축에서 스냅하지 않으면 null이고, 그렇지 않으면 스냅 타겟입니다.

scrollsnapchanging 타겟 업데이트를 요청받으면, 스냅 컨테이너 snapcontainer스냅 타겟 newBlockTarget, 스냅 타겟 newInlineTarget이 주어질 때, 다음 단계를 실행하세요:

  1. docsnapcontainer와 연결된 Document로 설정합니다.

  2. blockTargetscrollsnapchanging block-axis target으로 설정합니다. snapcontainer에 연결된 값입니다.

  3. inlineTargetscrollsnapchanging inline-axis target으로 설정합니다. snapcontainer에 연결된 값입니다.

  4. newBlockTarget스냅 타겟으로서 blockTarget과 다르다면:

    1. snapcontainer에 연결된 scrollsnapchanging block-axis targetnewBlockTarget으로 설정합니다.

    2. snapcontainerdoc대기 중인 scrollsnapchanging 이벤트 타겟 목록에 이미 없다면,

      1. snapcontainerdoc대기 중인 scrollsnapchanging 이벤트 타겟 목록에 추가합니다.

  5. newInlineTarget스냅 타겟으로서 inlineTarget과 다르다면:

    1. snapcontainer에 연결된 scrollsnapchanging inline-axis targetnewInlineTarget으로 설정합니다.

    2. snapcontainerdoc대기 중인 scrollsnapchanging 이벤트 타겟 목록에 이미 없다면,

      1. snapcontainerdoc대기 중인 scrollsnapchanging 이벤트 타겟 목록에 추가합니다.

대기 중인 scrollsnapchanging 이벤트 디스패치를 요청받으면, Document doc에 대해 다음 단계를 수행하세요:

  1. doc대기 중인 scrollsnapchanging 이벤트 타겟 목록의 각 target에 대해:

    1. blockTargetinlineTarget을 처음에 null로 설정합니다.

    2. scrollsnapchanging block-axis targettarget에 연결된 값이 가상 요소라면, blockTarget을 해당 scrollsnapchanging block-axis target의 소유 요소로 설정합니다.

    3. 그렇지 않으면, blockTarget을 해당 scrollsnapchanging block-axis target 값으로 설정합니다.

    4. scrollsnapchanging inline-axis targettarget에 연결된 값이 가상 요소라면, inlineTarget을 해당 scrollsnapchanging inline-axis target의 소유 요소로 설정합니다.

    5. 그렇지 않으면, inlineTarget을 해당 scrollsnapchanging inline-axis target 값으로 설정합니다.

    6. SnapEvent snapeventscrollsnapchanging 이름으로 target에 발생시키고, snapeventsnapTargetBlocksnapTargetInline 속성을 각각 blockTarget, inlineTarget으로 설정합니다.

  2. doc대기 중인 scrollsnapchanging 이벤트 타겟 목록을 비웁니다.

5.1.4. 레이아웃 변경에 따른 스냅 이벤트

스냅 컨테이너 snapcontainer재스냅될 때, 다음 단계를 실행하세요:
  1. newBlockTarget스냅 타겟으로 설정합니다. snapcontainer가 block 축에서 스냅된 요소이거나, 어떤 요소에도 스냅되지 않았다면 null입니다.

  2. newInlineTarget스냅 타겟으로 설정합니다. snapcontainer가 inline 축에서 스냅된 요소 또는 가상 요소이거나, 해당되지 않으면 null입니다.

  3. scrollsnapchanging 타겟 업데이트 단계를 newBlockTargetnewInlineTarget을 인자로 실행하세요.

  4. scrollsnapchange 타겟 업데이트 단계를 snapcontainer에 대해 실행하세요.

5.2. SnapEvent 인터페이스

dictionary SnapEventInit : EventInit {
  Node? snapTargetBlock;
  Node? snapTargetInline;
};

[Exposed=Window]
interface SnapEvent : Event {
  constructor(DOMString type, optional SnapEventInit eventInitDict = {});
  readonly attribute Node? snapTargetBlock;
  readonly attribute Node? snapTargetInline;
};
snapTargetBlock, 타입 Node, 읽기 전용, null 허용

스냅 이벤트가 연관된 block 축에서 스냅 컨테이너가 스냅된 요소입니다. 해당 스냅 위치에서. 스냅 타겟 이 가상 요소였다면, 이 값은 해당 가상 요소의 소유 요소입니다.

snapTargetInline, 타입 Node, 읽기 전용, null 허용

스냅 이벤트가 연관된 inline 축에서 스냅 컨테이너가 스냅된 요소입니다. 해당 스냅 위치에서. 스냅 타겟 이 가상 요소였다면, 이 값은 해당 가상 요소의 소유 요소입니다.

scrollsnapchange 이벤트에서는 스냅 위치는 스크롤 스냅이 완료된 후 컨테이너가 이미 실현한 위치입니다. scrollsnapchanging 이벤트에서는 스크롤 동작이 종료되면 컨테이너가 스냅될 위치입니다.

SnapEvent는 이벤트 타겟이 Document인 경우를 제외하고 버블링되지 않습니다. SnapEvent는 취소할 수 없습니다.

부록 A: 이벤트 핸들러

이 섹션은 HTML 이벤트 핸들러 명세로 이동되어야 합니다.

요소, Document 객체 및 Window 객체의 이벤트 핸들러

다음은 모든 HTML 요소이벤트 핸들러 콘텐츠 속성이벤트 핸들러 IDL 속성으로 지원해야 하며, 모든 Window 객체와 Document 객체에서 이벤트 핸들러 IDL 속성으로 지원해야 하는 추가 이벤트 핸들러와 해당 이벤트 핸들러 이벤트 타입입니다:

이벤트 핸들러 이벤트 핸들러 이벤트 타입
onscrollsnapchange scrollsnapchange
onscrollsnapchanging scrollsnapchanging

GlobalEventHandlers 인터페이스 믹스인 확장

이 명세는 HTML의 GlobalEventHandlers 인터페이스 믹스인을 확장하여, 이벤트 핸들러 IDL 속성SnapEvent에 대해 추가합니다. 자세한 내용은 요소, Document 객체 및 Window 객체의 이벤트 핸들러를 참조하세요.

IDL 정의

partial interface mixin GlobalEventHandlers {
  attribute EventHandler onsnapchanged;
  attribute EventHandler onsnapchanging;
};

6. 프라이버시 고려사항

이 명세의 기능은 알려진 프라이버시 관련 영향이 없습니다.

7. 보안 고려사항

이 명세의 기능은 알려진 보안 관련 영향이 없습니다.

적합성

문서 규칙

적합성 요구사항은 설명적 단언과 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 렌더러는 반드시 사용 가능한 지원 수준이 없는 모든 at-rule, 속성, 속성 값, 키워드, 기타 구문 구조를 무효(적절히 무시)로 처리해야 합니다. 특히, 사용자 에이전트는 지원하지 않는 구성 값만 선택적으로 무시하고, 지원하는 값만 적용해서는 안 됩니다: 한 속성 선언에서 하나라도 값이 무효(지원하지 않는 값이어야 함)로 간주되면 CSS는 전체 선언을 무시해야 합니다.

불안정 및 독점 기능 구현

미래의 안정적인 CSS 기능과의 충돌을 방지하기 위해, CSSWG는 최선의 구현 지침을 따를 것을 권장합니다. 불안정 기능 및 독점 확장 구현 시 참고하세요.

비실험적 구현

명세가 후보 권고(Candidate Recommendation) 단계에 도달하면, 비실험적 구현이 가능하며, 구현자는 명세에 따라 올바르게 구현되었음을 입증할 수 있는 CR 단계 기능을 반드시 접두어 없이 배포해야 합니다.

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

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

색인

이 명세에서 정의된 용어

참조에 의해 정의된 용어

참고 문헌

규범적 참고 문헌

[CSS-ALIGN-3]
Elika Etemad; Tab Atkins Jr.. CSS 박스 정렬 모듈 레벨 3. 2023년 2월 17일. WD. URL: https://www.w3.org/TR/css-align-3/
[CSS-DISPLAY-3]
Elika Etemad; Tab Atkins Jr.. CSS 디스플레이 모듈 레벨 3. 2023년 3월 30일. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-OVERFLOW-3]
Elika Etemad; Florian Rivoal. CSS 오버플로우 모듈 레벨 3. 2023년 3월 29일. WD. URL: https://www.w3.org/TR/css-overflow-3/
[CSS-SCROLL-SNAP-1]
Matt Rakow; et al. CSS 스크롤 스냅 모듈 레벨 1. 2021년 3월 11일. CR. URL: https://www.w3.org/TR/css-scroll-snap-1/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 값 및 단위 모듈 레벨 4. 2024년 3월 12일. WD. URL: https://www.w3.org/TR/css-values-4/
[CSSOM-VIEW-1]
Simon Pieters. CSSOM 뷰 모듈. 2016년 3월 17일. WD. URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
Anne van Kesteren. DOM 표준. Living Standard. URL: https://dom.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML 표준. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
S. Bradner. RFC에서 요구 수준을 표시하기 위한 주요 단어. 1997년 3월. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 표준. Living Standard. URL: https://webidl.spec.whatwg.org/

속성 색인

이름 초기값 적용 대상 상속 % 값 애니메이션 타입 정규 순서 계산된 값
scroll-start-target [ none | auto ] none 모든 요소 아니오 N/A 없음 문법 기준 개별 속성 참조

IDL 색인

dictionary SnapEventInit : EventInit {
  Node? snapTargetBlock;
  Node? snapTargetInline;
};

[Exposed=Window]
interface SnapEvent : Event {
  constructor(DOMString type, optional SnapEventInit eventInitDict = {});
  readonly attribute Node? snapTargetBlock;
  readonly attribute Node? snapTargetInline;
};

partial interface mixin GlobalEventHandlers {
  attribute EventHandler onsnapchanged;
  attribute EventHandler onsnapchanging;
};

이슈 색인

':snapped' 가상 클래스는 컨테이너 상태 쿼리 접근 방식으로 대체될 예정입니다.
이 섹션은 HTML 이벤트 핸들러 명세로 이동되어야 합니다.