CSS 의사 요소 모듈 레벨 4

W3C 워킹 드래프트,

이 문서에 대한 추가 정보
이 버전:
https://www.w3.org/TR/2025/WD-css-pseudo-4-20250627/
최신 공개 버전:
https://www.w3.org/TR/css-pseudo-4/
편집자 초안:
https://drafts.csswg.org/css-pseudo-4/
이전 버전:
히스토리:
https://www.w3.org/standards/history/css-pseudo-4/
피드백:
CSSWG 이슈 저장소
명세 내 인라인
편집자:
Elika J. Etemad / fantasai (Apple)
(Adobe Systems Inc.)
이전 편집자:
Daniel Glazman (Disruptive Innovations)
명세 수정 제안:
GitHub 편집자
이슈 목록:
편집자 초안에서 추적
테스트 스위트:
https://wpt.fyi/results/css/css-pseudo/

요약

이 CSS 모듈은 CSS 렌더 트리의 일부를 선택하고 스타일링할 수 있는 추상적 요소인 의사 요소(pseudo-elements)를 정의합니다.

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

이 문서의 상태

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

이 문서는 CSS 작업 그룹에서 워킹 드래프트권고안 트랙을 따라 공개되었습니다. 워킹 드래프트로 공개되었다고 해서 W3C 및 회원의 지지를 의미하는 것은 아닙니다.

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

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

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

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성되었습니다. W3C는 해당 그룹 산출물과 관련된 특허 공개 목록을 관리합니다. 해당 페이지에는 특허 공개 방법도 안내되어 있습니다. 어떤 사람이 실제로 특허를 알고 있으며 해당 특허에 필수 청구(essential claim)가 있다고 생각하면 W3C 특허 정책 6항에 따라 정보를 공개해야 합니다.

다음 기능들은 위험에 처해 있으며, CR 기간 동안 제외될 수 있습니다:

“위험(at-risk)”은 W3C 프로세스의 용어이며, 해당 기능이 삭제되거나 지연될 위험이 있음을 반드시 뜻하지는 않습니다. 작업 그룹(WG)이 해당 기능의 상호 운용성 구현에 어려움이 있을 수 있다고 판단할 때 위험으로 표시하며, Proposed Rec 단계로 전환할 때 별도의 새로운 Candidate Rec를 발행하지 않고도 기능을 삭제할 수 있도록 합니다.

1. 소개

이 섹션은 안내용입니다.

의사 요소는 문서 언어로 명시적으로 생성된 요소를 넘어서는 문서의 추상적 요소를 나타냅니다. 이들은 문서 트리에 맞추는 제약을 받지 않기 때문에, 문서의 트리 구조와 반드시 대응하지 않는 부분을 선택하고 스타일링하는 데 사용할 수 있습니다. 예를 들어, ::first-line 의사 요소는 텍스트 줄바꿈 이후 요소의 첫 번째 형식화된 줄에 있는 콘텐츠를 선택할 수 있어, 그 줄만 나머지 단락과 다르게 스타일링할 수 있습니다.

각 의사 요소는 기원 요소와 연결되며, ::이름 형태의 구문을 가집니다. 이 모듈은 CSS에 존재하는 의사 요소와 그것들을 어떻게 스타일링할 수 있는지 정의합니다. 의사 요소 전반에 대한 더 자세한 정보와 구문, 다른 셀렉터와의 상호작용은 [SELECTORS-4]를 참고하세요.

참고: 의사 요소는 명시적으로 허용된 경우가 아니면 서로 연결해서 사용할 수 없습니다. 예를 들어, ::marker::before는 허용되지 않지만, ::before::marker는 허용됩니다.

2. 타이포그래픽 의사 요소

2.1. 첫 번째 줄 텍스트: ::first-line 의사 요소

::first-line 의사 요소는 자신의 첫 번째 형식화된 줄에 해당하는 기원 요소의 콘텐츠를 나타냅니다.

테스트
아래 규칙은 “모든 p 요소의 첫 번째 줄 글자를 대문자로 변경”이란 뜻입니다:
p::first-line { text-transform: uppercase }

셀렉터 p::first-line은 실제 문서 요소와 일치하지 않습니다. 대신 사용자 에이전트가 자동으로 각 p 요소의 시작 부분에 삽입하는 의사 요소와 일치합니다.

참고: 첫 번째 줄의 길이는 페이지의 너비, 폰트 크기 등 여러 요인에 따라 달라집니다.

예를 들어, 아래와 같은 일반 HTML [HTML5] 단락이 있을 때:
<P>This is a somewhat long HTML paragraph
that will be broken into several lines.
The first line will be styled
by the ‘::first-line’ pseudo-element.
The other lines will be treated
as ordinary lines in the paragraph.</P>

요소의 너비에 따라 줄이 아래와 같이 분리될 수 있습니다:

THIS IS A SOMEWHAT LONG HTML PARAGRAPH THAT
will be broken into several lines. The first
line will be styled by the ‘::first-line’
pseudo-element. The other lines will be 
treated as ordinary lines in the paragraph.

혹은 이렇게 분리될 수도 있습니다:

THIS IS A SOMEWHAT LONG
HTML paragraph that will
be broken into several
lines. The first line will
be styled by the
‘::first-line’ pseudo-
element. The other lines
will be treated as ordinary
lines in the paragraph.

2.1.1. 첫 번째 형식화된 줄 찾기

CSS에서 ::first-line 의사 요소는 블록 컨테이너에 연결될 때만 효과가 있습니다:

참고: 첫 번째 형식화된 줄은 빈 줄일 수 있습니다. 예를 들어, p의 첫 줄이 <p><br>First…인 경우 첫 줄에는 아무 글자가 없습니다. 따라서 "First"라는 단어는 첫 번째 형식화된 줄에 포함되지 않으며, p::first-line의 영향을 받지 않습니다.

참고: 블록 컨테이너가 스스로 블록 포매팅 컨텍스트에 참여하지 않는 경우 그 첫 줄은 상위 요소의 첫 번째 형식화된 줄이 될 수 없습니다. 예를 들어, <DIV><P STYLE="display: inline-block">Hello<BR>Goodbye</P> etcetera</DIV> 에서는 DIV의 첫 번째 형식화된 줄이 "Hello"가 아니라, 해당 인라인 블록 전체를 포함하는 줄이 됩니다.

첫 번째 형식화된 줄이 여러 ::first-line 의사 요소로 표현될 때, 이들은 기원 요소의 순서대로 중첩됩니다. 해당 줄의 인라인 레벨 콘텐츠—​해당 루트 인라인 박스 단편 포함—​은 가장 안쪽 ::first-line 의사 요소 안에 중첩됩니다.

다음 마크업을 생각해봅시다:
<DIV>
  <P>First paragraph</P>
  <P>Second paragraph</P>
</DIV>

각 요소의 가상 태그 시퀀스::first-line 의사 요소를 나타낸다고 가정하면, 대략 다음과 같습니다:

<DIV>
  <P><DIV::first-line><P::first-line>First paragraph</P::first-line></DIV::first-line></P>
  <P><P::first-line>Second paragraph</P::first-line></P>
</DIV>

2.1.2. ::first-line 의사 요소 스타일링

::first-line 의사 요소가 생성하는 박스는 인라인 레벨 박스와 유사하게 동작하지만, 일부 제한이 있습니다. 다음 CSS 속성들이 ::first-line 의사 요소에 적용됩니다:

사용자 에이전트는 아래에서 제외하는 속성을 제외하고, 다른 속성을 적용할 수도 있습니다:

참고: line-height::first-line에 설정하면, 첫 번째 줄 내용을 감싸는 루트 인라인 박스 단편에도 상속되기 때문에, 첫 번째 줄 박스의 높이를 늘리거나 줄일 수 있습니다.

2.1.3. 상속과 ::first-line 의사 요소

CSS 상속 과정에서, 첫 번째 줄에 위치한 자식의 단편은 위에서 제외한 속성을 제외한 표준 상속 속성::first-line 의사 요소로부터 상속받습니다. 그 외의 모든 속성(모든 사용자 속성 포함 [CSS-VARIABLES-1]), 상속은 비의사 부모에서 이루어집니다. (자식 요소의 첫 번째 줄이 아닌 부분은 항상 비의사 부모에서 상속받습니다.)

일반적인 경우(표준 상속 CSS 속성), 상속::first-line 의사 요소로의 상속 및 그로부터의 상속을 가상 태그 시퀀스로 표현할 수 있습니다. 이전 예시를 생각해보면, 첫 번째 렌더링에서는 가상 태그 시퀀스가 다음과 같습니다:
<P><p::first-line>This is a somewhat long HTML paragraph
that</p::first-line> will be broken into several lines.
The first line will be styled
by the ‘::first-line’ pseudo-element.
The other lines will be treated
as ordinary lines in the paragraph.</p>

두 번째 렌더링에서는 다음과 같습니다:

<p><p::first-line>This is a somewhat long</p::first-line> HTML paragraph
that will be broken into several lines.
The first line will be styled
by the ‘::first-line’ pseudo-element.
The other lines will be treated
as ordinary lines in the paragraph.</p>
의사 요소가 실제 요소를 분할하는 경우, 일반적으로 가상 태그 시퀀스로 해당 요소를 닫았다가 다시 여는 식으로 설명할 수 있습니다. 예를 들어, 이전 예시에서 첫 번째 문장을 감싸는 span 요소를 추가하면:
<p><span>This is a somewhat long HTML paragraph
that will be broken into several lines.</span>
The first line will be styled
by the ‘::first-line’ pseudo-element.
The other lines will be treated
as ordinary lines in the paragraph.</p>

첫 번째 렌더링 결과는 다음 가상 태그 시퀀스와 유사합니다:

<p><p::first-line><span>This is a somewhat long HTML paragraph
that</span></p::first-line><span> will be broken into several lines.</span>
The first line will be styled
by the ‘::first-line’ pseudo-element.
The other lines will be treated
as ordinary lines in the paragraph.</p>

2.2. 첫 글자 텍스트: ::first-letter 의사 요소 및 그 ::prefix, ::suffix 자식들

테스트
드롭캡 첫 글자, 앞의 여는 따옴표 포함.

::first-letter 의사 요소타이포그래픽 문자 단위 중 첫 번째 글자, 숫자, 또는 기호 (유니코드 범주 L*, N*, S*)를 자신의 첫 번째 형식화된 줄기원 요소에서 나타냅니다(즉, 첫 글자). 그리고 이에 연관된 구두점도 포함합니다. 이 텍스트 전체를 첫 글자 텍스트라고 합니다. ::first-letter 의사 요소는 "이니셜 캡(initial caps)"과 "드롭캡(drop caps)" 같은 일반적인 타이포그래픽 효과를 구현하는 데 사용할 수 있습니다.

예를 들어, 아래 규칙은 2줄 드롭레터를 h2 다음에 오는 모든 단락에 생성하며, initial-letter 속성([CSS-INLINE-3]에서 정의됨)을 사용합니다:
h2 + p::first-letter { initial-letter: 3; }

참고: 첫 글자는 실제로 숫자일 수도 있습니다. 예를 들어 “67 million dollars is a lot of money.”에서 "6"이 첫 글자입니다.

첫 글자 자체와 인접 구두점을 각각 독립적으로 스타일링할 수 있도록, 앞에 오는 연관 구두점은 ::prefix 하위 의사 요소(sub-pseudo-element)로 ::first-letter 의사 요소 안에서 표현합니다(::first-letter::prefix). 뒤에 오는 연관 구두점은 ::suffix 하위 의사 요소::first-letter 의사 요소 안에서 표현합니다(::first-letter::suffix). 자세한 내용은 아래 § 2.2.1 첫 글자 및 연관 구두점을 참고하세요.

2.2.1. 첫 글자 및 연관 구두점

CSS Text 3 § 1.4 문자와 글자에서 설명한 대로, 타이포그래픽 문자 단위는 하나 이상의 유니코드 코드포인트를 포함할 수 있습니다. 예를 들어, 조합 문자(combining character)는 반드시 기본 문자와 함께 처리해야 합니다. 또한 언어마다 특정 글자 조합을 어떻게 다룰지에 대한 추가 규칙이 있을 수 있습니다. 예를 들어 네덜란드어에서는 "ij" 글자 조합이 요소의 처음에 오면, 두 글자 모두 ::first-letter 의사 요소 내에 포함되어야 합니다. [UAX29] 첫 글자를 선택할 때, UA는 타이포그래픽 문자 단위의 정의를 ::first-letter 의사 요소의 포함 블록콘텐츠 언어의 첫 글자 관례에 맞춰 조정해야 합니다.

앞뒤 구두점도 첫 글자 텍스트의 일부로 ::first-letter 의사 요소 내에 아래와 같이 포함되어야 합니다:

비공식적으로, 첫 글자 텍스트의 패턴은 여기서 (Zs에서 제외사항을 무시하고) 정규표현식(regular expression) (P (Zs|P)*)? (L|N|S) ((Zs|P−(Ps|Pd))* (P−(Ps|Pd))? 또는 ([P] [Zs P]*)? [L N S] ([Zs [P--[Ps Pd]]]* [P--[Ps Pd]])?로 대략 표현할 수 있는데, 유니코드 범주 약어는 해당 범주에 속하는 모든 타이포그래픽 문자 단위 집합을 나타냅니다.
P P Zs L N S P − (Ps ∪ Pd) P − (Ps ∪ Pd) Zs

CSS Text 3 § 1.4 문자와 글자CSS Text 3 § E 문자와 속성에서 타이포그래픽 문자 단위와 유니코드 속성에 대한 자세한 정보를 확인할 수 있습니다. [CSS-TEXT-3]

2.2.2. 첫 글자 텍스트 찾기

::first-line과 마찬가지로, ::first-letter 의사 요소는 블록 컨테이너에 연결될 때만 효과가 있습니다. 해당 첫 글자 텍스트인라인 레벨 콘텐츠인라인 포매팅 컨텍스트에 참여하는 것 중 기원 요소첫 번째 형식화된 줄에 처음 등장하는 것이며, 해당 줄에 다른 인플로우 콘텐츠(예: 이미지, 인라인 테이블 등)가 앞서 있지 않은 경우에만 해당됩니다.

이때 마커 박스는 인플로우가 아닌 것처럼 무시됩니다. 단, 요소에 인플로우 ::before 또는 ::after 콘텐츠가 있으면, 첫 글자 텍스트는 해당 요소의 콘텐츠(생성된 콘텐츠 포함)에서 선택됩니다.

예시: 아래 규칙 p::before {content: "Note: "} 적용 후, 셀렉터 p::first-letter는 "Note"의 "N"과 일치합니다.

자격이 되는 텍스트가 없다면, 첫 글자 텍스트::first-letter 의사 요소도 존재하지 않습니다.

참고: 첫 번째 형식화된 줄이 비어 있으면 ::first-letter는 아무것도 일치하지 않습니다. 예를 들어 <p><br>First...처럼 첫 줄에 글자가 없으므로, ::first-letter는 아무것도 매칭하지 않습니다. 특히 "First"의 "F"는 두 번째 줄에 있으므로 일치하지 않습니다.

참고: ::first-line과 마찬가지로, 첫 글자 텍스트블록 컨테이너블록 포매팅 컨텍스트에 참여하지 않으면 상위 요소의 첫 글자 텍스트가 될 수 없습니다. 즉, <DIV><P STYLE="display: inline-block">Hello<BR>Goodbye</P> etcetera</DIV> 에서 DIV첫 글자는 "H"가 아닙니다. 실제로 DIV첫 글자가 없습니다.

첫 글자 텍스트의 일부가 줄 바꿈으로 다음 줄로 넘어가면, 더 이상 ::first-letter 의사 요소의 일부가 아닙니다.

2.2.3. 첫 글자 의사 요소의 상속과 박스 트리 구조

::first-letter 의사 요소는 자신이 나타내는 첫 글자 텍스트 바로 바깥에 래핑됩니다. 이 텍스트가 하위 요소 내에 있더라도 마찬가지입니다. 첫 글자 텍스트가 여러 ::first-letter 의사 요소로 표현될 경우, 기원 요소의 순서대로 중첩됩니다. 상속도 이에 맞게 동작합니다.

다음 마크업을 생각해봅시다:
<div>
  <p><span>The first few words</span>
  and the rest of the paragraph.
</div>

각 요소의 가상 태그 시퀀스::first-letter 의사 요소를 나타낸다고 가정하면, 대략 다음과 같습니다:

<div>
  <p><span><div::first-letter><p::first-letter>T</…></…>he first few words</span>
  and the rest of the paragraph.
</div>

::first-letter::prefix::first-letter::suffix 의사 요소가 있으면, 이들은 가장 안쪽 ::first-letter 안에 중첩되며, 그 외에는 ::first-letter와 유사하게 해석됩니다.

다음 마크업을 생각해봅시다:
<div>
  <p><span>“The first few words</span>
  and the rest of the quotation.
</div>

각 요소의 가상 태그 시퀀스::first-letter 의사 요소를 나타낸다고 가정하면, 대략 다음과 같습니다:

<div>
  <p><span><div::first-letter><p::first-letter><div::first-letter::prefix><p::first-letter::prefix></…></…>T</…></…>he first few words</span>
  and the rest of the paragraph.
</div>

첫 글자 텍스트를 구성하는 문자가 모두 같은 요소에 있지 않으면 (예: ‘T<p>‘<em>T...처럼), UA는 ::first-letter 의사 요소 (및 ::prefix 또는 ::suffix 하위 요소) 를 한 요소 혹은 모든 요소에서 생성하거나, 아예 생성하지 않을 수도 있습니다. 또한 첫 글자 텍스트가 줄의 처음이 아닌 경우 (예: 양방향 재정렬, 목록 아이템 마커list-style-position: inside 지정 등), UA는 해당 의사 요소를 생성할 필요가 없습니다.

::first-letter 의사 요소는 모든 ::first-line 의사 요소 안에 포함되며, 따라서 (잠재적으로 간접적으로) ::first-line에서 상속받으며, 같은 줄의 인라인 박스와 동일하게 취급됩니다.

2.2.4. 첫 글자 의사 요소 스타일링

CSS에서 ::first-letter 의사 요소 (및 ::prefix, ::suffix 하위 요소) 는 인라인 박스와 유사합니다. 다음 속성들은 ::first-letter, ::first-letter::prefix, ::first-letter::suffix 의사 요소에 적용됩니다:

UA는 다른 속성도 적용할 수 있습니다. 단, ::first-letter에 미기재 속성을 적용하더라도 해당 ::first-letter가 나타내는 첫 글자 텍스트가 달라지면 안 됩니다.

참고: 예전 CSS 레벨에서는 UA가 글자의 형태에 따라 줄 높이, 너비, 높이를 선택하거나 폰트 크기를 근사하여, 글리프 윤곽을 레이아웃 시 반영할 수 있었습니다. 이런 느슨하게 정의된 마법적 동작은 드롭캡과 레이즈드 캡스 같은 실제 용도에 적합하지 않고 상호운용성 문제를 일으켜, 의도적으로 제거되었습니다. 드롭캡과 레이즈드 캡스의 명확한 처리는 initial-letter ([CSS-INLINE-3]) 참고.

3. 하이라이트 의사 요소

3.1. 하이라이트된 콘텐츠 선택: ::selection, ::search-text, ::target-text, ::spelling-error, ::grammar-error, ::highlight() 의사 요소

테스트

하이라이트 의사 요소는 문서의 특정 상태가 부여된 부분을 나타내며, 일반적으로 그 상태를 사용자에게 알리기 위해 다르게 스타일링됩니다. 예를 들어, 문서에서 선택된 부분은 보통 하이라이트되어 (배경과 전경색 변경 또는 색상 워시 등) 선택된 상태임을 표시합니다. 아래와 같은 하이라이트 의사 요소들이 정의되어 있습니다:

::selection
::selection 의사 요소는 문서에서 선택되어 향후 사용자 에이전트의 작업 대상이 될 수 있는 부분을 나타냅니다. 예를 들어, 편집 가능한 텍스트 필드 내에서 선택된 텍스트에 적용되며, 복사 작업 시 복사되거나 붙여넣기 작업 시 교체될 수 있습니다.
테스트
::search-text
::search-text 의사 요소는 사용자 에이전트의 페이지 내 찾기 기능으로 식별된 텍스트를 나타냅니다. 모든 UA가 하이라이트 의사 요소로 표현 가능한 방식으로 일치 텍스트를 스타일링하는 것은 아니므로, 이 의사 요소는 선택적으로 구현해도 됩니다.

:current 의사 클래스(pseudo-class, ::current()은 아님)는 ::search-text와 조합해 현재 포커스된 검색 결과 인스턴스를 표현할 수 있습니다. :past:future 의사 클래스는 추후 유사한 용도를 위해 예약되어 있습니다. 지원되지 않는 이러한 의사 클래스와 ::search-text의 조합은 반드시 무효로 처리해야 합니다.

::target-text
::target-text 의사 요소는 문서 URL의 fragment에 의해 직접적으로 타겟팅된 텍스트를 나타냅니다.

참고: URL fragment가 요소를 타겟팅할 때, :target 의사 요소로 해당 요소를 선택할 수 있지만, ::target-text는 아무것도 일치하지 않습니다. 이 의사 요소는 오직 [fragment]에 의해 직접적으로 타겟팅된 텍스트에만 일치합니다.

테스트
::spelling-error
::spelling-error 의사 요소는 사용자 에이전트에 의해 잘못 입력된 것으로 표시된 텍스트 부분을 나타냅니다.
테스트
::grammar-error
::grammar-error 의사 요소는 사용자 에이전트에 의해 문법적으로 올바르지 않은 것으로 표시된 텍스트 부분을 나타냅니다.
테스트
::highlight(<custom-ident>)
::highlight() 함수형 의사 요소는 주어진 사용자 지정 하이라이트와 연관된 문서의 부분을 나타냅니다. 이 부분은 지정된 사용자 지정 하이라이트 이름으로 식별됩니다. <custom-ident> 인자는 필수입니다. 자세한 내용은 [CSS-HIGHLIGHT-API-1]를 참고하세요.

하이라이트 의사 요소는 반드시 요소 트리에 포함되지 않으며, 중첩 구조를 따르지 않고 임의로 요소 경계를 넘을 수 있습니다.

3.2. 하이라이트 스타일링

하이라이트 의사 요소는 레이아웃에 영향을 주지 않고, 매우 동적인 환경에서도 성능적으로 적용할 수 있는 제한된 속성 집합만 스타일링할 수 있습니다. 또한(상호운용성을 위해) 필수 영역 내에서의 렌더링이 하이라이트 오버레이의 정확한(UA가 결정하는) 경계에 의존하지 않아야 합니다.

다음 속성들이 하이라이트 의사 요소에 적용됩니다:

여기에 포함되어야 할 다른 속성이 있을까요?

참고: 역사적으로(그리고 이 문서 작성 시점에도) colorbackground-color만 상호운용적으로 지원되었습니다.

참고: color 속성은 텍스트와 모든 라인 장식(밑줄, 윗줄, 취소선) 및 강조 표시(text-emphasis)의 색상을 기원 요소 및 그 상위/하위 요소에서 텍스트에 적용합니다.

위에 명시되지 않은 속성이라도, 적용되는 속성의 값을 결정하는 데 필요하다면, 해당 계산된 값(computed value)기원 요소에서 복사되며, 하이라이트 의사 요소에 명시된 값은 무시합니다. 예시:

특정 하이라이트 의사 요소저자 오리진(author origin)에서 색상이 명시된 경우, 해당 색상은 반드시 명시된 그대로 적용되어야 합니다. 즉 UA는 추가 처리를(반투명 워시 적용 등) 하면 안 됩니다. 하지만 저자 오리진에 색상이 없으면, UA는 추가 색상 처리를 할 수 있습니다.

참고: 이는 모든 UA가 주어진 저자 스타일시트를 해석할 때 색상 대비가 유지되도록 하기 위함입니다.

-webkit-text-fill-color와 같은 벤더 프리픽스 속성은 하이라이트 의사 요소에 적용되지 않습니다.

3.3. 기본 UA 스타일

기본 UA 스타일시트에 아래 추가를 권장합니다:

/* 조정 가능한 방식으로 기본 맞춤법/문법 오류 스타일 제공 */
:root::spelling-error { text-decoration: spelling-error; }
:root::grammar-error  { text-decoration: grammar-error; }

일부 하이라이트 의사 요소에는 쌍(default) 하이라이트 색상—UA가 제공하는 기본 colorbackground-color—가 있어야 하며, 두 색상은 동시에 사용 또는 덮어써야 합니다. 자세한 내용은 § 3.3.1 쌍(default) 설정을 참고하세요. ::selection의 경우 HighlightTextHighlight에 해당해야 하며, ::target-text의 경우 MarkTextMark에 해당해야 합니다.

UA는 하이라이트된 콘텐츠의 표현을 향상시키기 위해 추가 효과를 적용할 수 있으며, 예를 들어 하이라이트되지 않은 콘텐츠를 흐리게 하거나, 사용자 상호작용이나 타이밍에 따라 하이라이트 스타일을 단계적으로 제거할 수 있습니다. 이는 CSS로 제어되지 않습니다.

CSS로 제어되는 방식으로 하이라이트 표현을 UA가 조정하는 것은 현재 이슈 6853에서 논의 중입니다.

3.3.1. 쌍(default) 설정

호환성 이유로, 쌍(default) 하이라이트 색상colorbackground-colorcascaded value저자 오리진(author origin)에서 가져오지 못할 때만 사용되어야 합니다(혹은 값이 저자 오리진에서 상속된 경우). 하이라이트 색상이 revert 또는 revert-layer일 때, cascade를 롤백한 이후의 오리진이 cascaded value오리진을 결정합니다.

참고: 이 규칙은 호환성 목적이므로, fill-colorstroke-color 같은 유사 속성에는 적용되지 않습니다.

예를 들어, 다음과 같은 마크업이 있을 때:
<p>Highlight this <em>and this</em>.</p>

아래 규칙 중 어느 것이든 저자가 <em> 요소에 대해 background-color의 기본값을 ::selection에 대해 억제합니다:

em::selection { color: initial; }
em::selection { color: inherit; }
em::selection { color: unset; }
em::selection { color: green; }
p::selection { color: green; }
테스트

3.4. 하이라이트 영역

각 하이라이트 유형( § 3.1 하이라이트된 콘텐츠 선택: ::selection, ::search-text, ::target-text, ::spelling-error, ::grammar-error, ::highlight() 의사 요소 참조) 에 대해 전체 문서에 단일 하이라이트 오버레이가 존재하며, 활성화된 부분은 해당 하이라이트 의사 요소로 표현됩니다. 각 박스는 박스가 직접 포함하는 텍스트 또는 대체 콘텐츠에 대응하는 오버레이 부분을 소유합니다.

F2F 회의록, dbaron의 메시지, Daniel의 스레드, Gecko 노트, Opera 노트, Webkit 노트 참고

이것이 실제 동작을 설명하는 올바른 방식인지 확실하지 않습니다.

3.5. 하이라이트 스타일의 캐스케이딩 및 요소별 적용

각 요소는 자신의 활성 하이라이트 오버레이 부분을 그리며, 해당 부분은 해당 요소가 하이라이트 의사 요소 스타일의 기원 요소일 때 그 스타일을 받습니다. 여러 스타일이 충돌할 경우, 승자 스타일은 캐스케이드(cascade)에 의해 결정됩니다.

지원되는 속성에 대해 캐스케이드에서 값이 주어지지 않았거나, inherit 또는 unset 값이 주어진 경우, 해당 지정 값(specified value)은 해당 요소의 부모의 하이라이트 의사 요소에서 상속되어 결정됩니다. 이 과정은 해당 속성이 상속 속성(inherited property)인지 여부와 관계없이 발생합니다.

또한, 하이라이트 의사 요소루트 요소에서 시작된 경우 color의 상속값은 currentColor이며, 초기값(initial value)이 아닙니다.

모든 커스텀 속성기원 요소에서 상속되며, 해당 속성이 커스텀 속성상속으로 등록되어 있는지 여부와 관계없이 상속됩니다.

테스트
예를 들어, 아래 규칙이 적용된다면:
p::selection      { color: yellow; background: green; }
p > em::selection { color: orange; }
em::selection     { color:    red; }

다음 마크업에 적용한다고 가정합니다:

<p>Highlight this <em>and this</em>.</p>

선택 영역의 하이라이트는 전체적으로 초록색이며, <em> 요소 바깥 부분은 노란색 텍스트, 안쪽은 주황색 텍스트가 됩니다.

테스트

여러 개의 선택 스타일을 적용하고자 하는 저자는 전체 문서에 적용되는 선택 스타일로 :root::selection을 사용해야 합니다. 이렇게 하면 하위 요소에서 깔끔하게 오버라이드할 수 있습니다. ::selection만 쓰면 트리의 모든 요소에 적용되어, 조상보다 더 구체적인 스타일을 덮어씁니다.

예를 들어, 저자가 아래와 같이 지정한 경우
::selection          { background: blue; }
p.warning::selection { background:  red; }

그리고 문서에 다음이 포함되어 있다면

<p class="warning">Some <strong>very important information</strong></p>

하이라이트는 “very important information”에 대해 파란색이 됩니다. <strong> 요소의 ::selection::selection { background: blue; } 규칙과도 일치하기 때문입니다. (태그 셀렉터가 없으면 *가 암묵적으로 적용됨을 기억하세요.) 의도한 동작( p.warning 내부는 빨간색 하이라이트, 그외는 파란색)을 위해서는 아래와 같은 규칙을 써야 합니다:

:root::selection     { background: blue; }
p.warning::selection { background:  red; }
테스트

다음 예시는 커스텀 속성의 상속을 보여줍니다.

예를 들어, 저자가 아래와 같이 지정한 경우
:root {
   --background-color: green;
   --decoration-thickness: 10px;
   --decoration-color: purple;
 }
 ::selection {
   --decoration-thickness: 1px;
   --decoration-color: green;
 }
 div::selection {
   --decoration-color: blue;
   background-color: var(--background-color, red);
   text-decoration-line: underline;
   text-decoration-style: line;
   text-decoration-thickness: var(--decoration-thickness, 5px);
   text-decoration-color: var(--decoration-color, red);
 }

범용 ::selection은 사용자 에이전트의 기본 스타일을 사용합니다. 이는 커스텀 속성만 정의되어 있고, 외형에 영향을 주는 속성이 없기 때문입니다. div의 선택 영역 하이라이트는 선택된 콘텐츠에 초록색 배경, 10px 두께의 파란색 밑줄이 적용됩니다. --background-color--decoration-thickness 커스텀 속성은 div::selection 의사 요소에서 지정되지 않았으므로, 그 값은 기원 div 요소에서 상속받고, div 요소는 루트에서 커스텀 속성을 상속받습니다. 하지만 --decoration-colordiv::selection 자체에 지정되어 있으므로, 기원 요소의 값을 사용하지 않습니다.

참고: 이 동작 덕분에 기존 구현과 호환되는 방식으로 커스텀 속성으로 선택 영역을 제어할 수 있습니다.

3.6. 하이라이트 그리기

테스트

3.6.1. 배경

하이라이트 의사 요소는 해당 하이라이트 오버레이의 해당 부분에 배경을 그리며, 바로 아래에 위치한 후손들 아래에 그려집니다 (즉, CSS2.2§E.2의 8단계 직전에 그려짐). ::selection 오버레이는 ::target-text 오버레이 위에 그려지고, ::spelling-error 오버레이 위에 그려지고, ::grammar-error 오버레이 위에 그려지고, ::highlight 오버레이들 위에 그려집니다. ::search-text 오버레이는 UA에 따라 :selection 오버레이 바로 위나 아래에 그려지며, 다른 모든 오버레이들 위에 그려집니다.

테스트

3.6.2. 그림자

text-shadow하이라이트 의사 요소에 적용되면, 해당 하이라이트 오버레이 배경 위에 그려집니다. 이런 텍스트 그림자는 서로 쌓이며 (그리고 원래 텍스트 및 장식에 적용된 text-shadow 위에도 쌓여서, 원래 그림자도 계속 적용됩니다).

참고:하이라이트 오버레이 배경은 아래 레이어의 그림자 위에 그려지기 때문에, 하이라이트 오버레이 배경이 하위 그림자를 가릴 수 있습니다.

3.6.3. 텍스트 및 텍스트 장식

하이라이트 의사 요소는 관련 텍스트와 텍스트 장식 (그림자 제외) 의 일반적인 그리기를 억제합니다. 대신 최상위 활성 하이라이트 오버레이가 해당 텍스트 (및 장식)를 모든 하이라이트 오버레이 배경 위에 해당 하이라이트의 color로 다시 그립니다.

참고: 이는 그림자와 달리, 줄 장식과 강조 마크는 관련 텍스트에 대해 그려지는 하이라이트 오버레이 배경에 의해 가려지지 않는다는 뜻입니다.

이 목적을 위해, currentColor하이라이트 의사 요소color 속성에 있으면, 바로 아래 활성 하이라이트 의사 요소 레이어의 color를 나타내고, 마지막에는 원래 사용될 색상 ( 기원 요소의사 요소(예: ::first-line 또는 ::first-letter)에 적용된 색상)이 사용됩니다.

참고: 해당 요소의 자체 텍스트 장식 ( 라인 장식강조 표시 모두 ) 는 해당 의사 요소의 color에서 그려집니다. 그 값이 currentColor가 아닌 경우에 한하며, 원래의 색상이나 채움 사양과 관계없이 적용됩니다.

하이라이트 의사 요소가 도입한 텍스트 장식은 배경과 같은 순서로 텍스트의 원래 장식 위에 쌓이며, 모든 장식이 각각의 색상으로 그려집니다. 일반적인 그리기 순서가 적용되어, CSS2 Appendix E에 따라 밑줄은 윗줄 아래에, 윗줄은 텍스트 아래에, 텍스트는 취소선 아래에 그려집니다. 단, ::selection에 적용된 텍스트 장식은 텍스트와 함께 최상위 레이어로 모두 그려질 수도 있습니다.

예를 들어, 원래 텍스트에 밑줄과 취소선이 있고, ::selection이 밑줄을, ::target-text가 윗줄과 취소선을 적용한다면, 아래 두 가지 페인팅 순서 모두 규격에 부합합니다:
  1. 원래 밑줄
  2. ::selection 밑줄
  3. ::target-text 윗줄
  4. ::selection 색상 텍스트
  5. 원래 취소선
  6. ::target-text 취소선
  1. 원래 밑줄
  2. ::target-text 윗줄
  3. 원래 취소선
  4. ::target-text 취소선
  5. ::selection 밑줄
  6. ::selection 색상 텍스트

라인 장식하이라이트 의사 요소에서 도입된 경우 해당 기원 요소의 텍스트에만 적용되며, 속성 상속을 통해서만 (위 설명처럼) 하위 요소에 전달됩니다.

참고: 기원 요소 자체의 장식과 달리, 하이라이트 의사 요소에서 선언된 장식은 플로우 밖 요소인라인 블록에도 전달되며, 두께와 위치는 하위 요소마다 달라질 수 있습니다.

테스트

3.6.4. 대체 요소

대체되지 않은 콘텐츠의 경우 UA는 colorbackground-color (알파 채널 포함)를 명시대로 적용해야 합니다. 하지만 대체 콘텐츠의 경우 UA는 선택 영역을 통해 내용이 보이도록 반투명 워시를 생성해 덮어야 합니다. 이 워시는 지정된 background-colortransparent가 아니라면 해당 색상으로, 그렇지 않으면 지정된 color로 처리합니다. 단, UA는 알파 채널을 조정할 수 있습니다.

테스트

3.7. 하이라이트의 보안 고려사항

맞춤법 및 문법 오류 스타일링은 사용자의 사전(dictionary) 내용에 대한 정보를 누출할 수 있으므로 (여기에는 사용자 이름, 심지어 주소록 내용까지 포함될 수 있습니다!) ::spelling-error::grammar-error를 구현하는 UA는 이런 하이라이트 구간의 스타일을 페이지에서 읽을 수 없도록 막아야 합니다.

4. 트리 기반 의사 요소

트리 기반 의사 요소(tree-abiding pseudo-elements)는 항상 박스 트리 내에 포함됩니다. 이들은 상속 가능한 속성은 기원 요소에서 상속받고, 상속 불가 속성은 초기값을 사용합니다. [CSS-CASCADE-4] 이 중 일부는 완전히 스타일 지정 가능한 의사 요소(fully styleable pseudo-elements)입니다. 실제 요소에 적용 가능한 모든 속성이 완전히 스타일 지정 가능한 의사 요소에도 적용됩니다.

테스트

4.1. 생성 콘텐츠 의사 요소: ::before::after

계산된 content 값이 none이 아니면, 이러한 의사 요소는 기원 요소의 즉시 자식인 것처럼 박스를 생성하며, 콘텐츠는 content에 명시된 대로 생성됩니다.

::before
기원 요소(originating element)의 실제 콘텐츠 바로 앞에 위치하는 스타일 지정 가능한 자식 의사 요소를 나타냅니다.
::after
기원 요소(originating element)의 실제 콘텐츠 바로 뒤에 위치하는 스타일 지정 가능한 자식 의사 요소를 나타냅니다.
테스트

::before::after 모두 완전히 스타일 지정 가능한 의사 요소입니다: 적용 가능한 속성에 제한이 없습니다.

예를 들어, 아래 규칙은 <p> 요소의 class 속성이 note일 때, 콘텐츠 앞에 “Note: ”를 삽입합니다:
p.note::before { content: "Note: " }

display 의 초기값은 inline이므로, 인라인 박스가 생성됩니다. <p>의 다른 인라인 자식처럼, 인라인 포매팅 컨텍스트에 참여하여 다른 콘텐츠와 같은 줄을 공유할 수 있습니다.

일반 요소의 콘텐츠처럼, ::before:after 의사 요소의 생성 콘텐츠도 해당 ::first-line::first-letter 의사 요소의 일부가 될 수 있습니다. 또한 일반 자식 요소처럼, ::before::after 의사 요소는 부모( 기원 요소)가 대체 요소(replaced element)일 때 억제됩니다.

4.2. 목록 마커: ::marker 의사 요소

::marker 의사 요소는 마커 박스(marker box)가 자동으로 생성되는 목록 항목(list item)을 나타냅니다. ([CSS-DISPLAY-3][CSS-LISTS-3] 참고.)

테스트

::marker의 내용은 ::first-letter에 의해 무시되며(선택되지 않음) 적용되지 않습니다.

::marker::first-line의 상호작용은 현재 이슈 4506에서 논의 중입니다.

::marker트리 기반 의사 요소이지만, 완전히 스타일 지정 가능한 것은 아닙니다; ::marker 의사 요소에는 제한된 속성만 사용할 수 있습니다. 허용된 속성 목록은 CSS Lists 3 § 3.1.1 ::marker에 적용 가능한 속성에서 정의되어 있습니다.

::before::marker 또는 ::after::marker 선택자는 유효하며, 마커 박스를 나타내는 ::before 또는 ::after 의사 요소가 목록 항목(list item)인 경우 사용할 수 있습니다. 그러나 ::marker::marker는 무효이며, display의 계산된 값은 ::marker에서 list-item 특성을 항상 잃게 됩니다.

::marker::prefix::suffix 하위 요소도 있어야 할까요?

4.3. 입력 필드 자리 표시자: ::placeholder 의사 요소

::placeholder 의사 요소는 입력 필드의 자리 표시자 텍스트를 나타냅니다: 입력 내용을 대신하고 폼을 어떻게 작성해야 할지 사용자에게 힌트를 제공합니다. 예를 들어, 날짜 입력 필드에는 "YYYY/MM/DD"와 같은 자리 표시자 텍스트가 있을 수 있으며, 숫자 날짜를 연-월-일 순서로 입력해야 함을 명확하게 해줍니다. 이것은 트리 기반 의사 요소입니다.

테스트
예를 들어, [HTML]의 의미론에 따르면 placeholder 속성은 inputtextarea 요소에서 자리 표시자 텍스트를 제공합니다. ::placeholder 의사 요소는 해당 텍스트가 표시될 때 이를 나타냅니다.

참고: :placeholder-shown 의사 클래스도 존재하며, 자리 표시자 텍스트가 표시될 때 (실제) 요소에 적용되고, 그러한 요소를 특별히 스타일링하는 데 사용할 수 있습니다. ::placeholder는 자리 표시자 텍스트 자체만을 나타내므로 기능이 상대적으로 제한됩니다.

::first-line 의사 요소에 적용되는 모든 속성은 ::placeholder 의사 요소에도 적용되며, 단 [CSS-INLINE-3]에 정의된 속성은 제외됩니다.

인터랙티브 미디어에서는 사용자가 입력을 하면 자리 표시자 텍스트가 자주 숨겨지지만, 이는 필수가 아니며, 입력 값과 자리 표시자 텍스트가 동시에 표시될 수도 있습니다. 정확한 동작은 UA에 의해 결정됩니다. 정적 미디어(예: 인쇄물)에서는 사용자가 입력을 한 뒤에도 자리 표시자 텍스트가 남아 있을 수 있습니다.

저자들은 text-align도 지원 속성 목록에 포함되길 원하는 것 같습니다. 예시: 여기의 댓글 참고.

참고: ::placeholder가 요소 트리에 해당하는 요소가 있을 때의 자리 표시자도 참조하도록 요청이 있었습니다. 어떻게 작동해야 할지 명확하지 않지만, 도입할 가치가 있을 수 있습니다. 이슈 2417 참고.

5. 요소 기반 의사 요소

요소 기반 의사 요소(element-backed pseudo-elements)는 대부분의 CSS 및 플랫폼 기능에서 실제 요소처럼 동작합니다 (실제로 선택 불가능한 실제 요소인 경우도 많습니다).

요소 기반 의사 요소는 항상 트리 기반입니다. 별도의 명시가 없는 한, 완전히 스타일 지정 가능하며, 기원 요소에서 상속받으며, 표준 트리 기반 의사 요소와 같습니다. 하지만 다른 요소에서 상속받도록 정의될 수도 있습니다. (예: ::part()는 그림자 트리에서 대표하는 요소의 부모에서 상속받음.)

모든 의사 클래스의사 요소요소 기반 의사 요소 뒤에도 문법적으로 허용됩니다 (예: x-button::part(label):hover 또는 x-button::part(label)::before), 마치 의사 요소가 타입 셀렉터인 것처럼; 단, 일부는 적용되지 않습니다:

요소 기반 의사 요소는 자기 자신을 실제 요소로 정의할 수 있습니다 (현재 트리에서 접근 불가한 경우도 포함). 그렇게 정의하면, 위에서 금지된 경우를 제외한 모든 의사 클래스 및 의사 요소가 실제 요소에서처럼 매칭됩니다. 그렇지 않으면, 어떤 의사 클래스가 언제 매칭되는지 정의해야 합니다; 그러나 별도 명시가 없는 한, 트리 기반 의사 요소에 허용되는 의사 클래스는 요소 기반 의사 요소에도 항상 허용됩니다.

5.1. 파일 선택 버튼: ::file-selector-button 의사 요소

::file-selector-button 의사 요소는 UA가 해당 버튼을 렌더링하는 경우, <input> 요소 내부의 <button>을 타겟팅합니다 (type=file 일 때).

테스트

::file-selector-button 의사 요소에는 적용할 수 있는 속성에 제한이 없습니다.

예를 들어, 아래 예시는 파일 선택 버튼 주위에 초록색 테두리가 보여야 합니다:
::file-selector-button { border: 3px solid green }

5.2. details 요소의 확장 가능한 콘텐츠: ::details-content 의사 요소

::details-content 의사 요소는 details 요소에서 확장하거나 접을 수 있는 추가 정보를 타겟팅합니다. 이것은 요소 기반 의사 요소입니다.

테스트

details 요소


::details-content 의사 요소에는 적용할 수 있는 속성에 제한이 없습니다.

예를 들어, 아래 예시는 details 요소가 열릴 때 추가 정보의 투명도가 애니메이션되는 모습을 보여줍니다:
details::details-content {
  opacity: 0;
  transition: content-visibility 300ms allow-discrete, opacity 300ms;
}

details[open]::details-content {
  opacity: 1;
}

6. 겹치는 의사 요소 상호작용

아래를 기억하세요:

다음 CSS와 HTML 예시는 겹치는 의사 요소가 어떻게 상호작용하는지 보여줍니다:

<style>
p { color: red; font-size: 12pt }
p::first-letter { color: green; font-size: 200% }
p::first-line { color: blue }
</style>

<p>Some text that ends up on two lines</p>

각 P 요소의 첫 글자는 24pt 크기의 초록색이 됩니다. 첫 번째 포매팅된 줄의 나머지는 파란색, 단락의 나머지는 빨간색이 됩니다.

줄 바꿈이 "ends" 앞에서 발생한다고 가정하면, 이 조각의 가상 태그 시퀀스는 다음과 같을 수 있습니다:

<p>
  <p::first-line>
    <p::first-letter>
      S
    </p::first-letter>
    ome text that
  </p::first-line>
  ends up on two lines
</p>

7. CSS 객체 모델에 대한 추가

테스트

7.1. CSSPseudoElement 인터페이스

CSSPseudoElement 인터페이스는 의사 요소를 이벤트 타겟으로 사용할 수 있게 해줍니다.

[Exposed=Window]
interface CSSPseudoElement : EventTarget {
    readonly attribute CSSOMString type;
    readonly attribute Element element;
    readonly attribute (Element or CSSPseudoElement) parent;
    CSSPseudoElement? pseudo(CSSOMString type);
};

이 인터페이스는 디자인 개발 중이며, 이 초안은 구현보다는 피드백을 더 원합니다. CSSWG는 사용 사례와 문제에 대한 의견을 특히 환영합니다.

type 속성은 의사 요소의 타입을 나타내는 문자열입니다. 값은 다음 중 하나일 수 있습니다:

"::before"
::before 의사 요소를 나타냅니다.
"::after"
::after 의사 요소를 나타냅니다.
"::marker"
::marker 의사 요소를 나타냅니다.

element 속성은 최종 기원 요소를 반환합니다.

parent 속성은 의사 요소의 기원 요소를 반환합니다. 대부분의 의사 요소에서 parentelement 는 동일한 Element를 반환합니다; 하위 의사 요소의 경우, parentCSSPseudoElement를, elementElement를 반환합니다.

pseudo(type) 메서드는 인자로 참조된 하위 의사 요소가 존재하고 유효하다면 해당 CSSPseudoElement 인터페이스를 반환하고, 그렇지 않으면 null을 반환합니다. 아래 pseudo() 참고.

참고: 이 인터페이스는 향후 다른 의사 요소 타입이나 CSSStyleDeclaration style 속성을 통해 스타일 정보를 설정하는 기능으로 확장될 수 있습니다. 현재 기능은 [web-animations-1] 지원을 위해 필요한 범위로 제한됩니다.

7.2. pseudo() 메서드 (Element 인터페이스)

Element 인터페이스에 주어진 요소가 생성한 특정 타입의 의사 요소를 가져오는 신규 메서드가 추가되었습니다:

partial interface Element {
  CSSPseudoElement? pseudo(CSSOMString type);
};
pseudo(CSSOMString type) 메서드는 해당 요소와 연결된 타입에 맞는 CSSPseudoElement 인스턴스를 가져오는 데 사용됩니다. 호출 시 다음 단계를 실행합니다:
  1. 파싱 type 인자를 <pseudo-element-selector>로 파싱하고, type에 결과를 할당합니다.

  2. type이 실패라면, null을 반환합니다.

  3. 그 외의 경우, CSSPseudoElement 객체를 반환합니다. 해당 의사 요소는 type 셀렉터와 this기원 요소일 때 매칭됩니다.

동일한 의사 요소와 동일한 기원 요소를 나타내는 반환 값은, 관찰 가능한 한, 항상 동일한 CSSPseudoElement 객체여야 합니다. (관찰이 불가능하다면 UA가 편의나 성능을 위해 객체를 삭제하거나 재생성할 수 있습니다.)

반환 값의 정체성, 생명주기, null 여부 (pseudo() 메서드의 잠재적 오류 등)는 아직 논의 중입니다. 이슈 3607, 이슈 3603 참고.

7.3. getComputedStyle()

두 번째 파라미터 pseudoElt하이라이트 의사 요소를 참조하면, getComputedStyle() 은 해당 하이라이트가 활성이고 다른 하이라이트는 모두 비활성인 것처럼 스타일을 반환합니다. 이는 실제 하이라이트 상태에 따라 결과가 달라지는 잠재적 모호함과 개인정보 위험을 방지하기 위함입니다.

8. 호환성 문법

기존 CSS Level 2 [CSS2] 스타일시트와의 호환성을 위해, 사용자 에이전트는 아래와 같은 이전의 하나의 콜론 표기(:before, :after, :first-letter, :first-line) 를 ::before, ::after, ::first-letter, ::first-line 의사 요소에 대해 허용해야 합니다.

보안 고려사항

하이라이트에 대한 내용은 § 3.7 하이라이트의 보안 고려사항을 참고하세요.

개인정보 보호 고려사항

이 모듈에 대해 새로운 개인정보 보호 고려사항은 제기되지 않았습니다.

변경 사항

2022년 12월 30일 워킹드래프트 이후 주요 변경점:

2020년 12월 31일 작업 초안(31 December 2020 Working Draft) 이후 주요 변경 사항은 다음과 같습니다:

2019년 2월 25일 작업 초안(25 February 2019 Working Draft) 이후 주요 변경 사항은 다음과 같습니다:

2016년 6월 7일 작업 초안(7 June 2016 Working Draft) 이후 변경 사항은 다음과 같습니다:

감사의 글(Acknowledgements)

편집자들은 다음 분들께 이 규격에 대한 특별한 공헌에 대해 감사를 전합니다: Tab Atkins, Delan Azabani, David Baron, Oriol Brufau, Razvan Caliman, Stephen Chenney, Chris Coyier, Anders Grimsrud, Vincent Hardy, François Remy.

적합성(Conformance)

문서 규약(Document conventions)

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

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

이 명세서의 예시는 “for example(예를 들어)”라는 단어로 시작하거나, 아래와 같이 규범적 텍스트와 구분되도록 class="example"로 표시됩니다:

이것은 정보 제공용 예시입니다.

정보성 참고(note)는 “Note”라는 단어로 시작하며, 아래와 같이 class="note"로 규범적 텍스트와 구분됩니다:

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

권고문(advisement)은 특별한 주의를 환기하도록 규범적 섹션을 스타일링한 것이며, <strong class="advisement">로 구분됩니다. 예시: UA는 반드시 접근 가능한 대안을 제공해야 합니다.

테스트

이 명세서의 내용과 관련된 테스트는 아래와 같이 “테스트” 블록에 기록될 수 있습니다. 이러한 블록은 모두 비규범적입니다.


적합성 클래스(Conformance classes)

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

스타일 시트(style sheet)
CSS 스타일 시트.
렌더러(renderer)
스타일 시트의 의미를 해석하고 이를 사용하는 문서를 렌더링하는 UA.
저작 도구(authoring tool)
스타일 시트를 작성하는 UA.

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

렌더러가 본 명세에 적합하려면, 적합한 명세에 따라 스타일 시트를 해석하는 것 외에도, 본 명세서에 정의된 모든 기능을 올바르게 파싱/렌더링하여 문서를 표시해야 합니다. 단, UA가 기기의 한계로 인해 문서를 올바르게 렌더링하지 못하더라도 UA가 비적합한 것은 아닙니다. (예: UA는 단색 모니터에서 색상을 렌더링할 필요는 없습니다.)

저작 도구가 본 명세에 적합하려면, 작성하는 스타일 시트가 본 모듈의 일반 CSS 문법 및 각 기능별 개별 문법에 맞게 문법적으로 올바르며, 본 모듈에서 설명하는 스타일 시트의 모든 기타 적합성 요건을 충족해야 합니다.

부분 구현(Partial implementations)

저자가 향후 호환성 있는 파싱 규칙을 활용해 대체값을 지정할 수 있도록, CSS 렌더러는 반드시 지원 불가능한 at-rule, 속성, 속성값, 키워드 등 구문 구조를 무효(그리고 적절히 무시)로 처리해야 합니다. 특히 UA는 하나의 다중 값 속성 선언 내의 미지원 구성값만 선택적으로 무시하거나 지원값만 적용해서는 안됩니다: 어떤 값이 무효(지원하지 않는 값은 반드시 무효)라고 판단되면, CSS는 전체 선언을 무시해야 합니다.

불안정 및 독점 기능 구현(Implementations of Unstable and Proprietary Features)

향후 안정 CSS 기능과 충돌을 피하기 위해, CSSWG는 최선의 구현 지침을 따라 불안정 기능 및 독점 확장을 구현할 것을 권장합니다.

비실험적 구현(Non-experimental implementations)

명세가 Candidate Recommendation 단계에 도달하면, 비실험적 구현이 가능하며, 구현자는 스펙에 맞게 올바르게 구현되었음을 증명할 수 있는 CR 수준의 기능에 대해 unprefixed(벤더 프리픽스 없는) 구현을 출시해야 합니다.

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

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

색인(Index)

이 명세서에서 정의된 용어(Terms defined by this specification)

참조로 정의된 용어

참고 문헌

규범적 참고 문헌

[COMPAT]
Mike Taylor. Compatibility Standard. Living Standard. URL: https://compat.spec.whatwg.org/
[CSS-BACKGROUNDS-3]
Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 2024년 3월 11일. CRD. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-BREAK-4]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 4. 2018년 12월 18일. FPWD. 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. 2022년 1월 13일. CR. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-CASCADE-6]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 6. 2024년 9월 6일. WD. URL: https://www.w3.org/TR/css-cascade-6/
[CSS-COLOR-4]
Chris Lilley; Tab Atkins Jr.; Lea Verou. CSS Color Module Level 4. 2025년 4월 24일. CRD. URL: https://www.w3.org/TR/css-color-4/
[CSS-COLOR-ADJUST-1]
Elika Etemad; et al. CSS Color Adjustment Module Level 1. 2022년 6월 14일. CRD. URL: https://www.w3.org/TR/css-color-adjust-1/
[CSS-CONTENT-3]
Elika Etemad; Dave Cramer. CSS Generated Content Module Level 3. 2019년 8월 2일. WD. URL: https://www.w3.org/TR/css-content-3/
[CSS-DISPLAY-4]
Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 4. 2024년 12월 19일. FPWD. URL: https://www.w3.org/TR/css-display-4/
[CSS-FONTS-4]
Chris Lilley. CSS Fonts Module Level 4. 2024년 2월 1일. WD. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-HIGHLIGHT-API-1]
Florian Rivoal; Sanket Joshi; Megan Gardner. CSS Custom Highlight API Module Level 1. 2021년 12월 15일. WD. URL: https://www.w3.org/TR/css-highlight-api-1/
[CSS-INLINE-3]
Elika Etemad. CSS Inline Layout Module Level 3. 2024년 12월 18일. WD. URL: https://www.w3.org/TR/css-inline-3/
[CSS-LISTS-3]
Elika Etemad; Tab Atkins Jr.. CSS Lists and Counters Module Level 3. 2020년 11월 17일. WD. URL: https://www.w3.org/TR/css-lists-3/
[CSS-MULTICOL-2]
Florian Rivoal; Rachel Andrew. CSS Multi-column Layout Module Level 2. 2024년 12월 19일. FPWD. URL: https://www.w3.org/TR/css-multicol-2/
[CSS-PSEUDO-4]
Daniel Glazman; Elika Etemad; Alan Stearns. CSS Pseudo-Elements Module Level 4. 2022년 12월 30일. WD. URL: https://www.w3.org/TR/css-pseudo-4/
[CSS-RUBY-1]
Elika Etemad; et al. CSS Ruby Annotation Layout Module Level 1. 2022년 12월 31일. WD. URL: https://www.w3.org/TR/css-ruby-1/
[CSS-SCOPING-1]
Tab Atkins Jr.; Elika Etemad. CSS Scoping Module Level 1. 2014년 4월 3일. FPWD. URL: https://www.w3.org/TR/css-scoping-1/
[CSS-SHADOW-PARTS-1]
Tab Atkins Jr.; Fergal Daly. CSS Shadow Parts. 2018년 11월 15일. FPWD. URL: https://www.w3.org/TR/css-shadow-parts-1/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 2021년 12월 24일. CRD. URL: https://www.w3.org/TR/css-syntax-3/
[CSS-TABLES-3]
François Remy; Greg Whitworth; David Baron. CSS Table Module Level 3. 2019년 7월 27일. WD. URL: https://www.w3.org/TR/css-tables-3/
[CSS-TEXT-3]
Elika Etemad; Koji Ishii; Florian Rivoal. CSS Text Module Level 3. 2024년 9월 30일. CRD. URL: https://www.w3.org/TR/css-text-3/
[CSS-TEXT-4]
Elika Etemad; et al. CSS Text Module Level 4. 2024년 5월 29일. WD. URL: https://www.w3.org/TR/css-text-4/
[CSS-TEXT-DECOR-4]
Elika Etemad; Koji Ishii. CSS Text Decoration Module Level 4. 2022년 5월 4일. WD. URL: https://www.w3.org/TR/css-text-decor-4/
[CSS-UI-4]
Florian Rivoal. CSS Basic User Interface Module Level 4. 2021년 3월 16일. WD. URL: https://www.w3.org/TR/css-ui-4/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2024년 3월 12일. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-VARIABLES-1]
Tab Atkins Jr.. CSS Custom Properties for Cascading Variables Module Level 1. 2022년 6월 16일. CR. URL: https://www.w3.org/TR/css-variables-1/
[CSS-WRITING-MODES-3]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 3. 2019년 12월 10일. REC. URL: https://www.w3.org/TR/css-writing-modes-3/
[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/CSS2/
[CSSOM-1]
Daniel Glazman; Emilio Cobos Álvarez. CSS Object Model (CSSOM). 2021년 8월 26일. WD. URL: https://www.w3.org/TR/cssom-1/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[FILL-STROKE-3]
Elika Etemad; Tab Atkins Jr.. CSS Fill and Stroke Module Level 3. 2017년 4월 13일. FPWD. URL: https://www.w3.org/TR/fill-stroke-3/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997년 3월. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 2022년 11월 11일. WD. URL: https://www.w3.org/TR/selectors-4/
[UAX44]
Ken Whistler. Unicode Character Database. 2024년 8월 27일. Unicode Standard Annex #44. URL: https://www.unicode.org/reports/tr44/tr44-34.html
[URL]
Anne van Kesteren. URL Standard. Living Standard. URL: https://url.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

비규범적 참고 문헌

[CSS-BACKGROUNDS-4]
Bert Bos; Elika J. Etemad; Lea Verou. CSS Backgrounds and Borders Module Level 4. CSS 모듈 제안. URL: https://drafts.csswg.org/css-backgrounds-4/
[CSS-CASCADE-4]
Elika Etemad; Tab Atkins Jr.. CSS Cascading and Inheritance Level 4. 2022년 1월 13일. CR. URL: https://www.w3.org/TR/css-cascade-4/
[CSS-DISPLAY-3]
Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 3. 2023년 3월 30일. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS22]
Bert Bos. Cascading Style Sheets Level 2 Revision 2 (CSS 2.2) Specification. 2016년 4월 12일. FPWD. URL: https://www.w3.org/TR/CSS22/
[HTML5]
Ian Hickson; et al. HTML5. 2018년 3월 27일. REC. URL: https://www.w3.org/TR/html5/
[SELECTORS-3]
Tantek Çelik; et al. Selectors Level 3. 2018년 11월 6일. REC. URL: https://www.w3.org/TR/selectors-3/
[UAX29]
Josh Hadley. Unicode Text Segmentation. 2024년 8월 28일. Unicode Standard Annex #29. URL: https://www.unicode.org/reports/tr29/tr29-45.html
[WEB-ANIMATIONS-1]
Brian Birtles; et al. Web Animations. 2023년 6월 5일. WD. URL: https://www.w3.org/TR/web-animations-1/

IDL 색인

[Exposed=Window]
interface CSSPseudoElement : EventTarget {
    readonly attribute CSSOMString type;
    readonly attribute Element element;
    readonly attribute (Element or CSSPseudoElement) parent;
    CSSPseudoElement? pseudo(CSSOMString type);
};

partial interface Element {
  CSSPseudoElement? pseudo(CSSOMString type);
};

이슈 색인

여기에 포함되어야 할 다른 속성이 있는지요?
UA가 하이라이트 표현을 CSS로 제어되는 방식으로 조정하는 문제는 현재 논의 중입니다. (이슈 6853 참고)
F2F 회의록, dbaron의 메시지, Daniel의 쓰레드, Gecko 노트, Opera 노트, Webkit 노트
이것이 동작 방식을 설명하는 올바른 방법인지 확신이 없습니다.
::marker::first-line의 상호작용은 현재 이슈 4506에서 논의 중입니다.
::marker::prefix::suffix 하위 요소도 있어야 하는지요?
저자들은 text-align이 지원 속성 목록에 포함되길 원하는 것 같습니다. 예시: 여기 댓글 참고.
이 인터페이스는 설계 개발 중이며 이 초안은 실제 구현보다는 피드백을 원합니다. CSSWG는 특히 활용 사례와 문제점에 대한 의견을 환영합니다.
반환값의 식별성, 생명주기, null 여부 (및 잠재적 오류 케이스)는 pseudo() 메서드에서 아직 논의 중입니다. 이슈 3607이슈 3603 참고.