12 생성된 콘텐츠, 자동 번호 매기기, 및 목록

목차

일부 경우, 작성자는 사용자 에이전트가 문서 트리에서 가져오지 않은 콘텐츠를 렌더링하도록 요구할 수 있습니다. 익숙한 예로는 번호가 매겨진 목록이 있습니다. 작성자는 번호를 명시적으로 나열하고 싶지 않으며, 사용자 에이전트가 이를 자동으로 생성하기를 원합니다. 유사하게, 작성자는 사용자 에이전트가 그림 캡션 앞에 "그림"이라는 단어를 삽입하거나, 일곱 번째 장 제목 앞에 "제7장"을 삽입하기를 원할 수 있습니다. 특히 오디오나 점자에서는 사용자 에이전트가 이러한 문자열을 삽입할 수 있어야 합니다.

CSS 2.2에서는 두 가지 메커니즘으로 콘텐츠를 생성할 수 있습니다:

12.1 :before:after 의사 요소

작성자는 :before 및 :after 의사 요소를 사용하여 생성된 콘텐츠의 스타일과 위치를 지정합니다. 이름에서 알 수 있듯이, :before 및 :after 의사 요소는 콘텐츠 트리의 문서 트리 콘텐츠 이전과 이후의 콘텐츠 위치를 지정합니다. 'content' 속성은 이러한 의사 요소와 함께 삽입할 내용을 지정합니다.

예제:

예를 들어, 다음 규칙은 "class" 속성 값이 "note"인 모든 P 요소의 콘텐츠 앞에 "Note: "라는 문자열을 삽입합니다:

p.note:before { content: "Note: " }

요소가 생성하는 형식화 객체(예: 박스)는 생성된 콘텐츠를 포함합니다. 따라서, 위 스타일 시트를 다음과 같이 변경하면:

p.note:before { content: "Note: " }
p.note        { border: solid green }

초기 문자열을 포함하여 전체 단락 주위에 녹색 실선 테두리가 렌더링됩니다.

:before 및 :after 의사 요소는 상속 가능한 속성을 연결된 문서 트리의 요소에서 상속받습니다.

예제:

예를 들어, 다음 규칙은 모든 Q 요소 앞에 열림 따옴표를 삽입합니다. 따옴표의 색상은 빨간색이지만, 글꼴은 Q 요소 나머지 글꼴과 동일합니다:

q:before {
  content: open-quote;
  color: red
}

:before 또는 :after 의사 요소 선언에서, 상속되지 않는 속성은 초기 값을 취합니다.

예제:

따라서, 'display' 속성의 초기 값이 'inline'이기 때문에, 이전 예제의 따옴표는 인라인 박스로 삽입됩니다(즉, 요소의 초기 텍스트 콘텐츠와 동일한 라인에 배치됨). 다음 예제는 'display' 속성을 명시적으로 'block'으로 설정하여 삽입된 텍스트가 블록이 되도록 합니다:

body:after {
    content: "The End";
    display: block;
    margin-top: 2em;
    text-align: center;
}

:before 및 :after 의사 요소는 연결된 요소 내부에 실제 요소가 삽입된 것처럼 다른 박스와 상호작용합니다.

예제:

예를 들어, 다음 문서 조각과 스타일 시트:

<p> Text </p>                   p:before { display: block; content: 'Some'; }

...는 다음 문서 조각과 스타일 시트와 완전히 동일한 방식으로 렌더링됩니다:

<p><span>Some</span> Text </p>  span { display: block }

마찬가지로, 다음 문서 조각과 스타일 시트:

<h2> Header </h2>     h2:after { display: block; content: 'Thing'; }

...는 다음 문서 조각과 스타일 시트와 완전히 동일한 방식으로 렌더링됩니다:

<h2> Header <span>Thing</span></h2>   h2 { display: block; }
                                      span { display: block; }

참고. 이 명세서는 :before 및 :after가 대체된 요소(예: HTML에서 IMG)와의 상호작용을 완전히 정의하지 않습니다. 이는 향후 명세서에서 더 자세히 정의될 예정입니다.

12.2 속성 'content'

이름: content
값: normal | none | [ <string> | <uri> | <counter> | attr(<identifier>) | open-quote | close-quote | no-open-quote | no-close-quote ]+ | inherit
초기값: normal
적용 대상: :before 및 :after 의사 요소
상속됨: 아니요
백분율: N/A
미디어: all
계산값: 요소에서는 항상 'normal'로 계산됩니다. :before 및 :after에서는 'normal'이 지정된 경우 'none'으로 계산됩니다. 그렇지 않은 경우, URI 값은 절대 URI로, attr() 값은 결과 문자열로, 기타 키워드는 지정된 대로 계산됩니다.

이 속성은 :before 및 :after 의사 요소와 함께 사용되어 문서에 콘텐츠를 생성합니다. 값은 다음과 같은 의미를 가집니다:

none
의사 요소가 생성되지 않습니다.
normal
:before 및 :after 의사 요소의 경우 'none'으로 계산됩니다.
<string>
텍스트 콘텐츠 (문자열 섹션 참조).
<uri>
값은 외부 리소스를 지시하는 URI입니다 (예: 이미지). 사용자 에이전트가 리소스를 표시할 수 없는 경우, 이를 지정하지 않은 것처럼 생략하거나 리소스를 표시할 수 없음을 나타내는 표시를 해야 합니다.
<counter>
카운터는 'counter()' 또는 'counters()'라는 두 가지 함수로 지정될 수 있습니다. 전자는 'counter(name)' 또는 'counter(name, style)' 형태를 가질 수 있습니다. 생성된 텍스트는 이 의사 요소에서 스코프 내의 주어진 이름의 가장 안쪽 카운터 값입니다; 이는 지정된 스타일 ('decimal' 기본값)로 포맷됩니다. 후자는 'counters(name, string)' 또는 'counters(name, string, style)' 형태를 가질 수 있습니다. 생성된 텍스트는 이 의사 요소에서 스코프 내의 주어진 이름을 가진 모든 카운터 값이며, 가장 바깥쪽부터 가장 안쪽까지 지정된 문자열로 구분됩니다. 카운터는 지정된 스타일 ('decimal' 기본값)로 렌더링됩니다. 자세한 내용은 자동 카운터 및 번호 매기기 섹션을 참조하십시오. 이름은 'none', 'inherit' 또는 'initial'이 아니어야 합니다. 이러한 이름은 선언을 무시하게 만듭니다.
open-quoteclose-quote
이 값은 'quotes' 속성에서 적합한 문자열로 대체됩니다.
no-open-quoteno-close-quote
콘텐츠를 도입하지 않지만, 인용부호의 중첩 수준을 증가(감소)시킵니다.
attr(X)
이 함수는 선택자의 주제에 대해 속성 X의 값을 문자열로 반환합니다. 문자열은 CSS 프로세서에 의해 파싱되지 않습니다. 선택자의 주제가 속성 X를 가지지 않은 경우, 빈 문자열이 반환됩니다. 속성 이름의 대소문자 구분 여부는 문서 언어에 따라 다릅니다.
참고. CSS 2.2에서 선택자의 주제 외의 요소에 대한 속성 값을 참조하는 것은 불가능합니다.

'display' 속성은 콘텐츠가 블록 또는 인라인 박스에 배치되는지 여부를 제어합니다.

예제:

다음 규칙은 각 H1 요소 앞에 "Chapter: "라는 문자열을 생성합니다:

H1:before { 
  content: "Chapter: ";
  display: inline;
}

작성자는 'content' 속성 뒤의 문자열 중 하나에서 "\A" 이스케이프 시퀀스를 작성하여 생성된 콘텐츠에 줄바꿈을 포함할 수 있습니다. 이 삽입된 줄바꿈은 여전히 'white-space' 속성에 영향을 받습니다. "\A" 이스케이프 시퀀스에 대한 자세한 내용은 "문자열""문자와 대소문자"를 참조하십시오.

예제:

h1:before {
    display: block;
    text-align: center;
    white-space: pre;
    content: "chapter\A hoofdstuk\A chapitre"
}

생성된 콘텐츠는 문서 트리를 변경하지 않습니다. 특히, 문서 언어 프로세서(예: 다시 파싱을 위해)로 되돌아가지 않습니다.

12.3 인용부호

CSS 2.2에서는 작성자가 스타일에 민감하고 컨텍스트에 따라 사용자 에이전트가 인용부호를 렌더링하는 방식을 지정할 수 있습니다. 'quotes' 속성은 중첩된 인용의 각 레벨에 대해 인용부호 쌍을 지정합니다. 'content' 속성은 이러한 인용부호에 접근하고 이를 인용문 앞뒤에 삽입합니다.

12.3.1 'quotes' 속성을 사용하여 인용부호 지정

이름: quotes
값: [<string> <string>]+ | none | inherit
초기값: 사용자 에이전트에 따라 다름
적용 대상: 모든 요소
상속됨:
백분율: N/A
미디어: 시각적
계산값: 지정된 대로

이 속성은 중첩된 인용의 여러 레벨에 대해 인용부호를 지정합니다. 값은 다음과 같은 의미를 가집니다:

none
'content' 속성의 'open-quote' 및 'close-quote' 값은 인용부호를 생성하지 않습니다.
[<string>  <string>]+
'content' 속성의 'open-quote' 및 'close-quote' 값은 이 인용부호 쌍 목록(열림과 닫힘)에서 가져옵니다. 첫 번째(맨 왼쪽) 쌍은 가장 바깥쪽 레벨의 인용을, 두 번째 쌍은 첫 번째 중첩 레벨을 나타냅니다. 사용자 에이전트는 중첩 레벨에 따라 적절한 인용 부호 쌍을 적용해야 합니다.

예제:

예를 들어, 다음 스타일 시트를 적용하면:

/* 두 언어에서 두 레벨의 인용부호 쌍 지정 */
q:lang(en) { quotes: '"' '"' "'" "'" }
q:lang(no) { quotes: "«" "»" '"' '"' }

/* Q 요소 콘텐츠 앞뒤에 인용부호 삽입 */
q:before { content: open-quote }
q:after  { content: close-quote }

다음 HTML 조각에 대해:

<HTML lang="en">
  <HEAD>
  <TITLE>Quotes</TITLE>
  </HEAD>
  <BODY>
    <P><Q>Quote me!</Q>
  </BODY>
</HTML>

사용자 에이전트는 다음과 같이 출력할 수 있습니다:

"Quote me!"

반면, 다음 HTML 조각:

<HTML lang="no">
  <HEAD>
  <TITLE>Quotes</TITLE>
  </HEAD>
  <BODY>
    <P><Q>Trøndere gråter når <Q>Vinsjan på kaia</Q> blir deklamert.</Q>
  </BODY>
</HTML>

는 다음과 같이 출력됩니다:

«Trøndere gråter når "Vinsjan på kaia" blir deklamert.»

참고. 이전 예제에서 'quotes'로 지정된 인용부호는 컴퓨터 키보드에서 쉽게 찾을 수 있지만, 고품질 조판에서는 다른 ISO 10646 문자가 필요할 수 있습니다. 다음 정보 표에는 일부 ISO 10646 인용부호 문자가 나열되어 있습니다:

문자 대략적인 렌더링 ISO 10646 코드 (16진수) 설명
" " 0022 QUOTATION MARK [ASCII 쌍따옴표]
' ' 0027 APOSTROPHE [ASCII 홑따옴표]
< 2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK
> 203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
« « 00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
» » 00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
` 2018 LEFT SINGLE QUOTATION MARK [single high-6]
' 2019 RIGHT SINGLE QUOTATION MARK [single high-9]
`` 201C LEFT DOUBLE QUOTATION MARK [double high-6]
'' 201D RIGHT DOUBLE QUOTATION MARK [double high-9]
,, 201E DOUBLE LOW-9 QUOTATION MARK [double low-9]

12.3.2 'content' 속성을 사용하여 인용부호 삽입

인용부호는 'open-quote''close-quote' 값을 가진 'content' 속성을 통해 적절한 위치에 삽입됩니다. 'open-quote' 또는 'close-quote'의 각 발생은 'quotes' 값의 문자열 중 하나로 대체됩니다. 이는 중첩 깊이에 따라 결정됩니다.

'open-quote'는 한 쌍의 인용부호 중 첫 번째를, 'close-quote'는 두 번째를 나타냅니다. 사용되는 인용부호 쌍은 인용의 중첩 레벨에 따라 달라집니다: 현재 발생 전까지 모든 생성된 텍스트에서 'open-quote'의 발생 횟수에서 'close-quote'의 발생 횟수를 뺀 값입니다. 깊이가 0이면 첫 번째 쌍이 사용되고, 깊이가 1이면 두 번째 쌍이 사용됩니다. 깊이가 쌍의 개수보다 크면 마지막 쌍이 반복됩니다. 깊이를 음수로 만드는 'close-quote' 또는 'no-close-quote'는 오류로 간주되며 무시됩니다(렌더링 시점에서): 깊이는 0으로 유지되고 인용부호는 렌더링되지 않지만 'content' 속성의 나머지 값은 여전히 삽입됩니다.

참고. 인용 깊이는 소스 문서의 중첩이나 포맷 구조와 독립적입니다.

일부 타이포그래피 스타일에서는 여러 단락에 걸친 인용에서 각 단락 앞에 열림 인용부호를 반복하고, 마지막 단락에서만 닫힘 인용부호를 사용하는 경우가 있습니다. CSS에서는 "가상" 닫힘 인용부호를 삽입하여 이를 구현할 수 있습니다. 키워드 'no-close-quote'는 인용 레벨을 감소시키지만, 인용부호를 삽입하지 않습니다.

예제:

다음 스타일 시트는 BLOCKQUOTE의 각 단락에 열림 인용부호를 삽입하고, 마지막에 단일 닫힘 인용부호를 삽입합니다:

blockquote p:before     { content: open-quote }
blockquote p:after      { content: no-close-quote }
blockquote p.last:after { content: close-quote }

이는 마지막 단락이 "last"라는 클래스로 표시되는 것에 의존합니다.

대칭성을 위해 'no-open-quote' 키워드도 있으며, 이는 아무것도 삽입하지 않지만 인용 깊이를 1 증가시킵니다.

12.4 자동 카운터 및 번호 매기기

CSS 2.2에서 자동 번호 매기기는 두 가지 속성, 'counter-increment''counter-reset'으로 제어됩니다. 이 속성들로 정의된 카운터는 'content' 속성의 counter() 및 counters() 함수와 함께 사용됩니다.

이름: counter-reset
값: [ <identifier> <integer>? ]+ | none | inherit
초기값: none
적용 대상: 모든 요소
상속됨: 아니요
백분율: N/A
미디어: all
계산값: 지정된 대로
이름: counter-increment
값: [ <identifier> <integer>? ]+ | none | inherit
초기값: none
적용 대상: 모든 요소
상속됨: 아니요
백분율: N/A
미디어: all
계산값: 지정된 대로

'counter-increment' 속성은 카운터(식별자)의 이름 하나 이상을 허용하며, 각 이름 뒤에 정수가 올 수 있습니다. 정수는 요소의 각 발생에 대해 카운터가 얼마나 증가하는지를 나타냅니다. 기본 증가는 1입니다. 0 및 음수 정수도 허용됩니다.

'counter-reset' 속성도 하나 이상의 카운터 이름 목록을 포함하며, 각 이름 뒤에 정수가 올 수 있습니다. 정수는 요소의 각 발생에서 카운터가 설정되는 값을 나타냅니다. 기본값은 0입니다.

'none', 'inherit', 'initial' 키워드는 카운터 이름으로 사용되어서는 안 됩니다. 'none' 값만 단독으로 사용된 경우, 카운터가 재설정 또는 증가되지 않음을 의미합니다. 'inherit' 값만 단독으로 사용된 경우, 일반적인 의미를 가집니다(예: 6.2.1). 'initial'은 향후 사용을 위해 예약되었습니다.

예제:

다음 예제는 "Chapter 1", "1.1", "1.2" 등으로 장과 섹션 번호를 매기는 방법을 보여줍니다.

BODY {
    counter-reset: chapter;      /* 장 카운터 스코프 생성 */
}
H1:before {
    content: "Chapter " counter(chapter) ". ";
    counter-increment: chapter;  /* 장 값에 1을 추가 */
}
H1 {
    counter-reset: section;      /* 섹션 값을 0으로 설정 */
}
H2:before {
    content: counter(chapter) "." counter(section) " ";
    counter-increment: section;
}

요소가 카운터를 증가/재설정하고 이를 (예: :before 또는 :after 의사 요소의 'content' 속성에서) 사용하면, 카운터는 증가/재설정 후 사용됩니다.

요소가 카운터를 재설정하고 동시에 증가시키는 경우, 카운터는 먼저 재설정되고 그 후에 증가됩니다.

동일한 카운터가 'counter-reset''counter-increment' 속성 값에 여러 번 지정된 경우, 각 카운터의 재설정/증가는 지정된 순서대로 처리됩니다.

예제:

다음 예제는 'section' 카운터를 0으로 재설정합니다:

H1 { counter-reset: section 2 section }

다음 예제는 'chapter' 카운터를 3만큼 증가시킵니다:

H1 { counter-increment: chapter chapter 2 }

'counter-reset' 속성은 계단식 규칙을 따릅니다. 따라서, 계단식 때문에 다음 스타일 시트:

H1 { counter-reset: section -1 }
H1 { counter-reset: imagenum 99 }

는 'imagenum'만 재설정합니다. 두 카운터를 모두 재설정하려면, 함께 지정해야 합니다:

H1 { counter-reset: section -1 imagenum 99 }

12.4.1 중첩된 카운터와 범위

카운터는 자손 요소나 의사 요소에서 카운터를 재설정할 때 자동으로 새로운 인스턴스를 생성하는 "자체 중첩" 특성을 가집니다. 이는 HTML에서 요소가 임의 깊이로 자체적으로 중첩될 수 있는 목록과 같은 상황에서 특히 중요합니다. 각 레벨에 대해 고유한 이름의 카운터를 정의하는 것은 불가능할 것입니다.

예제:

따라서, 다음은 중첩된 목록 항목에 번호를 매기는 데 충분합니다. 결과는 LI 요소에 'display:list-item' 및 'list-style: inside'를 설정한 것과 매우 유사합니다:

OL { counter-reset: item }
LI { display: block }
LI:before { content: counter(item) ". "; counter-increment: item }

범위는 문서에서 해당 카운터에 대해 'counter-reset'가 처음으로 존재하는 요소에서 시작되며, 해당 요소의 자손 및 다음 형제 요소와 그들의 자손을 포함합니다. 그러나 이후 형제 요소나 동일한 요소에서 나중에 'counter-reset'으로 생성된 동일한 이름의 카운터 범위 내의 요소는 포함하지 않습니다.

'counter-increment' 또는 'content'가 요소나 의사 요소에서 범위 내에 없는 카운터를 참조하는 경우, 구현은 해당 요소나 의사 요소에서 해당 카운터를 0으로 재설정한 것으로 간주해야 합니다.

위 예제에서 OL은 카운터를 생성하며, OL의 모든 자식은 해당 카운터를 참조합니다.

아이템[n]이 "item" 카운터의 n번째 인스턴스를 나타내고, "{" 및 "}"이 범위의 시작과 끝을 나타낸다고 가정하면, 다음 HTML 조각은 표시된 카운터를 사용합니다. (위 예제에서 제공된 스타일 시트를 사용한다고 가정합니다).

<OL>                    <!-- {item[0]=0        -->
  <LI>item</LI>         <!--  item[0]++ (=1)   -->
  <LI>item              <!--  item[0]++ (=2)   -->
    <OL>                <!--  {item[1]=0       -->
      <LI>item</LI>     <!--   item[1]++ (=1)  -->
      <LI>item</LI>     <!--   item[1]++ (=2)  -->
      <LI>item          <!--   item[1]++ (=3)  -->
        <OL>            <!--   {item[2]=0      -->
          <LI>item</LI> <!--    item[2]++ (=1) -->
        </OL>           <!--                   -->
        <OL>            <!--   }{item[2]=0     -->
          <LI>item</LI> <!--    item[2]++ (=1) -->
        </OL>           <!--                   -->
      </LI>             <!--   }               -->
      <LI>item</LI>     <!--   item[1]++ (=4)  -->
    </OL>               <!--                   -->
  </LI>                 <!--  }                -->
  <LI>item</LI>         <!--  item[0]++ (=3)   -->
  <LI>item</LI>         <!--  item[0]++ (=4)   -->
</OL>                   <!--                   -->
<OL>                    <!-- }{item[0]=0       -->
  <LI>item</LI>         <!--  item[0]++ (=1)   -->
  <LI>item</LI>         <!--  item[0]++ (=2)   -->
</OL>                   <!--                   -->

예제:

카운터가 중첩되지 않은 요소에서 사용될 때 범위가 어떻게 작동하는지 보여주는 또 다른 예는 다음과 같습니다. 이는 위에서 제공된 스타일 규칙이 주어진 마크업에 어떻게 적용되는지를 보여줍니다.

                     <!--"chapter" counter|"section" counter -->
<body>               <!-- {chapter=0      |                  -->
  <h1>About CSS</h1> <!--  chapter++ (=1) | {section=0       -->
  <h2>CSS 2</h2>     <!--                 |  section++ (=1)  -->
  <h2>CSS 2.2</h2>   <!--                 |  section++ (=2)  -->
  <h1>Style</h1>     <!--  chapter++ (=2) |}{ section=0      -->
</body>              <!--                 | }                -->

'counters()' 함수는 동일한 이름을 가진 범위 내 모든 카운터로 구성된 문자열을 생성하며, 주어진 문자열로 구분됩니다.

예제:

다음 스타일 시트는 중첩된 목록 항목에 "1", "1.1", "1.1.1" 등의 번호를 매깁니다.

OL { counter-reset: item }
LI { display: block }
LI:before { content: counters(item, ".") " "; counter-increment: item }

12.4.2 카운터 스타일

기본적으로 카운터는 10진수로 포맷되지만, 'list-style-type' 속성에 사용할 수 있는 모든 스타일도 카운터에 사용할 수 있습니다. 표기법은 다음과 같습니다:

counter(name)

기본 스타일에 대해, 또는:

counter(name, <'list-style-type'>)

'disc', 'circle', 'square', 'none'를 포함하여 모든 스타일이 허용됩니다.

예제:

H1:before        { content: counter(chno, upper-latin) ". " }
H2:before        { content: counter(section, upper-roman) " - " }
BLOCKQUOTE:after { content: " [" counter(bq, lower-greek) "]" }
DIV.note:before  { content: counter(notecntr, disc) " " }
P:before         { content: counter(p, none) }

12.4.3 'display: none' 속성을 가진 요소의 카운터

표시되지 않는 요소('display'가 'none'으로 설정된 경우)는 카운터를 증가시키거나 재설정할 수 없습니다.

예제:

예를 들어, 다음 스타일 시트에서 "secret" 클래스가 있는 H2는 'count2'를 증가시키지 않습니다.

H2.secret {counter-increment: count2; display: none}

생성되지 않는 의사 요소도 카운터를 증가시키거나 재설정할 수 없습니다.

예제:

예를 들어, 다음은 'heading'을 증가시키지 않습니다:

h1::before {
    content: normal;
    counter-increment: heading;
}

한편, 'visibility'가 'hidden'으로 설정된 요소는 카운터를 증가시킵니다.

12.5 목록

CSS 2.2는 기본적인 시각적 목록 포맷을 제공합니다. 'display: list-item'을 가진 요소는 요소의 콘텐츠를 위한 주요 블록 박스를 생성하고, 'list-style-type' 및 'list-style-image' 값에 따라 해당 요소가 목록 항목임을 시각적으로 나타내는 마커 박스를 생성할 수도 있습니다.

목록 속성은 목록의 기본적인 시각적 포맷을 설명합니다: 스타일 시트가 마커 유형(이미지, 글리프, 숫자)과 주요 박스에 대한 마커 위치(외부 또는 콘텐츠 앞 내부)를 지정할 수 있게 합니다. 그러나 작성자가 목록 마커의 개별 스타일(색상, 글꼴, 정렬 등)을 지정하거나 주요 박스에 대한 마커의 위치를 조정할 수 있도록 허용하지는 않습니다. 이러한 스타일은 주요 박스에서 파생될 수 있습니다.

배경 속성은 주요 박스에만 적용됩니다. 'outside' 마커 박스는 투명합니다.

12.5.1 목록: 'list-style-type', 'list-style-image', 'list-style-position', 및 'list-style' 속성

이름: list-style-type
값: disc | circle | square | decimal | decimal-leading-zero | lower-roman | upper-roman | lower-greek | lower-latin | upper-latin | armenian | georgian | lower-alpha | upper-alpha | none | inherit
초기값: disc
적용 대상: 'display: list-item'을 가진 요소
상속됨:
백분율: N/A
미디어: 시각적
계산값: 지정된 대로

이 속성은 'list-style-image' 값이 'none'이거나, URI로 지정된 이미지가 표시될 수 없는 경우 목록 항목 마커의 모양을 지정합니다. 값 'none'은 마커가 없음을 지정하며, 그렇지 않은 경우 마커에는 세 가지 유형이 있습니다: 글리프, 숫자 시스템, 알파벳 시스템.

글리프는 disc, circle, 및 square로 지정됩니다. 정확한 렌더링은 사용자 에이전트에 따라 다릅니다.

숫자 시스템은 다음과 같이 지정됩니다:

decimal
1부터 시작하는 십진수.
decimal-leading-zero
선행 0이 추가된 십진수 (예: 01, 02, 03, ..., 98, 99).
lower-roman
소문자 로마 숫자(i, ii, iii, iv, v 등).
upper-roman
대문자 로마 숫자(I, II, III, IV, V 등).
georgian
전통적인 조지아 숫자 (an, ban, gan, ..., he, tan, in, in-an, ...).
armenian
전통적인 대문자 아르메니아 숫자.

알파벳 시스템은 다음과 같이 지정됩니다:

lower-latin 또는 lower-alpha
소문자 ascii 문자(a, b, c, ... z).
upper-latin 또는 upper-alpha
대문자 ascii 문자(A, B, C, ... Z).
lower-greek
소문자 고전 그리스 문자 alpha, beta, gamma, ... (α, β, γ, ...)

이 명세서는 알파벳 시스템이 알파벳 끝에서 어떻게 래핑되는지 정의하지 않습니다. 예를 들어, 26개의 목록 항목 이후, 'lower-latin' 렌더링은 정의되지 않습니다. 따라서 긴 목록의 경우, 작성자가 실제 숫자를 지정할 것을 권장합니다.

CSS 2.2는 목록 번호 매기기가 어떻게 재설정되고 증가하는지를 정의하지 않습니다. 이는 CSS List Module에서 정의될 예정입니다. [CSS3LIST].

예를 들어, 다음 HTML 문서:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
   <HEAD>
     <TITLE>소문자 라틴 번호 매기기</TITLE>
     <STYLE type="text/css">
          ol { list-style-type: lower-roman }   
     </STYLE>
  </HEAD>
  <BODY>
    <OL>
      <LI> 첫 번째 항목입니다.
      <LI> 두 번째 항목입니다.
      <LI> 세 번째 항목입니다.
    </OL>
  </BODY>
</HTML>

는 다음과 같이 출력될 수 있습니다:

  i 첫 번째 항목입니다.
 ii 두 번째 항목입니다.
iii 세 번째 항목입니다.

목록 마커의 정렬(여기서는 오른쪽 정렬)은 사용자 에이전트에 따라 달라집니다.

이름: list-style-image
값: <uri> | none | inherit
초기값: none
적용 대상: 'display: list-item'을 가진 요소
상속됨:
백분율: N/A
미디어: 시각적
계산값: 절대 URI 또는 'none'

이 속성은 목록 항목 마커로 사용할 이미지를 설정합니다. 이미지가 사용 가능할 경우, 'list-style-type' 마커를 대체합니다.

이미지 크기는 다음 규칙에 따라 계산됩니다:

  1. 이미지가 고유 너비와 높이를 가지는 경우, 사용된 너비와 높이는 고유 너비와 높이입니다.
  2. 그렇지 않고, 이미지가 고유 비율과 고유 너비 또는 고유 높이를 가지는 경우, 제공된 고유 너비/높이는 사용되며, 누락된 차원의 값은 제공된 차원과 비율로 계산됩니다.
  3. 그렇지 않고, 이미지가 고유 비율을 가지는 경우, 사용된 너비는 1em이며, 사용된 높이는 이 너비와 고유 비율로 계산됩니다. 이 계산된 높이가 1em보다 큰 경우, 사용된 높이는 대신 1em으로 설정되고, 사용된 너비는 이 높이와 고유 비율로 계산됩니다.
  4. 그렇지 않은 경우, 이미지의 사용된 너비는 고유 너비(존재하는 경우) 또는 1em입니다. 이미지의 사용된 높이는 고유 높이(존재하는 경우) 또는 1em입니다.

예제:

다음 예제는 각 목록 항목의 시작 마커를 "ellipse.png" 이미지로 설정합니다.

ul { list-style-image: url("http://png.com/ellipse.png") }
이름: list-style-position
값: inside | outside | inherit
초기값: outside
적용 대상: 'display: list-item'을 가진 요소
상속됨:
백분율: N/A
미디어: 시각적
계산값: 지정된 대로

이 속성은 마커 박스의 위치를 주요 블록 박스에 대해 지정합니다. 값은 다음과 같은 의미를 가집니다:

outside
마커 박스는 주요 블록 박스 외부에 위치합니다. CSS 2.2에서는 부동 요소와 인접한 목록 항목 마커의 위치가 정의되지 않았습니다. CSS 2.2는 마커 박스의 정확한 위치나 페인팅 순서에서의 위치를 지정하지 않지만, 'direction' 속성이 'ltr'인 목록 항목의 경우 마커 박스가 콘텐츠의 왼쪽에 있어야 하며, 'direction' 속성이 'rtl'인 요소의 경우 콘텐츠의 오른쪽에 있어야 한다고 요구합니다. 마커 박스는 주요 블록 박스의 테두리에 대해 고정되며, 주요 블록 박스의 콘텐츠와 함께 스크롤되지 않습니다. CSS 2.2에서는 사용자 에이전트가 요소의 'overflow'가 'visible'이 아닌 경우 마커를 숨길 수 있습니다. (이는 미래에 변경될 가능성이 있습니다.) 마커 박스의 크기 또는 콘텐츠는 주요 블록 박스의 높이와/또는 첫 번째 라인 박스의 높이에 영향을 미칠 수 있으며, 일부 경우 새로운 라인 박스를 생성할 수 있습니다. 참고: 이 상호작용은 CSS의 다음 레벨에서 더 정확히 정의될 수 있습니다.
inside
마커 박스는 주요 블록 박스의 첫 번째 인라인 박스로 배치되며, 요소의 콘텐츠와 모든 :before 의사 요소 앞에 위치합니다. CSS 2.2는 마커 박스의 정확한 위치를 지정하지 않습니다.

예를 들어:

<HTML>
  <HEAD>
    <TITLE>안쪽/바깥쪽 위치 비교</TITLE>
    <STYLE type="text/css">
      ul         { list-style: outside }
      ul.compact { list-style: inside }
    </STYLE>
  </HEAD>
  <BODY>
    <UL>
      <LI>첫 번째 리스트 항목
      <LI>두 번째 리스트 항목
    </UL>

    <UL class="compact">
      <LI>첫 번째 리스트 항목
      <LI>두 번째 리스트 항목
    </UL>
  </BODY>
</HTML>

위의 예제는 다음과 같이 포맷될 수 있습니다:

안쪽 및 바깥쪽 목록 스타일 위치 차이   [D]

오른쪽에서 왼쪽 텍스트에서는 마커가 박스의 오른쪽에 위치합니다.

이름: list-style
값: [ <'list-style-type'> || <'list-style-position'> || <'list-style-image'> ] | inherit
초기값: 개별 속성 참조
적용 대상: 'display: list-item'을 가진 요소
상속됨:
백분율: N/A
미디어: 시각적
계산값: 개별 속성 참조

'list-style' 속성은 'list-style-type', 'list-style-image', 및 'list-style-position'를 스타일 시트에서 한 번에 설정하기 위한 축약 표기법입니다.

예제:

ul { list-style: upper-roman inside }  /* 모든 "ul" 요소 */
ul > li > ul { list-style: circle outside } /* "ul"의 자식인 "li"의 자식인 
                                             모든 "ul" 요소 */

작성자는 목록 항목 요소(예: HTML의 "li")에 직접 'list-style' 정보를 지정할 수 있지만, 신중히 해야 합니다. 다음 규칙은 유사해 보이지만, 첫 번째는 후손 선택자를 선언하고, 두 번째는 (더 구체적인) 자식 선택자를 선언합니다.

ol.alpha li   { list-style: lower-alpha } /* 모든 "ol"의 후손인 "li" */ 
ol.alpha > li { list-style: lower-alpha } /* 모든 "ol"의 자식인 "li" */

후손 선택자만 사용하는 작성자는 기대한 결과를 얻지 못할 수 있습니다. 다음 규칙을 고려해 보십시오:

<HTML>
  <HEAD>
    <TITLE>경고: 계단식으로 인한 예기치 않은 결과</TITLE>
    <STYLE type="text/css">
      ol.alpha li  { list-style: lower-alpha }
      ul li        { list-style: disc }
    </STYLE>
  </HEAD>
  <BODY>
    <OL class="alpha">
      <LI>레벨 1
      <UL>
         <LI>레벨 2
      </UL>
    </OL>
  </BODY>
</HTML>

원하는 렌더링은 레벨 1 목록 항목에 'lower-alpha' 라벨을, 레벨 2 항목에 'disc' 라벨을 가지는 것입니다. 그러나 계단식 순서는 첫 번째 스타일 규칙(특정 클래스 정보를 포함한)이 두 번째를 덮어쓰게 합니다. 다음 규칙은 대신 자식 선택자를 사용하여 문제를 해결합니다:

ol.alpha > li  { list-style: lower-alpha }
ul li   { list-style: disc }

또 다른 해결책은 목록 유형 요소에만 'list-style' 정보를 지정하는 것입니다:

ol.alpha  { list-style: lower-alpha }
ul        { list-style: disc }

상속은 OL 및 UL 요소로부터 LI 요소로 'list-style' 값을 전달합니다. 이는 목록 스타일 정보를 지정하는 권장 방법입니다.

예제:

URI 값은 다음과 같이 다른 값과 결합될 수 있습니다:

ul { list-style: url("http://png.com/ellipse.png") disc }

위의 예제에서, 이미지를 사용할 수 없는 경우 'disc'이 사용됩니다.

'list-style' 속성 내의 'none' 값은 'list-style-type''list-style-image' 중 다른 방식으로 지정되지 않은 항목을 'none'으로 설정합니다. 그러나 둘 다 다른 방식으로 지정된 경우, 선언은 오류로 간주되며 무시됩니다.

예제:

예를 들어, 'list-style' 속성의 'none' 값은 'list-style-type''list-style-image'를 'none'으로 설정합니다:

ul { list-style: none }

결과적으로 목록 항목 마커가 표시되지 않습니다.