CSS 페이지형 미디어 모듈 레벨 3

W3C 작업 초안,

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2023/WD-css-page-3-20230914/
최신 공개 버전:
https://www.w3.org/TR/css-page-3/
편집자 초안:
https://drafts.csswg.org/css-page-3/
역사:
https://www.w3.org/standards/history/css-page-3/
피드백:
CSSWG 이슈 저장소
트래커
사양 내 인라인
편집자:
Elika J. Etemad / fantasai (Apple, formerly Mozilla)
전 편집자:
Simon Sapin (Mozilla, formerly Kozea)
Melinda Grant (HP)
Håkon Wium Lie (Opera Software)
Jim Bigelow (Hewlett-Packard)
Jacob Refstrup (Hewlett-Packard)
Robert Stevahn (Hewlett-Packard)
이 사양 편집 제안:
GitHub 편집기

초록

이 CSS 모듈은 페이지형 프레젠테이션에서 분할된 콘텐츠를 담기 위해 페이지가 생성되고 배치되는 방법을 명세합니다. 페이지 여백, 페이지 크기 및 방향, 머리글과 바닥글을 제어하는 기능을 추가하고, 페이지 번호 매기기 및 실행 머리글/바닥글을 가능하게 하도록 생성된 콘텐츠를 확장합니다. 흐름을 이러한 생성된 페이지로 페이지네이션하는 과정은 [CSS-BREAK-3]에 설명되어 있습니다.

CSS는 구조화된 문서(예: HTML 및 XML)의 렌더링을 화면, 인쇄물 등에서 설명하는 언어입니다.

이 문서의 상태

이 섹션은 문서가 공개되었을 당시의 상태를 설명합니다. 현재의 W3C 간행물 목록과 이 기술 리포트의 최신 개정판은 https://www.w3.org/TR/의 W3C 기술 리포트 색인에서 확인할 수 있습니다.

이 문서는 CSS 워킹 그룹에 의해 작업 초안(Working Draft)으로 권고안 트랙(Recommendation track)을 사용하여 발행되었습니다. 작업 초안으로의 발행은 W3C 및 그 회원들의 승인(endorsement)을 의미하지 않습니다.

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

피드백은 GitHub에서 이슈 제기(권장)를 통해 보내 주시기 바랍니다. 제목에 스펙 코드 “css-page”를 포함해 다음과 같이 작성해 주세요: “[css-page] …코멘트 요약…”. 모든 이슈와 코멘트는 보관됩니다. 또는 (보관된) 공개 메일링 리스트 www-style@w3.org로 보낼 수 있습니다.

이 문서는 2023년 6월 12일자 W3C 프로세스 문서의 적용을 받습니다.

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

1. 소개

페이지형 매체(예: 용지, 투명 슬라이드, 사진첩 페이지, 인쇄 출력 시뮬레이션으로 화면에 표시된 페이지)는 문서의 내용이 하나 이상의 개별적인 정적 표시 면으로 나뉜다는 점에서 연속 매체와 다릅니다. 페이지를 처리하기 위해, CSS3 Paged Media는 다음을 설명합니다:

이 모듈은 문서가 유한한 너비와 높이를 가진 직사각형 영역인 page box 내에서 어떻게 포맷되는지를 지정하는 페이지 모델을 정의합니다.

비록 CSS3가 사용자 에이전트가 page box를 시트로 전송하는 방법을 명세하지는 않지만, 의도된 페이지 시트의 크기 및 방향을 사용자 에이전트에 알리는 특정 메커니즘을 포함합니다. 일반적인 경우에 CSS3는 하나의 page box가 유사한 크기의 하나의 표면으로 전송된다고 가정합니다.

참고: [CSS-BREAK-4] 명세는 분할(페이징)에 대한 제어를 다루며, 예를 들어 break-before, break-after, break-inside, widows, 및 orphans 속성들을 예로 듭니다.

1.1. 값 정의

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

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

2. 페이지 용어

다음 용어와 부속 도해는 페이지 모델을 설명하는 데 도움이 됩니다:

Page sheet
The corner of a page sheet with the non-printable area at the edge and printable area inside it 페이지 시트는 물리적 매체의 한 면입니다. 오른쪽 그림은 페이지 시트의 왼쪽 상단 모서리 표현을 보여줍니다.
Printable and non-printable areas
비인쇄 가능 영역은 프린터와 같은 물리 장치가 신뢰성 있게 마킹할 수 없는 페이지 시트의 영역으로, 보통 프린터의 용지 취급 메커니즘 때문에 발생합니다. 이 값은 프린터에 따라 다르며 일반적으로 페이지 시트의 각 가장자리를 따라 있는 작은 영역입니다. 인쇄 가능 영역은 프린터가 신뢰성 있게 마킹할 수 있는 페이지 시트의 영역입니다. 인쇄 가능 영역의 크기는 페이지 시트의 크기에서 비인쇄 가능 영역의 크기를 뺀 값입니다. 사용자 에이전트는 특정 인쇄 장치에 대한 이 영역의 치수를 모를 수 있지만, 치수가 알려진 경우 사용자 에이전트는 문서의 포맷을 조정하여 콘텐츠가 인쇄 가능 영역 안에 들도록 할 수 있습니다. 이러한 조정이 어떻게 수행되는지는 장치에 따라 다르며 § 7.4 Rendering page boxes that do not fit a page sheet§ 3.2 Content outside the page box 섹션에 표현된 제약 내에서 결정됩니다.
Page Orientation
페이지 방향은 page box의 변 길이를 비교하여 정의됩니다. page box는 긴 변과 짧은 변이라 불리는 두 개의 수직 변을 가진 직사각형입니다. 긴 변의 길이는 항상 짧은 변의 길이보다 크거나 같습니다. page box가 정사각형인 경우 두 변은 같은 길이가 되며 어느 쪽을 긴 변으로 사용해도 됩니다. 이 명세서는 portraitlandscape의 페이지 방향을 정의합니다.
Portrait Orientation
세로(포트레이트) 페이지는 높이가 너비보다 크거나 같습니다. 가로 요소는 짧은 변과 평행하고 세로 요소는 긴 변과 평행합니다.
Landscape Orientation
가로(랜드스케이프) 페이지는 너비가 높이보다 크거나 같습니다. 가로 요소는 긴 변과 평행하고 세로 요소는 짧은 변과 평행합니다.

참고: CSS3는 landscape와 reverse-landscape를 구분하지 않습니다. 그러나 향후 CSS 버전에서는 구분할 수 있습니다. 사용자 에이전트는 양면 인쇄를 포맷할 때 제본 가장자리, 페이지 진행 및 읽기 용이성을 고려하여 landscape와 reverse-landscape 렌더링 사이를 선택해야 합니다.

Duplex Printing
양면 인쇄는 페이지 시트의 각 면에 하나의 page box를 출력하여 페이지 시트의 양면을 사용합니다. 이 모듈은 문서가 양면 인쇄되는지 여부를 지정하는 기능을 제공하지 않지만, 왼쪽 페이지와 오른쪽 페이지의 개념은 문서가 실제로 양면 인쇄되는지 여부와 관계없이 양면 인쇄를 가정하여 정의됩니다.
Binding Edge
제본 가장자리는 재료가 제본된 경우 page box에서 제본 쪽을 향한 가장자리입니다. 제본 가장자리는 제본에 사용되는 공간을 제공하기 위해 반대쪽 가장자리보다 더 큰 여백을 가지는 경우가 많습니다. 제본 가장자리는 네 가장자리 중 어느 것이든 될 수 있습니다. 그러나 관례적으로 세로 방향의 page box는 제본 가장자리가 수직이 되도록 제본됩니다. 이 모듈은 제본 가장자리를 지정하는 방법을 제공하지 않습니다. 양면 인쇄의 경우 왼쪽 및 오른쪽 페이지에 대해 제본 가장자리가 서로 반대편에 있습니다.
Facing Pages
Facing pages는 연속된 두 페이지로, 문서를 양면 인쇄할 때 서로 다른 용지의 서로 다른 면에 놓이는 페이지들입니다. 일반적으로 이전 페이지는 한 용지의 뒷면이고 다음 페이지는 다른 용지의 앞면이 됩니다. 보통 facing pages는 정상적인 읽기 방향에서 제본 가장자리가 수직이고 인접하도록 배치됩니다.
Left Page
일반적으로 짝을 이루는 facing pages에서 왼쪽에 위치하는 페이지입니다. 왼쪽에서 오른쪽으로 진행하는 문서 레이아웃에서는 facing pages 중 더 이른 페이지가 왼쪽에 놓입니다. 왼쪽 페이지에 특정한 규칙은 :left page selector를 사용하여 지정할 수 있습니다.
Right Page
일반적으로 짝을 이루는 facing pages에서 오른쪽에 위치하는 페이지입니다. 오른쪽에서 왼쪽으로 진행하는 문서 레이아웃에서는 facing pages 중 더 이른 페이지가 오른쪽에 놓입니다. 오른쪽 페이지에 특정한 규칙은 :right page selector를 사용하여 지정할 수 있습니다.

3. 페이지 모델

paged media 포맷팅 모델에서는 문서가 하나 이상의 page box로 전송됩니다. page box는 용지의 한 페이지와 같은 직사각형 인쇄 매체 표면에 매핑되는 특수한 CSS 박스입니다. 이는 대략적으로 viewport와 유사합니다.

다른 CSS 박스와 마찬가지로, page box는 margin, border, padding 및 content 영역으로 구성됩니다. page box의 content 및 margin 영역은 특별한 기능을 가집니다:

CSS 2.1에서는 page box와 page area가 단순한 직사각형이었습니다. 둘 다 margin, border 및 padding을 가진 CSS 박스가 아니었습니다. 이 CSS 박스는 page box 및 page area와 구별되어야 하며, 각각은 그에 대응하는 margin 영역과 content 영역이 됩니다. 명칭에 대한 아이디어가 있나요?

page box의 속성은 page context 내에 선언된 속성들에 의해 결정됩니다. page context는 선언 블록으로서 @page 규칙의 선언 블록입니다. 유사하게 page-margin box의 속성은 그 margin context 내에 선언된 속성들에 의해 결정됩니다. page context의 선언은 page box에 영향을 주거나 page-margin boxes에 상속될 수 있지만, 문서의 루트 요소 또는 다른 콘텐츠에는 적용되거나 상속되지 않습니다.

page box의 containing block은 page context에서 size 속성을 사용하여 지정됩니다. 그런 다음 page box의 너비와 수평 여백은 정상 흐름의 비대체 블록 요소에 대해 계산되는 방식과 동일하게 정확히 계산됩니다. [CSS2] page box의 높이 및 수직 여백은 유사하게 계산됩니다(블록 높이 공식 대신). 두 경우 모두 값이 과도하게 제약되는 경우, 어떠한 여백을 무시하는 대신 containing block이 page box의 여백 가장자리와 일치하도록 크기를 조정합니다.

3.1. 페이지 배경과 페인팅 순서

페이지의 내용을 그릴 때, 페이지 레이어는 다음 페인팅 순서(가장 아래부터)로 그려집니다:

  1. 페이지 배경
  2. 문서 캔버스
  3. 페이지 테두리
  4. 문서 내용
  5. page-margin boxes

페이지 모델에서 페이지 배경은 루트 배경과 유사하게 동작합니다: 그 background painting areableed area이며, 이는 page box 전체, 즉 여백을 포함하여 덮습니다(이는 background-clip의 값과 관계없이 적용됩니다). 페이지 배경은 기본적으로 page box의 패딩 영역 안에서 고정되며(사용자 에이전트가 [CSS-BACKGROUNDS-3]을 지원하는 경우 background-origin을 준수합니다). 그러나 background-attachmentfixed이면 이미지는 page box와 그 여백을 포함한 영역을 기준으로 위치 지정됩니다(즉 background positioning area가 페이지의 margin box가 됩니다).

문서 캔버스 배경은 page box의 배경으로 그려집니다: 기본적으로 그 background painting area는 page box의 border box를 덮으며, [CSS-BACKGROUNDS-3]를 지원하는 UA의 경우 루트 요소에 지정된 background-clip 값을 따릅니다. 그러나 여전히 루트 요소 또는 page area에 대해 위치 지정됩니다.

page-margin boxes와 관련하여, 문서 캔버스, 페이지 테두리 및 모든 문서 내용은 z-index 값이 0인 단일 요소로 취급되어 스태킹 컨텍스트를 형성합니다 [CSS2]: page-margin boxes는 문서 내용의 일부와 섞이거나 내용과 캔버스 사이에 끼어들지 않습니다. 이들은 문서 내용 앞에만 그려지거나 문서 캔버스 뒤에만 그려질 수 있습니다. 페이지 배경은 항상 모든 것 아래에 그려집니다.

z-index 속성은 page-margin boxes에 적용됩니다. position 속성은 page-margin boxes에 적용되지 않으므로, z-index는 position 속성 값에 관계없이 항상 page-margin boxes에 대해 위치된 요소처럼 작용합니다. 각 page-margin box는 항상 스태킹 컨텍스트를 형성합니다.

page-margin boxes 상호 간의 기본 페인팅 순서(또는 CSS2.1 부록 E "트리 순서")는 다음과 같습니다:

  1. @top-left-corner
  2. @top-left
  3. @top-center
  4. @top-right
  5. @top-right-corner
  6. @right-top
  7. @right-middle
  8. @right-bottom
  9. @bottom-right-corner
  10. @bottom-right
  11. @bottom-center
  12. @bottom-left
  13. @bottom-left-corner
  14. @left-bottom
  15. @left-middle
  16. @left-top

시작은 @top-left-corner에서 시작하여 시계 방향으로 진행합니다. 이 순서는 임의적이며 z-index로 재정의할 수 있습니다. 이는 page-margin boxes가 겹칠 때만 눈에 띄는 효과를 가지며, 대부분의 경우에는 발생하지 않아야 합니다.

3.2. Page box 밖의 콘텐츠

페이지 모델에서 콘텐츠를 포맷할 때 일부 콘텐츠가 page box 밖으로 벗어날 수 있습니다. 예를 들어, white-space 속성 값이 pre인 요소는 page box보다 넓은 박스를 생성할 수 있습니다. 또 다른 예로, 박스가 절대 또는 상대적으로 위치 지정되면 "불편한" 위치에 놓일 수 있습니다. 예를 들어, 이미지가 page box의 가장자리에 놓이거나 page box보다 100,000미터 아래에 놓일 수 있습니다.

이러한 요소들의 정확한 포맷팅에 대한 명세는 이 문서의 범위 밖에 있습니다. 그러나 저자와 사용자 에이전트는 page box 밖의 콘텐츠에 관해 다음 일반 원칙을 따르는 것이 권장됩니다:

3.3. 페이지 진행

CSS는 문서가 양면 인쇄되든 그렇지 않든 모든 문서에서 왼쪽 페이지와 오른쪽 페이지를 구별합니다. 각 왼쪽 페이지 뒤에는 오른쪽 페이지가 오고 그 반대도 마찬가지입니다. 왼쪽 및 오른쪽 페이지는 :left:right 의사클래스를 사용하여 다르게 스타일링할 수 있습니다.

문서의 첫 페이지가 왼쪽 페이지인지 오른쪽 페이지인지는 문서의 페이지 진행에 달려 있습니다. page progression은 문서의 인쇄된 페이지가 나란히 배치될 때 어떤 방향으로 순서가 매겨지는지를 나타냅니다. 예를 들어, 영어 및 수평으로 설정된 일본어는 일반적으로 왼쪽에서 오른쪽으로 진행하는 반면, 아랍어 및 수직으로 설정된 일본어는 일반적으로 오른쪽에서 왼쪽으로 진행합니다.

페이지 진행 방향은 다음과 같이 결정됩니다:

UA가 CSS 3 Writing Modes Module의 directionwriting-mode 속성을 지원하는 경우 [CSS-WRITING-MODES-3], 결정되어야 하며 page progressionprincipal writing mode에 의해 결정됩니다.

왼쪽에서 오른쪽으로 진행하는 page progression을 가진 문서에서는 문서의 첫 페이지가 오른쪽 페이지가 되며 그 반대도 마찬가지입니다. 문서가 왼쪽 또는 오른쪽 페이지에서 인쇄를 시작하도록 강제로 지정하려면, 저자는 루트로 페이지 분할을 전파하는 break-before 값을 지정할 수 있습니다. [CSS-BREAK-3] 이 경우 UA는 첫 번째(빈) 페이지들을 억제해야 하며 (:first 의사클래스는 첫 번째 인쇄된 페이지와 일치합니다).

html { break-before: always }

왼쪽에서 오른쪽으로 진행하는 페이지 진행을 가진 HTML 문서의 경우, 위의 스타일 규칙은 문서의 첫 페이지가 ':left' 페이지에서 인쇄되도록 합니다

html { break-before: left }

HTML 문서의 경우, 위의 스타일 규칙은 페이지 진행과 관계없이 문서의 첫 페이지가 ':left' 페이지에서 인쇄되도록 합니다.

4. 페이지 선택자 및 페이지 문맥

4.1. @page 규칙

저자는 @page 규칙 내에서 페이지 박스의 치수, 방향, 여백과 같은 다양한 측면을 지정할 수 있습니다. @page 규칙은 규칙 집합이 허용되는 곳이라면 어디서나 허용됩니다. @page 규칙은 키워드 @page, 선택자들의 선택적 콤마로 구분된 목록 및 선언 블록(이를 page context라 합니다)으로 구성됩니다. @page 규칙은 또한 선언들 사이에 다른 at-규칙들을 포함할 수 있습니다. 이 명세의 현재 레벨은 margin at-rules만을 @page 내부에서 허용합니다.

@page 규칙에 선택자 목록이 없으면 모든 페이지에 적용됩니다. 다른 @page 규칙은 자신의 선택자 중 적어도 하나와 일치(match)하는 페이지에 적용됩니다. page context 내에 선언된 속성들은 페이지 박스에 적용됩니다.

페이지 또는 margin 문맥 내의 선언 블록을 처리하는 동안 오류가 발생하면 구문 오류 처리 규칙이 적용됩니다. 즉, 블록 내의 유효한 선언들은 적용됩니다.

4.2. 페이지 선택자

page selectorpage type selector 또는 page pseudo-class 중 하나로 구성되며, 그 뒤에 0개 이상의 추가 page pseudo-class가 올 수 있습니다. 선택자 구성 요소 사이에는 공백이 허용되지 않습니다. <page-selector> 문법과 예시는 아래에서 찾을 수 있습니다.

page selector는 모든 구성 요소가 해당 페이지와 일치할 때에만 주어진 페이지와 일치(match)한다고 합니다.

page type selector 는 대소문자를 구별하는 CSS 식별자입니다. 이는 [CSS2]에 정의된 바와 같이, named page type으로 생성된 페이지들과 일치(matches)합니다. page type 이름으로 auto(ASCII 대소문자 구분 없음)가 사용되는 것은 규칙을 무효로 만들지는 않지만, 결코 일치해서는 안 됩니다.

page pseudo-classASCII 대소문자 구분 없음이고, 일반 선택자에서의 의사클래스와 동일한 문법을 가집니다. [SELECT] 다양한 page pseudo-class들은 아래에 정의되어 있습니다.

4.2.1. 스프레드 의사클래스: :left, :right

양면 인쇄 문서에서는 왼쪽과 오른쪽 페이지가 종종 다르게 포맷됩니다. 이는 :left:right 페이지 의사클래스를 사용하여 표현할 수 있습니다.

모든 페이지는 사용자 에이전트에 의해 자동으로 페이지 진행(page progression)에 기반하여 왼쪽 페이지 또는 오른쪽 페이지로 분류됩니다. :left:right 의사클래스는 각각 일치하는 left 또는 right pages만을 매칭합니다.

다음 예시는 이러한 의사클래스를 사용하여 왼쪽 및 오른쪽 제본 가장자리를 생성합니다:
@page :left {
margin-left: 3cm;
margin-right: 4cm;
}

@page :right {
margin-left: 4cm;
margin-right: 3cm;
}

왼쪽 및 오른쪽 페이지에 대해 서로 다른 선언이 주어졌다면, 사용자 에이전트는 페이지 박스를 실제로 왼쪽 및 오른쪽 시트로 전송하지 않더라도(예: 한 면만 인쇄하는 프린터) 해당 선언을 준수해야 합니다. 즉, 단면 인쇄 장치라도 올바르게 포맷된 출력을 생성해야 합니다.

참고. :left 또는 :right 의사클래스에 선언을 추가한다고 해서 문서가 양면 또는 단면으로 출력되는지 여부에 반드시 영향을 주는 것은 아닙니다(이 부분은 본 명세의 범위를 벗어납니다).

4.2.2. 첫 페이지 의사클래스: :first

:first 의사클래스는 문서의 첫 번째 인쇄된 페이지와 일치(matches)합니다.

@page { margin: 2cm } /* 모든 여백을 2cm로 설정 */

@page :first {
margin-top: 10cm /* 첫 페이지의 상단 여백 10cm */
}

4.2.3. 공백 페이지 의사클래스: :blank

:blank 의사클래스는 content-empty pages일치(matches)하며, 이는 강제 페이지 분할의 결과로 나타나는 페이지들입니다.

오직 left, right, rectoverso 값들만이 break-beforebreak-after 속성에서 페이지를 생성하여 :blank와 일치하게 할 수 있습니다.
이 예에서는 h1 요소 앞에 강제 페이지 분할이 발생할 수 있습니다.
h1 { break-before: left }

@page :blank {
  @top-center { content: "This page is intentionally left blank" }
}

:blank에 의해 매칭된 페이지는 다른 페이지 의사클래스와도 중복 매칭될 수 있습니다.

모든 오른쪽 페이지에 헤더가 지정되어 있는 경우, 공백 오른쪽 페이지는 :blank:right 둘 다에 매칭됩니다. 따라서 오른쪽 페이지에 설정된 여백 박스는 공백 페이지에서 원치 않으면 제거해야 합니다. 다음 예는 공백 페이지에서 상단 중앙 헤더를 제거하고, 페이지 번호는 유지하는 예입니다:

h1 { break-before: left }

@page :blank {
  @top-center { content: none }
}

@page :right {
  @top-center { content: "Preliminary edition" }
  @bottom-center { content: counter(page) }
}

:blank:right보다 더 높은 specificity를 가지므로, 상단 중앙 헤더는 content: nonecontent: "Preliminary edition"보다 먼저 나오더라도 제거됩니다.

참고. 향후 CSS 버전은 다른 페이지 의사클래스를 포함할 수 있습니다.

4.3. @page 규칙 문법

@page 규칙은 다음 문법에 따라 파싱되며, 아래에 명시된 추가 규칙들이 적용됩니다:

@page = @page <page-selector-list>? { <declaration-rule-list> }
<page-selector-list> = <page-selector>#
<page-selector> = [ <ident-token>? <pseudo-page>* ]!
<pseudo-page> = ':' [ left | right | first | blank ]

/* Margin rules */
@top-left-corner = @top-left-corner { <declaration-list> };
@top-left = @top-left { <declaration-list> };
@top-center = @top-center { <declaration-list> };
@top-right = @top-right { <declaration-list> };
@top-right-corner = @top-right-corner { <declaration-list> };
@bottom-left-corner = @bottom-left-corner { <declaration-list> };
@bottom-left = @bottom-left { <declaration-list> };
@bottom-center = @bottom-center { <declaration-list> };
@bottom-right = @bottom-right { <declaration-list> };
@bottom-right-corner = @bottom-right-corner { <declaration-list> };
@left-top = @left-top { <declaration-list> };
@left-middle = @left-middle { <declaration-list> };
@left-bottom = @left-bottom { <declaration-list> };
@right-top = @right-top { <declaration-list> };
@right-middle = @right-middle { <declaration-list> };
@right-bottom = @right-bottom { <declaration-list> };

또한 다음 규칙들이 적용됩니다:

다음은 페이지 선택자의 예들입니다(선언 블록은 의도적으로 비워둠)
@page { ... }
@page :left { ... }
@page :right { ... }
@page LandscapeTable { ... }
@page CompanyLetterHead:first { ... } /*  식별자와 의사 페이지. */
@page:first { ... }
@page toc, index { ... }
@page :blank:first { ... }

다음은 선언 블록이 의도적으로 비워진 페이지 여백 박스들의 예입니다.

@page {
 @top-left { ... /* 문서 이름 */ }
 @bottom-center { ... /* 페이지 번호 */}
}
@page :left { @left-middle { ... /* 왼쪽 여백의 페이지 번호 */ }}
@page :right{ @right-middle { ... /* 오른쪽 페이지의 오른쪽 여백의 페이지 번호 */}}

@page :left { @bottom-left-corner { ... /* 왼쪽 페이지 번호 */ }}
@page :right { @bottom-right-corner { ... /* 오른쪽 페이지 번호 */ }}
@page :first { @bottom-left-corner { ... /* 첫 페이지의 빈 바닥글 */ }
@bottom-right-corner { ... /* 빈 바닥글 */ } }

4.4. 페이지 문맥에서의 캐스케이딩

페이지 및 여백 문맥의 선언들은 요소를 위한 스타일 규칙의 선언들과 마찬가지로 캐스케이딩됩니다.

페이지 선택자의 specificitySelectors 모듈에서 정의된 계산 방식과 유사한 방식으로 계산됩니다:

참고: 동일한 의사클래스의 반복 발생은 허용되며 specificity를 증가시킵니다.

저장 공간의 제한으로 인해 구현체는 f, g 또는 h의 크기에 제한을 가질 수 있습니다. 그렇다면 한계보다 큰 값들은 그 한계로 강제 클램프되어야 하고, 오버플로우되어서는 안 됩니다.

Specificity는 세 구성 요소(f, g, h)를 순서대로 비교하여 비교합니다: f 값이 더 큰 specificity가 더 구체적입니다; 만약 두 f 값이 같다면 두 g 값을 비교하고, 그 다음으로 h를 비교합니다. 모든 값이 같으면 두 specificity는 동일합니다.

다음은 페이지 specificity 계산 예시들입니다:

@page { } /* specificity = (0,0,0) */
@page :left { } /* specificity = (0,0,1) */
@page :first { } /* specificity = (0,1,0) */
@page :blank:left { } /* specificity = (0,1,1) */
@page artsy { } /* specificity = (1,0,0) */
@page artsy:left { } /* specificity = (1,0,1) */
@page artsy:first { } /* specificity = (1,1,0) */

다음 사용 예를 고려해 보세요:

@page :left {
  margin-left: 4cm;
}

@page {
  margin-left: 3cm;
}

의사클래스 선택자의 더 높은 specificity 때문에, 왼쪽 페이지의 왼쪽 여백은 4cm가 되고 다른 모든 페이지(오른쪽 페이지)는 왼쪽 여백이 3cm가 됩니다.

이 예에서 녹색 규칙들의 더 높은 specificity가 빨간 규칙보다 우선합니다. 따라서 첫 페이지는 왼쪽 상단 페이지 여백 박스에 파란색 텍스트가 있고 오른쪽 상단 페이지 여백 박스에는 녹색 텍스트가 있으며, 이후의 페이지들은 페이지 여백 박스에 빨간색 텍스트를 갖게 됩니다.
@page :first {
  color: green;

  @top-left {
    content: "foo";
    color: blue;
  }
  @top-right {
    content: "bar";
  }
}

@page { color: red;
  @top-center {
    content: "Page " counter(page);
  }
}

페이지 문맥은 캐스케이딩되므로, 다음 스타일시트는 페이지 여백 박스에 25밀리미터 여백과 14포인트 글꼴 크기를 적용합니다:

@page { margin: 25mm;}
@page { font-size: 14pt;}

5. 페이지 여백 박스

페이지 여백 박스는 페이지 여백 내의 박스로, 의사 요소처럼 생성된 콘텐츠를 포함할 수 있습니다.

페이지 여백 박스는 페이지 번호나 문서 제목과 같은 보조 정보용으로 예약된 페이지의 일부인 페이지 머리글과 바닥글을 만드는 데 사용할 수 있습니다.

일반적으로, 페이지 머리글은 주로 수평 쓰기 방향을 가지는 문서에서는 페이지 상단에 위치하고, 주로 수직 쓰기 방향을 가지는 문서에서는 제본 가장자리의 반대편 쪽에 위치합니다. 수평으로 쓴 문서의 페이지 머리글 디자인의 한 예는 @top-left-corner, @top-left, @top-center, @top-right@top-right-corner 페이지 여백 박스를 사용할 수 있습니다. 또 다른 디자인으로는 수직으로 쓴 문서의 경우 @right-top, @right-middle, 및 @right-bottom 페이지 여백 박스를 오른쪽 페이지(right facing pages)에, @left-top, @left-middle, 및 @left-bottom을 왼쪽 페이지(left facing pages)에 사용할 수 있습니다.

페이지 바닥글은 일반적으로 페이지 머리글과 반대편 끝에 위치합니다. 예를 들어, 페이지 상단에 페이지 머리글이 있는 수평 문서의 디자인은 @bottom-left-corner, @bottom-left, @bottom-center, @bottom-right@bottom-right-corner 페이지 여백 박스를 페이지 바닥글로 사용할 수 있습니다. 수직으로 쓴 문서의 디자인은 페이지의 제본 가장자리 쪽 페이지 여백 박스를 페이지 바닥글로 사용할 수 있습니다.

페이지 여백 박스는 페이지 영역을 기준으로 배치되며 페이지 방향과 독립적입니다. 예를 들어, 상단 페이지 여백 박스는 세로 또는 가로 방향 모두에서 페이지 영역 위에 있습니다. 다양한 페이지 여백 박스는 아래 도해에서 정의되고 예시로 제시되어 있습니다:

표 1 페이지 여백 박스 정의
박스 설명 배치
top-left-corner 페이지 박스의 상단 및 왼쪽 여백의 교차에 의해 정의되는 고정 크기 박스 the top left corner box with margin, border, and padding, nested within intersection of the page’s top and left margins
top-left top-left-corner 및 top-center 페이지 여백 박스 사이의 상단 페이지 여백을 채우는 가변 너비 박스 the top left box with margin, border, and padding, nested in the page’s top margin next to the top left corner box
top-center 페이지의 좌우 테두리 가장자리 사이에 수평으로 중앙 정렬되고 top-left 및 top-right 페이지 여백 박스 사이의 상단 페이지 여백을 채우는 가변 너비 박스 the top center box with margin, border, and padding, centered within the page’s top margin
top-right top-center 및 top-right-corner 페이지 여백 박스 사이의 상단 페이지 여백을 채우는 가변 너비 박스 the top right box with margin, border, and padding, nested within the page’s top margin
top-right-corner 페이지 박스의 상단 및 오른쪽 여백의 교차에 의해 정의되는 고정 크기 박스 the top right corner box with margin, border, and padding, nested within the intersection of the page’s top and right margin
left-top top-left-corner 및 left-middle 페이지 여백 박스 사이의 왼쪽 페이지 여백을 채우는 가변 높이 박스 left-top, left-middle, and left-bottom page-margin boxes in the page box’s left margin
left-middle 페이지의 상단 및 하단 테두리 가장자리 사이에 수직으로 중앙 정렬되고 left-top 및 left-bottom 페이지 여백 박스 사이의 왼쪽 페이지 여백을 채우는 가변 높이 박스
left-bottom left-middle 및 bottom-left-corner 페이지 여백 박스 사이의 왼쪽 페이지 여백을 채우는 가변 높이 박스
right-top top-right-corner 및 right-middle 페이지 여백 박스 사이의 오른쪽 페이지 여백을 채우는 가변 높이 박스 right-top, right-middle, and right-bottom page-margin boxes in the page box’s right margin
right-middle 페이지의 상단 및 하단 테두리 가장자리 사이에 수직으로 중앙 정렬되고 right-top 및 right-bottom 페이지 여백 박스 사이의 오른쪽 페이지 여백을 채우는 가변 높이 박스
right-bottom right-middle 및 bottom-right-corner 페이지 여백 박스 사이의 오른쪽 페이지 여백을 채우는 가변 높이 박스
bottom-left-corner 페이지 박스의 하단 및 왼쪽 여백의 교차에 의해 정의되는 고정 크기 박스 bottom left corner box with margin, border, and padding, nested within the page margin at the intersection of the left and bottom page margins
bottom-left bottom-left-corner 및 bottom-center 페이지 여백 박스 사이의 하단 페이지 여백을 채우는 가변 너비 박스 bottom left page-margin box with margin, border, and padding, nested within the page’s bottom margin next to the bottom-left-corner box
bottom-center 페이지의 좌우 테두리 가장자리 사이에 수평으로 중앙 정렬되고 bottom-left 및 bottom-right 페이지 여백 박스 사이의 하단 페이지 여백을 채우는 가변 너비 박스 bottom center box with margin, border, and padding, nested within the page’s bottom margin and centered on the page
bottom-right bottom-center 및 bottom-right-corner 페이지 여백 박스 사이의 하단 페이지 여백을 채우는 가변 너비 박스 bottom right page-margin box with margin, border, and padding, nested within the page’s bottom margin and next to the bottom-right-corner box
bottom-right-corner 페이지 박스의 하단 및 오른쪽 여백의 교차에 의해 정의되는 고정 크기 박스 bottom right corner box with margin, border, and padding, nested within the page margin at the intersection of the right and bottom page margins

5.1. 페이지 여백 박스를 위한 at-규칙

페이지 여백 박스는 margin at-rules에 의해 page context 내부에서 생성됩니다. 저자들은 이러한 규칙을 페이지 문맥의 선언 뒤에 배치해야 합니다. 레거시 클라이언트는 margin at-rule 뒤의 선언을 올바르게 처리하지 못할 수 있기 때문입니다.

margin at-rule은 페이지 여백 박스(예: @top-left)를 식별하고 설명자 블록(이를 margin context라 합니다)을 포함하는 at-rule입니다.

다음 스타일시트는 왼쪽에 제목("Hamlet")을, 오른쪽에는 "Page "라는 접두어와 함께 페이지 번호를 포함하는 페이지 머리글을 설정합니다:

@page {
  size: 8.5in 11in;
  margin: 10%;

  @top-left {
    content: "Hamlet";
  }
  @top-right {
    content: "Page " counter(page);
  }
}

5.2. 페이지 여백 박스에 콘텐츠 채우기

:before 및 :after 의사요소와 마찬가지로, 페이지 여백 박스에서 지정된 content: normalnone으로 계산됩니다. 페이지 여백 박스는 그 content 속성의 계산된 값이 none이 아닐 때에만 생성된 것으로 간주됩니다. 그렇지 않으면, display: none인 요소와 마찬가지로 박스는 생성되지 않습니다.

display 속성은 페이지 여백 박스에 적용되지 않습니다.

다음 스타일시트는 페이지의 네 모서리 각각에 녹색 박스를 만들되, 왼쪽 하단 코너는 제외합니다.
@page {
  @top-left-corner { content: " "; border: solid green; }
  @top-right-corner { content: url(foo.png); border: solid green; }
  @bottom-right-corner { content: counter(page); border: solid green; }
  @bottom-left-corner { content: normal; border: solid green; }
}

5.3. 페이지 여백 박스 치수 계산

각 페이지 여백 박스의 너비와 높이는 아래 규칙들에 의해 결정됩니다. 이 규칙들은 페이지 여백 박스에 대한 CSS2.1 섹션 10.3 및 10.6의 등가물을 정의합니다.

min-height, max-height, min-width, 및 max-width를 적용하는 규칙들은 페이지 여백 박스에 적용되며, 지정된 width 또는 height로부터 계산된 치수가 그 제약을 위반하면 너비, 높이 및/또는 여백의 재계산을 유발할 수 있습니다. UA가 min-height 또는 min-width 속성을 지원하지 않는 경우, 마치 min-height와 min-width가 항상 0인 것처럼 동작해야 합니다.

5.3.1. 페이지 여백 박스 레이아웃 용어

CSS2.1의 박스 모델 정의 및 CSS Sizing의 크기 용어들 외에, 이후의 페이지 여백 박스 계산에서 사용하기 위해 다음 용어들이 정의됩니다:

available width
페이지의 왼쪽 테두리 너비, 왼쪽 패딩, page area 너비, 오른쪽 패딩 및 오른쪽 테두리 너비의 합계. 즉, 페이지 박스의 왼쪽 및 오른쪽 테두리 가장자리 사이의 거리입니다. 이 값은 상단 및 하단 페이지 여백 박스의 치수를 계산할 때 사용됩니다.
available height
페이지의 상단 테두리 너비, 상단 패딩, page area 높이, 하단 패딩 및 하단 테두리 너비의 합계. 즉, 페이지 박스의 상단 및 하단 테두리 가장자리 사이의 거리입니다. 이 값은 왼쪽 및 오른쪽 페이지 여백 박스의 치수를 계산할 때 사용됩니다.
outer width
outer edge의 너비로, [CSS-BOX-3]에 정의된 바와 같습니다.
min-content width
물리적 너비로서 min-content block size 또는 min-content inline size 중 어느 쪽인지에 따라 결정됩니다.
max-content width
물리적 너비로서 max-content block size 또는 max-content inline size 중 어느 쪽인지에 따라 결정됩니다.
outer min width
outer width와 유사하나, 계산된 width가 auto인 경우 min-content width가 사용됩니다.
outer max width
outer width와 유사하나, 계산된 width가 auto인 경우 max-content width가 사용됩니다.

페이지 여백 박스의 containing block 은 그 위치에 따라 달라집니다:

코너 페이지 여백 박스의 경우, 그것은 해당 코너에서 만나는 두 페이지 여백의 교차로 정의되는 직사각형입니다.

다른 모든 페이지 여백 박스의 경우, containing block은 캡슐화된 페이지 여백에서 인접한 코너의 페이지 여백 박스들의 containing block들을 뺀 직사각형입니다. 이는 이 containing block의 크기가 한 차원에서는 사용된 페이지 여백에 의해 주어지고 다른 차원에서는 available width(상단 및 하단 박스의 경우) 또는 available height(왼쪽 및 오른쪽 박스의 경우)에 의해 주어짐을 의미합니다.

5.3.2. 페이지 여백 박스 가변 치수 계산 규칙

다음 규칙들은 @top-left, @top-center@top-right 페이지 여백 박스(이 절에서는 각각 A, B 및 C로 지칭됨)에 적용됩니다.

5.3.2.1. 여백

세 박스 중 어느 박스의 margin-left 또는 margin-right 속성이 계산되어 auto가 되면, 사용된 값은 0입니다.

5.3.2.2. auto 너비 해결

다음 알고리즘은 각 박스의 사용된 너비를 결정합니다. 이 목적을 위해, 생성되지 않은(generated가 아닌) 박스들은 너비와 외부 너비(outer width)가 0인 것으로 가정됩니다.

참고: 높은 수준의 목표는(우선순위 순서대로) 가운데 박스(B)가 생성된 경우 이를 중앙에 배치하고, 오버플로우와 겹침을 최소화하며, 콘텐츠의 양에 비례하여 공간을 분배하는 것입니다.

가운데 박스(B)가 생성되지 않은 경우, 사용 가능한 너비(available width)를 A와 C에 다음과 같이 분배합니다:

가운데 박스(B)가 생성된 경우, A, B 및 C의 auto 너비를 다음과 같이 결정합니다:

  1. 먼저 가운데 박스(B)의 auto 너비를 해결합니다: B와 AC라는 두 박스가 있다고 가정하는데, AC의 각 치수는 A와 C의 최대값의 두 배입니다. (이것은 B의 중앙 정렬을 유지합니다.) 이들 두 박스(B와 가상의 AC)에 공간을 분배하는 방식은 위의 A와 C에 대한 설명을 따릅니다.
  2. 그런 다음, 측면 박스(A 및 C)의 auto 너비를 해결하는데, 그 박스의 외부 너비를 다음으로 설정합니다: (available width − used outer widths of B) ÷ 2
5.3.2.3. min-width 및 max-width 처리

min-widthmax-width 속성은 가변 치수에서 일반 요소와 마찬가지로 페이지 여백 박스에 적용되지만, 같은 쪽의 세 박스는 함께 고려된다는 점이 다릅니다.

더 정확히는:

  1. tentative 사용된 너비들은 (min-widthmax-width 없이) § 5.3.2.2의 auto 너비 해결 규칙을 따라 계산됩니다.
  2. 만약 세 박스 중 어느 하나의 tentative 사용된 너비가 max-width보다 크면, 위 규칙들이 다시 적용되지만 이번에는 max-width의 계산된 값을 width의 계산된 값으로 사용합니다.
  3. 만약 그 결과로 나온 어느 박스의 너비가 min-width보다 작으면, 위 규칙들이 다시 적용되지만 이번에는 min-width 값을 width의 계산된 값으로 사용합니다.
5.3.2.4. 배치

박스들의 치수가 결정되면, 다음과 같이 배치됩니다:

5.3.2.5. 다른 쪽의 박스들

@bottom-left, @bottom-center@bottom-right 페이지 여백 박스의 사용된 값들은 각각 @top-left, @top-center@top-right에 대한 동일한 규칙들에 의해 정해집니다.

@left-top, @left-middle@left-bottom 박스들의 사용된 값들은 동일한 규칙들에 의해 정해지지만 "width"가 "height"로, "left"가 "top"으로, "right"가 "bottom"으로, 그리고 "center"가 "middle"로 각각 대체되어 적용됩니다.

@right-top, @right-middle@right-bottom 페이지 여백 박스의 사용된 값들은 각각 @left-top, @left-middle@left-bottom에 대한 동일한 규칙들에 의해 정해집니다.

5.3.3. 페이지 여백 박스 고정 치수 계산 규칙

아래 규칙들은 각 @top-left-corner, @top-left, @top-center, @top-right, 및 @top-right-corner 페이지 여백 박스의 height, margin-top, 및 margin-bottom 속성의 사용된 값을 계산하는 데 사용됩니다:

  1. 다음 제약은 마진 박스의 사용된 값들 사이에 성립해야 합니다:

    margin-top + border-top-width + padding-top + height + padding-bottom + border-bottom-width + margin-bottom = 상단 페이지 여백

  2. 만약 border-top-width + padding-top + height (만약 auto가 아니면) + padding-bottom + border-bottom-width에, margin-top 및/또는 margin-bottom (auto가 아닌 경우)을 더한 값이 상단 페이지 여백의 높이보다 크면, 이후 규칙들에서는 margin-top 또는 margin-bottom의 auto 값들은 0으로 취급됩니다.
  3. 이 시점에서 height, margin-top 및 margin-bottom의 계산된 값이 모두 auto가 아닌 값이면, 그 값들은 "과도하게 제약됨(over-constrained)"이라고 불립니다. 이 경우 margin-top의 지정된 값은 auto로 취급됩니다.
  4. 지금 정확히 하나의 값만 auto로 지정되어 있다면, 그 사용된 값은 등식으로부터 결정됩니다.
  5. 만약 height가 auto로 설정되어 있다면, 다른 auto 값들은 0이 되고 height는 결과 등식으로부터 결정됩니다.
  6. 만약 margin-top과 margin-bottom이 둘 다 auto라면, 그들의 사용된 값은 서로 같습니다. 이는 페이지 여백 내에서 페이지 여백 박스 콘텐츠를 수직으로 중앙에 배치합니다.

동일한 규칙들이 하단 페이지 여백 박스들(bottom-left-corner, bottom-left, bottom-center, bottom-right, 및 bottom-right-corner)에 적용되지만, 과도하게 제약된 경우에는 margin-top 대신 margin-bottom이 무시됩니다.

유사한 규칙들이 왼쪽 및 오른쪽 페이지 여백 박스들의 속성을 너비에 관하여 지배합니다(top-left-corner, left-top, left-middle, left-bottom, bottom-left-corner; top-right-corner, right-top, right-middle, right-bottom, bottom-right-corner). 이 경우에는 "top"이 "left"로, "bottom"이 "right"로, "height"가 "width"로 각각 대체됩니다. 왼쪽(오른쪽) 페이지 여백 박스의 과도하게 제약된 경우에는 지정된 margin-left (margin-right)이 무시됩니다.

5.4. 페이지 여백 박스 예시

다음은 페이지 여백 박스 사용 예시 모음입니다.

다음은 상단 왼쪽 헤더만 있는 페이지의 예입니다:
@page {
  @top-left { content: "Header in Left Cell (top-left)" }
}

top-center 또는 top-right 페이지 여백 박스에 정의된 내용이 없기 때문에, top-left 페이지 여백 박스의 범위는 페이지 박스의 중앙을 넘을 수 있습니다.

Header Example 1

다음은 가운데 정렬된 헤더가 있는 페이지의 예입니다:
@page {
  @top-center { content: "Header in Center Cell (top-center)" }
}

Header Example 2

다음은 top-right 페이지 여백 박스에 단일 헤더가 있는 페이지의 예입니다:
@page {
  @top-right { content: "Header in Right Cell (top-right)" }
}

가운데 셀의 내용이 비어 있으므로 top-right 페이지 여백 박스의 범위는 페이지 박스의 중앙을 넘을 수 있습니다.

Header Example 3

다음은 top-center와 top-left 헤더가 있는 페이지의 예입니다:
@page {
  @top-left { content: "Left Cell (top-left)" }
  @top-center { content: "Header in Center Cell (top-center)" }
}

Header Example 4

다음은 top-center와 top-right 헤더가 있는 페이지의 예입니다:
@page {
  @top-center { content: "Header in Center Cell (top-center)" }
  @top-right { content: "Right Cell (top-right)" }
}
margin: 10%;

Header Example 5

다음은 top-left와 top-right 헤더가 있는 페이지의 예입니다:
@page {
  @top-left { content: "Header in top-left with approx. twice as many words as right cell." }
  @top-right { content: "Right cell (top-right)" }
}

가운데 셀의 내용이 없기 때문에 top-left의 범위는 페이지 박스의 중앙을 넘을 수 있습니다.

Header Example 6

6. 페이지 속성

부록 A는 페이지 박스에 적용되는 CSS 2.1의 규범적 속성 목록을 정의합니다([CSS2]). 준수하는 사용자 에이전트가 이러한 속성들 중 블록 박스에 대해 어떤 것을 지원한다면, 그 속성은 page context에서도 지원해야 합니다. 이 명세서는 또한 페이지 문맥에서만 적용되는 size 속성을 정의합니다.

페이지 여백 박스에 적용되는 속성들은 페이지 문맥 내에서도 설정할 수 있습니다: 상속 가능하거나 명시적으로 상속된 경우(inherit 키워드를 margin context에서 사용), 그것들은 페이지 여백 박스에 상속됩니다.

같은 부록은 페이지 여백 박스에 적용되는 CSS 2.1의 규범적 속성 목록도 정의합니다. 준수하는 사용자 에이전트가 이러한 속성들 중 블록 박스에 대해 어떤 것을 지원한다면, 그 속성은 margin context에서도 지원해야 합니다.

다른 CSS2에 정의된 속성들은 이러한 문맥에서는 적용되지 않습니다. CSS 2.1에 포함되지 않은 속성들의 동작은 정의되어 있지 않습니다.

참고: 다른 속성을 정의하지 않은 의도는 적절한 CSS3 속성이 등장함에 따라 이 명세를 매번 업데이트하지 않고 점진적으로 추가할 수 있게 하기 위함입니다.

문서의 요소들과 마찬가지로, 페이지 문맥과 마진 문맥은 해당 문맥에 적용되지 않는 속성이라도 모든 속성에 대해 계산된 값을 가집니다.

일반적인 CSS 속성 규칙이 적용되며 다음 예외가 있습니다:

사용자 에이전트는 비인쇄 가능 영역을 포함하는 사용자 에이전트 스타일시트를 통해 기본 페이지 여백을 설정해야 합니다. 저자들은 기본 페이지 영역이 인쇄 불가능 영역을 포함하지 않을 것이라고 가정해야 합니다.

6.1. 페이지 기반 카운터

카운터는 @page 규칙 내에서 정의 및 제어될 수 있으며, 페이지 여백 박스의 content로 사용할 수 있습니다. 이는 페이지 수를 유지하는 데 유용합니다.

페이지 또는 마진 문맥 내의 counter-increment은 각 page box가 생성될 때 카운터를 증가시킵니다.

카운터가 페이지 문맥 내에서 리셋되거나 증가되면, 그것은 모든 페이지 여백 박스의 범위에 들어가며 문서 내 같은 이름의 모든 카운터를 가립니다.

카운터가 마진 문맥 내에서 리셋되거나 증가되면, 그것은 그 페이지 여백 박스의 범위에 들어가고 페이지 문맥 및 문서의 같은 이름 카운터들을 가립니다.

마진 문맥이나 페이지 문맥에서 리셋 또는 증가되지 않은 카운터가 margin context에서 counter() 또는 counters()에 의해 사용된다면, 그 결과 값은 페이지 여백 박스가 페이지 시작 시 문서 내의, 페이지 분할을 가로지르는 정상 흐름의 가장 깊은 요소 내부에 있는 요소인 것과 정확히 동일하게 간주됩니다. 이렇게 카운터를 사용하는 것은 카운터 값 계산에 영향을 주지 않습니다.

page라는 이름의 카운터는 자동으로 생성되며 문서의 모든 페이지에서 1씩 증가합니다. 단, counter-increment 속성이 page context에서 page 카운터에 대해 다른 증가값을 명시적으로 지정하면 예외입니다. 암시된 page 카운터는 실제 카운터이며, 해당 이름을 명시적으로 사용해 counter-increment 및 counter-reset 속성으로 직접 영향을 줄 수 있습니다. 또한 counter() 및 counters() 함수 형태에서 사용할 수 있습니다.

다음 규칙들은 각 페이지의 바깥쪽 여백 가운데에 현재 페이지 번호를 배치합니다.
@page {
  margin: 10%;

  @top-center {
    font-family: sans-serif;
    font-weight: bold;
    font-size: 2em;
    content: counter(page);
  }
}

다음 규칙을 추가하면 모든 페이지가 짝수 번호가 됩니다.

@page {
  counter-increment: page 2;
}

추가로, pages라는 이름의 카운터는 UA에 의해 자동으로 생성됩니다. 이 값은 항상 문서의 전체 페이지 수입니다. (연속 매체에서는 항상 1입니다.) pages 값은 조작할 수 없습니다: counter-reset 및 counter-increment 문이 이를 설정하더라도 유효하지만 아무 영향이 없습니다.

그 밖의 모든 면에서 페이지 관련 카운터는 [CSS2], 중첩 카운터와 스코프 및 카운터에 대해 설명된 대로 동작합니다.

6.2. 페이지 여백 박스와 기본값

페이지 또는 마진 문맥 내에서 사용되는 속성들은 해당 속성 정의에서 초기값을 가져옵니다; 그러나 사용자 에이전트는 다음 표의 값들이 UA 기본 스타일시트의 규칙으로 설정된 것처럼 동작해야 합니다.

표 2. 페이지 여백 박스의 기본값
페이지 여백 박스 text-align vertical-align
top-left-corner right middle
top-left left middle
top-center center middle
top-right right middle
top-right-corner left middle
left-top center top
left-middle center middle
left-bottom center bottom
right-top center top
right-middle center middle
right-bottom center bottom
bottom-left-corner right middle
bottom-left left middle
bottom-center center middle
bottom-right right middle
bottom-right-corner left middle
다음 스타일시트 예시는 현재 챕터 이름을 가운데 정렬된 헤더로 생성하는 데 사용될 수 있습니다:
body {counter-reset: chapter;}
div.chapter {counter-increment: chapter;}
@page {
  margin: 10%;
  @top-center { content: "Chapter" counter(chapter) }
}

7. 페이지 크기

전 세계적으로 많은 다른 용지 크기가 사용됩니다. 이 명세의 목표 중 하나는 웹 콘텐츠가 각 용지 크기에 대해 별도의 스타일시트를 작성하지 않고도 다양한 크기에 적응할 수 있도록 하는 것입니다.

그러나 어떤 상황에서는 특정 페이지 크기가 특정한 스타일을 달성하는 것이 중요할 수 있습니다. 이 목표를 달성하는 한 가지 방법은 문서가 특정 크기의 표면에 우선적으로 표시되어야 함을 나타내는 size 속성을 활용하는 것이고, 다른 방법은 Media Queries를 사용하여 다른 페이지 크기에 서로 다른 스타일시트를 적용하는 것입니다.

7.1. 페이지 크기: size 속성

Name: size
For: @page
Value: <length>{1,2} | auto | [ <page-size> || [ portrait | landscape ] ]
Initial: auto
Computed value: 지정된 값, <length>s가 절대값으로 변환된 값.

이 속성은 page box의 containing block의 대상 크기와 방향을 지정합니다. 일반적인 경우, 하나의 page box가 하나의 page sheet에 렌더링될 때, size 속성은 대상 페이지 시트의 크기도 나타냅니다.

페이지 박스의 크기는 "절대"(고정 크기) 또는 "확장 가능"(즉 사용 가능한 시트 크기에 맞춤)일 수 있습니다. 아래 표의 처음 세 값은 확장 가능한 페이지 박스를 만드는 데 사용될 수 있습니다. 다른 값들은 고정 크기 페이지 박스를 정의하며, 따라서 선호되는 출력 매체 크기를 나타냅니다. 가능하면 출력은 지정된 매체 크기에 렌더링되어야 합니다. 지정된 크기를 사용할 수 없는 경우, 페이지 박스를 다른 크기로 변환하는 규칙이 적용됩니다.

만약 size 선언이 width, height, device-width, device-height, aspect-ratio, device-aspect-ratio 또는 orientation 미디어 쿼리(또는 용지 크기에 대한 다른 조건)로 한정되어 있다면, 그 선언은 무시되어야 합니다. 미디어 쿼리는 size를 존중하지 않습니다: 미디어 쿼리는 어떤 @page 규칙도 지정되지 않은 경우 선택될 용지 크기를 가정합니다.

최소한 한정되지 않은 @page에 지정된 크기에 대해 미디어 쿼리가 응답할 수 있다면 유용할 것입니다.

다른 옵션으로는 @viewport 규칙처럼 하는 것이 있을 수 있습니다: 먼저 @page 규칙을 적용(어떤 선택자와 매칭할지?)하고, UA의 기본 페이지 크기를 Media Queries와 뷰포트 퍼센트 길이에 사용합니다. 결과 페이지 크기를 "base page size"라 합니다. 스타일시트 집합 전체를 다시 적용하되 이번에는 Media Queries와 뷰포트 퍼센트 길이에 "base page size"를 사용합니다.

다음 예시에서
@page {
  size: 4in 6in;
}

@media (max-width: 6in) {
  @page {
    size: letter;
  }
}

두 번째 size 선언은 무시됩니다. 즉, 지정된 size 속성 값은 4in 6in입니다.

auto
페이지 박스는 UA가 선택한 크기와 방향으로 설정됩니다. 일반적인 경우 페이지 박스 크기와 방향은 대상 매체 시트와 일치하도록 선택됩니다.
landscape
페이지의 내용이 가로 방향으로 인쇄되도록 지정합니다. 페이지 박스의 긴 쪽이 수평입니다. <page-size>가 지정되지 않으면, 페이지 시트의 크기는 UA가 선택합니다.
portrait
페이지의 내용이 세로 방향으로 인쇄되도록 지정합니다. 페이지 박스의 짧은 쪽이 수평입니다. <page-size>가 지정되지 않으면, 페이지 시트의 크기는 UA가 선택합니다.
<length>
페이지 박스는 주어진 절대 치수로 설정됩니다. 하나의 length 값만 지정되면 너비와 높이 모두를 설정하여 정사각형이 됩니다. 두 개의 length 값이 지정되면 첫 번째는 페이지 박스의 너비를, 두 번째는 높이를 정합니다. em 및 ex 단위의 값은 페이지 문맥의 글꼴을 참조합니다. 음수 길이는 허용되지 않습니다.
<page-size>
페이지 크기는 다음의 미디어 이름들 중 하나를 사용하여 지정할 수 있습니다. 이는 길이 값을 사용하는 size 지정과 동등합니다. 미디어 이름의 정의는 Media Standardized Names에서 가져왔습니다.
A5
ISO A5 매체 크기와 동등: 너비 148mm, 높이 210mm.
A4
ISO A4 매체 크기와 동등: 너비 210mm, 높이 297mm.
A3
ISO A3 매체 크기와 동등: 너비 297mm, 높이 420mm.
B5
ISO B5 매체 크기와 동등: 너비 176mm, 높이 250mm.
B4
ISO B4 매체 크기와 동등: 너비 250mm, 높이 353mm.
JIS-B5
JIS B5 매체 크기와 동등: 너비 182mm, 높이 257mm.
JIS-B4
JIS B4 매체 크기와 동등: 너비 257mm, 높이 364mm.
letter
북미 letter 매체 크기와 동등: 너비 8.5인치, 높이 11인치.
legal
북미 legal 매체 크기와 동등: 너비 8.5인치, 높이 14인치.
ledger
북미 ledger 매체 크기와 동등: 너비 11인치, 높이 17인치.

<page-size> 이름들은 landscape 또는 portrait과 함께 사용되어 크기와 방향을 모두 지정할 수 있습니다.

@page {
size: A4 landscape;
}

위 예시는 페이지 박스의 너비를 297mm, 높이를 210mm로 설정합니다. 이 예의 페이지 박스는 210mm x 297mm 크기의 페이지 시트에 렌더링되어야 합니다.

다음 예에서는 페이지 박스의 외부 가장자리가 페이지와 정렬됩니다. margin 속성의 백분율 값은 페이지 크기를 기준으로 하므로 페이지 시트 치수가 210mm x 297mm(A4)라면 여백은 21mm 및 29.7mm가 됩니다. UA 기본 스타일시트에 페이지 테두리나 패딩이 설정되어 있지 않다고 가정하면 결과 페이지 영역은 189mm x 267.3mm(210mm-21mm x 297mm-29.7mm)입니다.
@page {
size: auto;/* auto is the initial value */
margin: 10%;
}
@page {
size: 8.5in 11in;/* width height */
}

위 예시는 페이지 박스의 너비를 8.5인치, 높이를 11인치로 설정합니다. 이는 페이지 시트 크기가 8.5"x11"이고 방향이 portrait임을 나타냅니다.

7.1.1. 미디어 쿼리

이 절은 정보 제공용입니다.

미디어 쿼리 [MEDIAQ]를 사용하면 하나의 스타일시트로 서로 다른 페이지 크기에 대한 다양한 스타일 선호를 표현할 수 있습니다. 예를 보십시오:

/* style sheet for "A4" printing */
@media print and (width: 21cm) and (height: 29.7cm) {
  @page {
     margin: 3cm;
  }
 }

/* style sheet for "letter" printing */
@media print and (width: 8.5in) and (height: 11in) {
  @page {
  margin: 1in;
  }
}

위 예에서 "A4" 용지에는 "3cm" 페이지 여백이, "letter" 용지에는 "1in" 페이지 여백이 주어집니다.

7.1.2. 인쇄 페이지 회전: page-orientation 속성

Name: page-orientation
For: @page
Value: upright | rotate-left | rotate-right
Initial: upright
Computed value: 지정된 대로

고품질 인쇄 구현은 서로 다른 크기와 방향의 페이지를 처리할 수 있으므로, 저자는 각 페이지의 내용에 가장 적합한 페이지 크기를 선택할 수 있습니다. 예를 들어, 대부분의 페이지에는 size: letter portrait;를 사용하고, 넓은 정보 표 레이아웃에는 size: letter landscape;로 전환할 수 있습니다.

그러나 서로 다른 너비의 페이지에 걸쳐 흐르는 콘텐츠를 처리하는 것은 상대적으로 복잡한 작업이며, 많은 인기 있는 인쇄 구현(특히 웹 브라우저)에서는 아직 완전히 해결되지 않았습니다. page-orientation 기술자는 그러한 구현을 돕기 위해 고안되었으며, 레이아웃은 단일 일관된 크기로 수행하되, 출력 매체(예: PDF)에서 레이아웃 후에 방향을 변경하여 다른 방향으로 표시하고자 하는 페이지들이 그렇게 보이도록 할 수 있게 합니다.

그 값들은 다음과 같이 정의됩니다:

upright

특별한 방향이 적용되지 않습니다; 페이지는 평상시처럼 레이아웃되고 포맷됩니다.

rotate-left

페이지가 레이아웃된 후, 출력 매체가 회전을 지원하면, 이 값은 페이지가 레이아웃된 방식에서 왼쪽으로 90도(반시계 방향) 회전되어 표시되어야 함을 나타냅니다.

rotate-right

rotate-left과 동일하나, 페이지는 레이아웃된 방식에서 오른쪽으로 90도(시계 방향) 회전되어 표시되어야 합니다.

참고: 여백 상자 및 기타 위치 관련 요소들은 이 속성과 특별한 상호작용이 없습니다; 회전되지 않은 페이지에서 평상시처럼 레이아웃된 다음, 다른 모든 요소들과 함께 회전됩니다.

이 속성은 기능이 제한적인 구현을 위한 임시 수단으로 의도되었으며, 서로 다른 세로/가로 혼합 문서를 여전히 인쇄할 수 있게 합니다, 서로 다른 크기의 페이지에 걸쳐 콘텐츠를 흐르게 하는 기능이 구현되기 전에 사용할 수 있습니다. 사용하려면 약간 불편한 꼼수가 필요할 수 있으며, 예를 들어 영어만 포함한 넓은 표를 "옆으로" 레이아웃되도록 하기 위해 실제로는 수직 writing-mode를 지정한 다음, 인쇄 출력에서 가독성을 위해 다시 정방향으로 회전시키는 식의 사용이 요구될 수 있습니다.

고품질 인쇄 구현에서는 이 속성을 사용할 필요가 없어야 하며; 대신 size를 사용하여 페이지의 portraitlandscape 방향을 제어하십시오.

7.2. 재단 및 등록 표시: marks 속성

Name: marks
For: @page
Value: none | [ crop || cross ]
Initial: none
Computed value: 지정된 대로

이 속성은 문서에 재단(crop) 및/또는 등록(registration) 표시를 추가합니다. 이는 용지의 재단 및 정렬을 쉽게 하기 위해 페이지 박스 바깥에 인쇄됩니다. 값의 의미는 다음과 같습니다:

none
재단 표시나 등록 표시가 인쇄되지 않음을 지정합니다: bleed area 밖 영역은 완전히 비어있습니다.
crop
재단 표시가 인쇄되어야 함을 지정합니다. 이는 일반적으로 페이지 박스의 네 모서리 외부에 짧은 선으로, 페이지 박스의 네 가장자리 위치를 잉크를 페이지 박스 안에 놓지 않고 표시합니다.
cross
등록 표시가 인쇄되어야 함을 지정합니다. 이는 일반적으로 페이지 박스 각 가장자리 밖에 있는 십자형 표식으로, 인쇄 과정에서 용지 정렬에 사용됩니다.

페이지 박스가 인쇄 가능 영역보다 작을 때에만 재단 표시와 등록 표시가 보인다는 점에 유의하십시오.

문서에 재단 및 등록 표시를 설정하려면 다음 코드를 사용할 수 있습니다:
@page { marks: crop cross }

7.3. 블리드 영역: bleed 속성

Name: bleed
For: @page
Value: auto | <length>
Initial: auto
Computed value: 지정된 대로

이 속성은 페이지 박스 밖의 bleed area의 범위를 지정합니다; 즉 페이지 렌더링이 잘려 나가는 페이지 박스 바깥의 범위를 말합니다. 값의 의미는 다음과 같습니다:

auto
markscrop이면 6pt로 계산되고, 그렇지 않으면 0으로 계산됩니다.
<length>
각 방향으로 페이지 박스를 얼마나 벗어나 블리드 영역이 확장되는지를 지정합니다. 값은 음수일 수 있으나 구현별로 제한이 있을 수 있습니다.

7.4. 페이지 시트에 맞지 않는 페이지 박스 렌더링

페이지 박스가 대상 페이지 시트 치수와 일치하지 않는 경우, 사용자 에이전트는 다음 중 하나를 수행해야 합니다(선호 순서대로):

  1. 지정된 크기로 더 큰 페이지 시트에 페이지 박스를 렌더링합니다.
  2. 페이지 박스가 페이지 시트에 맞는다면 페이지 박스를 90° 회전시킵니다.
  3. 페이지 박스의 가로세로 비율을 유지하면서 페이지 시트에 맞게 페이지 박스를 축소합니다.
  4. 그래픽적으로 페이지 박스를 여러 페이지 시트에 "슬라이스"합니다.
  5. 오버플로된 내용을 잘라냅니다(가장 덜 선호).

사용자 에이전트는 이러한 작업을 수행하기 전에 사용자와 상의하는 것이 좋습니다.

7.5. 시트 위의 페이지 박스 배치

페이지 박스가 페이지 시트보다 작은 경우, 사용자 에이전트는 다음 중 하나를 수행해야 합니다:

사용자 에이전트는 이와 관련하여 사용자와 상의하는 것이 좋습니다.

8. 페이지 구분

CSS Fragmentation Module [CSS-BREAK-3] 모듈은 페이지 분할을 포함하여 CSS 박스들이 어떻게 그리고 어디에서 분절(fragmented)될 수 있는지를 정의합니다. 이 모듈은 사용자 에이전트가 페이지를 어디에서 또는 반드시 중단할 수 있는지를 나타내는 몇몇 속성들과, 다음 콘텐츠가 어느 페이지(왼쪽 또는 오른쪽)에서 재개되는지를 정의합니다. 각 페이지 분할은 현재 page box의 레이아웃을 종료시키며 문서 트리의 남은 부분들은 새 페이지 박스에서 레이아웃됩니다.

8.1. 이름 있는 페이지 사용: page

Name: page
Value: auto | <custom-ident>
Initial: auto
Applies to: class A 분기점(class A break points)을 생성하는 박스들
Inherited: 아니오(단, 본문 참조)
Percentages: 해당 없음
Computed value: 지정된 값
Canonical order: 문법에 따름
Animation type: discrete

page 속성은 요소가 표시되어야 할 특정 종류의 페이지(이를 named page)를 지정하는 데 사용됩니다. 필요하면 강제 페이지 분할이 도입되어 지정된 타입의 새 페이지가 생성됩니다.

참고: 이 페이지는 동일한 타입 이름을 페이지 선택자에서 사용하여 스타일링할 수 있습니다.

페이지 타입 이름은 대소문자를 구별하는 식별자입니다. 그러나 auto 값은 CSS 키워드이므로 ASCII 대소문자 구분 없음입니다.

page 속성은 상속되지 않습니다. 그러나 요소의 page 값이 auto이면, 그 사용된 값은 비-자동 값을 가진 가장 가까운 조상에 지정된 값이 됩니다. 루트 요소에 지정된 경우, auto의 사용된 값은 빈 문자열입니다.

이전 버전의 명세는 page 속성이 상속된다고 명시했으므로, page 속성을 상속하고 auto를 항상 빈 문자열로 처리하는 구현도 CSS Paged Media Level 3에 적합합니다. 이 예외는 Level 4에서 제거될 예정입니다. 따라서 저자들은 비-auto 값을 가진 요소의 자손에 대해 명시적으로 auto 값을 지정하지 않아야 합니다. 그 결과 동작이 예측 불가능할 수 있습니다.

page 속성은 다음과 같이 동작합니다:

  1. 먼저, 모든 auto 값들은 비-auto 조상에 대해 해결됩니다(위에서 지정한 대로).
  2. 다음으로, 각 박스에 대해 시작 page 값(start page value)과 끝 page 값(end page value)이, 각각 그 박스의 첫 번째 또는 마지막 자식 박스(각각)로부터 전파된 값(있다면)으로 결정되며, 그렇지 않으면 박스 자체의 사용된 값입니다. 자식은 자신의 start 또는 end page value를 전파하는데, 이는 page 속성이 그에게 적용될 때에만 해당합니다.

    참고: 첫 번째 또는 마지막 자식 박스는 항상 첫 번째 또는 마지막 자식 요소에 의해 생성되는 것은 아닙니다. 예를 들어, 어떤 요소는 이전 형제가 'display: none'만 갖고 있어 어떤 박스도 생성하지 않을 수 있습니다.

  3. 루트의 시작 페이지 값이 첫 번째 인쇄 페이지의 타입입니다.
  4. 만약 class A 분기점에서 만나는 두 박스에 대해, 분할 이전의 박스의 end page value와 분할 이후의 박스의 start page value가 일치하지 않는다면, 두 박스 사이에 페이지 분할이 강제되고, 분할 이후의 내용은 지정된 타입의 페이지 박스에서 재개됩니다.

참고: 본질적으로 비교되는 두 page 값은 class A 분기점에서 만나는 가장 깊은 박스들로부터 온 값들이며, page 속성이 적용되지 않는 박스들로 루트된 어떤 서브트리도 무시합니다.

페이지 분할에 대한 추가 세부사항은 [CSS-BREAK-3]를 참조하십시오.

이 예에서는 두 표가 모두 가로(landscape) 페이지에 렌더링됩니다(실제로는 함께 하나의 페이지에 들어갈 수도 있습니다). 두 번째 표 이후의 <p>는 표 요소에 대한 페이지 속성이 더 이상 적용되지 않으므로 페이지 타입 "narrow"에서 렌더링됩니다:
@page narrow { size: 9cm 18cm }
@page rotated { size: landscape }
div { page: narrow }
table { page: rotated }
with this document:
<div>
<table>...</table>
<table>...</table>
<p>This text is rendered on a 'narrow' page</p>
</div>
일본어 문서에서는 하나의 문서 내에서 서로 다른 부분들이 서로 다른 kihon hanmen을 가질 때가 있습니다. [JLREQ] page 속성은 @page 규칙들과 함께 서로 다른 페이지 너비를 지정하여 이러한 유형의 레이아웃을 수용할 수 있습니다:
<!DOCTYPE html>
<html lang="ja">
  <style>
    html   {
      writing-mode: vertical-rl;
      line-height: 1.6;
    }
    .main  {
      page: main;
      columns: 2;
      column-gap: 1rem;
    }
    .index {
      page: index;
      columns: 3;
      column-gap: 1rem;
    }
    @page {
      margin: auto;  /* center kihon hanmen on page */
      width:  40rem; /* 1.6 × 25 lines        */
    }
    @page main  { height: 61rem; } /* 2 × 30 chars + 1 × gap */
    @page index { height: 62rem; } /* 3 × 20 chars + 2 × gap */
  </style>
  <section class="main"> ... </section>
  <section class="index"> ... </section>
</html>

9. 이미지 속성

Note: 이 절은 [CSS-IMAGES-3]로 옮겨졌습니다.

부록 A: 적용 가능한 CSS2.1 속성

페이지 문맥에 적용되는 CSS 2.1 속성

이 목록은 page properties를 정의합니다. 이들은 § 6 페이지 속성에서 더 자세히 설명됩니다.

bidi properties direction
background properties background-color
background-image
background-repeat
background-attachment
background-position
background
border properties border-top-width
border-right-width
border-bottom-width
border-left-width
border-width
border-top-color
border-right-color
border-bottom-color
border-left-color
border-color
border-top-style
border-right-style
border-bottom-style
border-left-style
border-style
border-top
border-right
border-bottom
border-left
border
counter properties counter-reset
counter-increment
color
font properties font-family
font-size
font-style
font-variant
font-weight
font
height properties height
min-height
max-height
line-height
margin properties margin-top
margin-right
margin-bottom
margin-left
margin
outline properties outline-width
outline-style
outline-color
outline
padding properties padding-top
padding-right
padding-bottom
padding-left
padding
quotes
text properties letter-spacing
text-align
text-decoration
text-indent
text-transform
white-space
word-spacing
visibility
width properties width
min-width
max-width

페이지 여백 문맥에 적용되는 CSS 2.1 속성

이 목록은 page-margin properties를 정의합니다. 이들은 § 6 페이지 속성에서 더 자세히 설명됩니다.

bidi properties direction
unicode-bidi
background properties background-color
background-image
background-repeat
background-attachment
background-position
background
border properties border-top-width
border-right-width
border-bottom-width
border-left-width
border-width
border-top-color
border-right-color
border-bottom-color
border-left-color
border-color
border-top-style
border-right-style
border-bottom-style
border-left-style
border-style
border-top
border-right
border-bottom
border-left
border
counter properties counter-reset
counter-increment
content
color
font properties font-family
font-size
font-style
font-variant
font-weight
font
height properties height
min-height
max-height
line-height
margin properties margin-top
margin-right
margin-bottom
margin-left
margin
outline properties outline-width
outline-style
outline-color
outline
overflow
padding properties padding-top
padding-right
padding-bottom
padding-left
padding
quotes
text properties letter-spacing
text-align
text-decoration
text-indent
text-transform
white-space
word-spacing
vertical-align
visibility
width properties width
min-width
max-width
z-index

부록 B: 전송 가능성

종종(그러나 항상은 아니며) 페이지 박스는 문서가 최종적으로 렌더링되는 물리적 표면과 일대일 대응합니다. CSS3 페이지 모델은 페이지 박스 내에서의 포맷팅을 지정하지만, 페이지 박스를 시트로 전송하는 책임은 사용자 에이전트에게 있습니다. CSS3에서 다루지 않는 일부 사용자 에이전트 전송 가능성에는 다음이 포함됩니다:

개인정보 및 보안 고려사항

이 명세서는 새로운 개인정보 또는 보안 고려사항을 도입하지 않습니다.

변경사항

2018년 10월 18일 작업 초안(Working Draft) 이후의 변경사항은 다음과 같습니다:

2013년 3월 14일 작업 초안 이후의 변경사항은 다음과 같습니다:

감사의 글

CSS 작업 그룹은 이 모듈의 전 편집자들에게 특별한 감사를 표합니다: Robert Stevahn (Hewlett-Packard), Håkon Wium Lie (Opera Software), Jim Bigelow (Hewlett-Packard), Jacob Refstrup (Hewlett-Packard), 그리고 Melinda Grant (Hewlett-Packard).

또한 전문가 기여자들인 Michael Day (YesLogic), Shinyu Murakami (Antenna House), Peter Linss (Hewlett-Packard), 및 CSS 작업 그룹과 www-style 커뮤니티의 다른 구성원들이 CSS Paged Media Level 3에 대해 리뷰와 코멘트를 제공해 주신 것에 대해 감사드립니다.

적합성(Conformance)

문서 약속

적합성 요구사항은 설명적 주장과 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"로 규범적 텍스트와 구분됩니다, 예:

참고, 이것은 정보 제공용 주석입니다.

권고(advisements)는 특별한 주의를 환기시키기 위해 규범적 섹션으로 스타일링되며 <strong class="advisement">으로 다른 규범적 텍스트와 구분됩니다, 예: 사용자 에이전트는 접근 가능한 대체안을 제공해야 합니다.

적합성 클래스

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

style sheet
CSS 스타일 시트.
renderer
스타일 시트의 의미를 해석하고 문서를 렌더링하는 UA.
authoring tool
스타일 시트를 작성하는 UA.

스타일 시트가 이 명세서의 문법을 사용한 모든 문장이 일반 CSS 문법과 각 기능의 개별 문법에 따라 유효하다면 그 스타일 시트는 적합합니다.

렌더러가 적합하려면, 스타일 시트를 적절한 명세들에 따라 해석하는 것 외에, 이 명세서에서 정의한 모든 기능을 구문 분석하고 문서를 그에 따라 렌더링하는 기능을 지원해야 합니다. 다만 장치의 제약으로 인해 문서를 올바르게 렌더링하지 못하는 경우에도 UA가 비적합으로 간주되지는 않습니다. (예: 흑백 모니터에서 색을 렌더링할 의무는 없습니다.)

작성 도구는 이 모듈의 각 기능에 대한 일반 CSS 문법과 개별 문법에 따라 구문적으로 올바른 스타일 시트를 작성하고, 이 모듈에서 정의된 스타일 시트의 적합성 요구사항을 모두 충족하면 적합합니다.

부분 구현

저자들이 전방 호환성 파싱 규칙을 활용하여 폴백 값을 할당할 수 있도록, CSS 렌더러는 지원 수준이 없는 at-rule, 속성, 속성값, 키워드 및 기타 문법적 구성요소를 유효하지 않은 것으로 처리하고(필요시 무시)야 합니다. 특히, 사용자 에이전트는 지원되지 않는 구성값을 선택적으로 무시하고 지원되는 값을 단일 다중값 속성 선언 내에서 존중해서는 안 됩니다: 어떤 값이 무효로 간주되면 전체 선언은 무시되어야 합니다.

불안정 및 독점 기능의 구현

미래의 안정된 CSS 기능과 충돌을 피하기 위해, CSSWG는 불안정 기능 및 독점 확장을 구현할 때 모범 사례를 따를 것을 권장합니다.

비실험적 구현

명세서가 Candidate Recommendation 단계에 도달하면 비실험적 구현이 가능해지고, 구현자는 CR 수준의 기능을 명세에 따라 올바르게 구현했음을 입증할 수 있으면 접두어 없는 구현을 릴리스해야 합니다.

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

테스트케이스 및 구현 보고서 제출에 대한 추가 정보는 CSS 작업 그룹 웹사이트 https://www.w3.org/Style/CSS/Test/에서 찾을 수 있습니다. 질문은 public-css-testsuite@w3.org 메일링 리스트로 보내주십시오.

색인

이 명세서에서 정의한 용어

참고 문헌에서 정의된 용어

참고문헌

규범적 참고문헌

[CSS-ANCHOR-POSITION-1]
Tab Atkins Jr.; Ian Kilpatrick. CSS Anchor Positioning. 29 June 2023. WD. URL: https://www.w3.org/TR/css-anchor-position-1/
[CSS-BACKGROUNDS-3]
Bert Bos; Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 14 February 2023. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-BOX-3]
Elika Etemad. CSS Box Model Module Level 3. 6 April 2023. REC. URL: https://www.w3.org/TR/css-box-3/
[CSS-BOX-4]
Elika Etemad. CSS Box Model Module Level 4. 3 November 2022. WD. URL: https://www.w3.org/TR/css-box-4/
[CSS-BREAK-3]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 3. 4 December 2018. CR. URL: https://www.w3.org/TR/css-break-3/
[CSS-BREAK-4]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 4. 18 December 2018. WD. URL: https://www.w3.org/TR/css-break-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 13 January 2022. CR. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-CONTENT-3]
Elika Etemad; Dave Cramer. CSS Generated Content Module Level 3. 2 August 2019. WD. URL: https://www.w3.org/TR/css-content-3/
[CSS-DISPLAY-3]
Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 3. 30 March 2023. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-FONTS-4]
John Daggett; Myles Maxfield; Chris Lilley. CSS Fonts Module Level 4. 21 December 2021. WD. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-INLINE-3]
Dave Cramer; Elika Etemad. CSS Inline Layout Module Level 3. 1 April 2023. WD. URL: https://www.w3.org/TR/css-inline-3/
[CSS-POSITION-3]
Elika Etemad; Tab Atkins Jr.. CSS Positioned Layout Module Level 3. 3 April 2023. WD. URL: https://www.w3.org/TR/css-position-3/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS Box Sizing Module Level 3. 17 December 2021. WD. URL: https://www.w3.org/TR/css-sizing-3/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 24 December 2021. CR. URL: https://www.w3.org/TR/css-syntax-3/
[CSS-TEXT-3]
Elika Etemad; Koji Ishii; Florian Rivoal. CSS Text Module Level 3. 3 September 2023. CR. URL: https://www.w3.org/TR/css-text-3/
[CSS-TEXT-4]
Elika Etemad; et al. CSS Text Module Level 4. 29 March 2023. WD. URL: https://www.w3.org/TR/css-text-4/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 1 December 2022. 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. 6 April 2023. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-3]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 3. 10 December 2019. REC. URL: https://www.w3.org/TR/css-writing-modes-3/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 30 July 2019. 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. 7 June 2011. REC. URL: https://www.w3.org/TR/CSS21/
[CSS22]
Bert Bos. Cascading Style Sheets Level 2 Revision 2 (CSS 2.2) Specification. 12 April 2016. WD. URL: https://www.w3.org/TR/CSS22/
[MEDIAQ]
Florian Rivoal; Tab Atkins Jr.. Media Queries Level 4. 25 December 2021. CR. URL: https://www.w3.org/TR/mediaqueries-4/
[MEDIAQUERIES-5]
Dean Jackson; et al. Media Queries Level 5. 18 December 2021. WD. URL: https://www.w3.org/TR/mediaqueries-5/
[PWGMSN]
Ron Bergman; Tom Hastings. Media Standardized Names. 26 February 2002. IEEE ISTO Printer Working Group 5101.1-2002. URL: ftp://ftp.pwg.org/pub/pwg/candidates/cs-pwgmsn10-20020226-5101.1.pdf
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECT]
Tantek Çelik; et al. Selectors Level 3. 6 November 2018. REC. URL: https://www.w3.org/TR/selectors-3/
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 11 November 2022. WD. URL: https://www.w3.org/TR/selectors-4/

정보성 참고문헌

[CSS-DEVICE-ADAPT]
Rune Lillesveen; Florian Rivoal; Matt Rakow. CSS Device Adaptation Module Level 1. 29 March 2016. WD. URL: https://www.w3.org/TR/css-device-adapt-1/
[CSS-IMAGES-3]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS Images Module Level 3. 17 December 2020. CR. URL: https://www.w3.org/TR/css-images-3/
[CSS3GCPM]
Dave Cramer. CSS Generated Content for Paged Media Module. 13 May 2014. WD. URL: https://www.w3.org/TR/css-gcpm-3/
[JLREQ]
Hiroyuki Chiba; et al. Requirements for Japanese Text Layout 日本語組版処理の要件(日本語版). 11 August 2020. NOTE. URL: https://www.w3.org/TR/jlreq/

속성 색인

이름 초기값 적용 대상 상속 백분율 애니메이션 유형 정규 순서 계산된 값
page auto | <custom-ident> auto class A 분기점을 생성하는 박스 아니오(본문 참조) 해당 없음 discrete 문법에 따름 지정된 값

@page 기술자 표

이름 초기값 계산된 값
bleed auto | <length> auto 지정된 대로
marks none | [ crop || cross ] none 지정된 대로
page-orientation upright | rotate-left | rotate-right upright 지정된 대로
size <length>{1,2} | auto | [ <page-size> || [ portrait | landscape ] ] auto 지정된 값, <length>는 절대값으로 계산

이슈 색인

CSS 2.1에서 page box와 page area는 단순한 직사각형입니다. 둘 다 여백, 테두리 및 패딩을 가진 CSS 박스가 아닙니다. 이 CSS 박스는 page box 및 page area와 구별되어야 하며, 각각은 그 마진 영역과 콘텐츠 영역이 될 것입니다. 명명 아이디어가 있습니까?
미디어 쿼리가 적어도 한정되지 않은 @page에 지정된 크기에 반응할 수 있으면 유용할 것입니다.

다른 옵션으로는 @viewport 규칙과 같이 하는 방법이 있습니다 [CSS-DEVICE-ADAPT]: 먼저 @page 규칙을 적용하고(어떤 선택자와 매치할지?), 미디어 쿼리와 뷰포트 퍼센트 길이에 대해 UA의 기본 페이지 크기를 사용합니다. 결과 페이지 크기는 "base page size"가 됩니다. 그런 다음 스타일시트 전체를 다시 적용하되, 이번에는 미디어 쿼리와 뷰포트 퍼센트 길이에 "base page size"를 사용합니다.