CSS3 module: Lists

W3C Working Draft 7 November 2002

This version:
http://www.w3.org/TR/2002/WD-css3-lists-20021107
Latest version:
http://www.w3.org/TR/css3-lists
Previous version:
http://www.w3.org/TR/2002/WD-css3-lists-20020220
Editors:
Ian Hickson, ian@hixie.ch
Tantek Çelı̇k, Microsoft Corporation, tantekc@microsoft.com
Contributors:
Simon Montagu, AOL-TW/Netscape, smontagu@netscape.com
Daniel Yacob, yacob@geez.org
Christopher Hoess, choess@stwing.upenn.edu
Daniel Glazman, AOL-TW/Netscape, glazman@netscape.com

Abstract

This CSS level 3 module describes how lists are styled.

Status of this document

This document is a draft of one of the "modules" [CSS3INTRO] for the upcoming CSS3 specification. It extends, but also proposes changes to the functionality provided by the existing CSS level 2.

This document is a working draft of the CSS working group which is part of the style activity (see summary).

Comments on, and discussions of this draft can be sent on the (archived) public mailing list www-style@w3.org (see instructions). W3C Members can also send comments directly to the CSS working group.

This is a working draft and may therefore be updated, replaced or rendered obsolete by other W3C documents at any time. It is inappropriate to use W3C Working Drafts as reference material or to cite them as other than "work in progress". Its publication does not imply endorsement by the W3C membership or the CSS Working Group (members only).

To find the latest version of this working draft, please follow the "Latest version" link above, or visit the list of W3C Technical Reports.

Patent disclosures relevant to CSS may be found on the Working Group's public patent disclosure page.

This document may be available in translations in the future. The English version of this specification is the only normative version.

Table of contents


1. Dependencies on other modules

This CSS3 module depends on the following other CSS3 modules:

2. Introduction

The list model in this module differs in some important ways from the list model in CSS2, specifically in its handling of markers. Implementation experience suggested the CSS2 model overloaded the ::before and ::after pseudo-elements with too much behavior, while at the same time introducing new properties when existing properties were sufficient.

Most block-level elements in CSS generate one principal block box. In this module, we discuss two CSS mechanisms that cause an element to have an associated marker: one method associates one principal block box (for the element's content) with a separate marker box (for decoration such as a bullet, image, or number), and the other inserts a marker box into the principal box. Unlike :before and :after content, the marker box cannot affect the position of the principal box, whatever the positioning scheme.

For instance, the following example illustrates how markers may be used to add parentheses around each numbered list item. This HTML application and style sheet:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
 <HEAD>
  <TITLE>Creating a list with markers</TITLE>
  <STYLE type="text/css">
   LI::marker { content: "(" counter(list-item, lower-roman) ")"; }
   LI { display: list-item; }
  </STYLE>
 </HEAD>
 <BODY>
  <OL>
   <LI> This is the first item. </LI>
   <LI> This is the second item. </LI>
   <LI> This is the third item. </LI>
  </OL>
 </BODY>
</HTML>

should produce something like this:

  (i) This is the first item.
 (ii) This is the second item.
(iii) This is the third item.

With descendant selectors and child selectors, it's possible to specify different marker types depending on the depth of embedded lists.

A future release of this module will probably include ways to render tree lists.

3. Declaring a List Item

To declare a list item, the 'display' property should be set to 'list-item'. This, in addition to generating a ::marker pseudo-element and enabling the properties described below for that element, causes that element to increment the list item counter list-item. (This does not affect the specified or computed values of the counter properties.)

The list-item counter is a real counter, and can be directly affected using the 'counter-increment' and 'counter-reset' properties. It can also be used in the counter() and counters() function forms.

The CSS3 box module may define other 'display' values which generate a list marker. These should also affect the 'list-item' counter.

Note that this new model makes the marker display type redundant. That display type is therefore obsolete in the CSS3 Lists model.

4. List Content: The 'list-style-type' property

Name: 'list-style-type'
Value: <glyph> | <algorithmic> | <numeric> | <alphabetic> | <symbolic> | <non-repeating> | normal | none
Initial: disc
Applies to: all elements with 'display: list-item'
Inherited: yes
Percentages: N/A
Media: visual
Computed value: specified value
Depends on: none

This property specifies the default appearance of the list item marker if 'list-style-image' has the value 'none' or if the image pointed to by the URI cannot be displayed. The value 'none' specifies no marker, otherwise there are six types of marker: glyphs, algorithmic systems, numeric systems, alphabetic systems, symbolic systems, and non-repeating systems.

Glyphs are single characters, whereas algorithmic, numeric, alphabetic, symbolic and non-repeating systems are designed so that each item in that style gets a deterministicly different marker. This makes lists easier to navigate.

Most numbering systems have a suffix defined. It is used when generating the default content for the marker.

normal
Causes the list-style-type of the counter to be used, as declared by the appropriate @counter rule. In the context of an @counter rule, equivalent to decimal.

Other values are defined in the following sections. User agents should follow these algorithms unless a more normative source is found.

4.1. Glyphs

All markers with the same glyph style should use the same glyph. To obtain other glyphs, authors should use the 'content' property of the ::marker pseudo-element.

<glyph>
box | check | circle | diamond | disc | hyphen | square
box
A hollow square. (like □ U+25A1 WHITE SQUARE, ◻ U+25FB WHITE MEDIUM SQUARE, or ◽ U+25FD WHITE MEDIUM SMALL SQUARE)
check
A check mark. On interactive media, it is suggested that the same glyph which is used on the platform to render a checked menu item be used for 'check'. (like ✓ U+2713 CHECK MARK)
circle
A hollow circle. (like ◦ U+25E6 WHITE BULLET)
diamond
A filled diamond. On interactive media, it is suggested that the same glyph which is used on the platform next to a selected menu item be used for 'diamond'. On some platforms, this is similar to 'disc'. (like ◆ U+25C6 BLACK DIAMOND or ♦ U+2666 BLACK DIAMOND SUIT)
disc
A filled circle. (like • U+2022 BULLET)
hyphen
A hyphen bullet. (like ⁃ U+2043 HYPHEN BULLET or – U+2013 EN DASH)
square
A filled square. (like ■ U+25A0 BLACK SQUARE, ◼ U+25FC BLACK MEDIUM SQUARE, or ◾ U+25FE BLACK MEDIUM SMALL SQUARE)

The definitions above may be removed and made UA-dependent if it is found that there are discrepancies in the existing implementations.

We could add more values, there are certainly plenty to choose from in UNICODE. How about a star? Or a triangle? Note that the stylesheet of this document uses triangular bullets for notes, and yet that can only be described using a pseudo-element, content property, and unicode escape. Is that too much effort for a simple triangle?

A future level of CSS may provide a way to specify different bullet types at arbitrary nesting levels. The Working Group considered adding an auto value with the following definition, but decided not to include it in this release: "The auto value is intended to cause the UA to use a list numbering style different from that of the nearest ancestor list-item element. The exact rendering depends on the user agent."

Glyphs have no suffix.

4.2. Algorithmic

Algorithmic systems are the most complicated and are described first. For these algorithms, it is assumed that the rendering engine will apply the bidirectionality algorithm after generating the numeric strings.

Note: Readers not accustomed to reading bidirectional text should pay close attention to the directionality of characters versus their associated UNICODE codepoints. All codepoints are given in logical order, but example strings in this document should be rendered in correct reading order.

<algorithmic>
armenian | cjk-ideographic | ethiopic-numeric | georgian | hebrew | japanese-formal | japanese-informal | lower-armenian | lower-roman | simp-chinese-formal | simp-chinese-informal | syriac | tamil | trad-chinese-formal | trad-chinese-informal | upper-armenian | upper-roman
armenian, lower-armenian
This is a simple additive system defined for the range 1 to 99999999. The digits are split into two groups of four (if there are less than eight digits, the least significant group is filled first). Within each group, appropriate digits are picked from the following list (at most one per column) and written in descending order by value (thousands first). Any characters in the most significant group are then combined with a circumflex accent, ◌̂ U+0302.
Lower-armenian numbering system
Thousands Hundreds Tens Units
Values Codepoints Values Codepoints Values Codepoints Values Codepoints
1000 ռ U+057C 100 ճ U+0573 10 ժ U+056A 1 ա U+0561
2000 ս U+057D 200 մ U+0574 20 ի U+056B 2 բ U+0562
3000 վ U+057E 300 յ U+0575 30 լ U+056C 3 գ U+0563
4000 տ U+057F 400 ն U+0576 40 խ U+056D 4 դ U+0564
5000 ր U+0580 500 շ U+0577 50 ծ U+056E 5 ե U+0565
6000 ց U+0581 600 ո U+0578 60 կ U+056F 6 զ U+0566
7000 ու U+0578 U+0582 700 չ U+0579 70 հ U+0570 7 է U+0567
8000 փ U+0583 800 պ U+057A 80 ձ U+0571 8 ը U+0568
9000 ք U+0584 900 ջ U+057B 90 ղ U+0572 9 թ U+0569

The two characters for the 7000 digit should be combined and rendered as one character. When the U+0302 character combines with the 7000 characters, it does so as if the two characters were one.

The suffix for the armenian numbering system is a dot . U+002E.

Numbers outside the range of the armenian system are rendered using the decimal numbering style.

Decimal 7482951 in lower-armenian is ու̂ն̂ձ̂սջծա U+0578 U+0582 U+0302 U+0576 U+0302 U+0571 U+0302 U+057D U+057B U+056E U+0561.

cjk-ideographic
The cjk-ideographic algorithm is used by several numbering systems, using different sets of digits. These systems are defined for numbers greater than or equal to 0 and less than 1016. Numbers less than zero or equal to or greater than 1016 should use the decimal system. The core algorithm is as follows:
  1. Split the decimal number into groups of four digits, starting with the least significant digit.
  2. Ignoring groups that have the value zero, append the second group marker to the second group, the third group marker to the third group, and the fourth group marker to the fourth group. These markers are defined in the tables for the specific numbering systems. The first group has no marker.
  3. For each group, ignoring digits that have the value zero, append the second digit marker to the second digit, the third digit marker to the third digit, and the fourth digit marker to the fourth digit. These markers are defined in the tables for the specific numbering systems. The first digit has no marker.
  4. For any group with a value less than 20, remove the second digit (the 1 in the tens column). Leave any associated markers.
  5. Concatenate the groups back into a single string, least significant group last.
  6. Collapse any consecutive runs of 0 digits to a single 0.
  7. Replace each digit with the relevant character selected from the numbering system's table.

The suffix for the cjk-ideographic numbering systems is a dot . U+002E. Is there a better suffix to use?

If specified explicitly, the cjk-ideograph keyword should be handled like trad-chinese-informal.

ethiopic-numeric
The following algorithm converts decimal digits to ethiopic numbers.
  1. Split the number into groups of two digits, starting with the least significant decimal digit.
  2. Number each group sequentially, starting from the least significant as group number zero.
  3. If the group has an odd number (as given in the previous step) and has the value 1, or if the group is the most significant one and has the value 1, or if the group has the value zero, then remove the digit (but leave the group, so it still has a separator appended below).
  4. For each remaining digit, substitute the relevant ethiopic character from the list below.
    Ethiopic numbering system
    Tens Units
    Values Codepoints Values Codepoints
    10 U+1372 1 U+1369
    20 U+1373 2 U+136A
    30 U+1374 3 U+136B
    40 U+1375 4 U+136C
    50 U+1376 5 U+136D
    60 U+1377 6 U+136E
    70 U+1378 7 U+136F
    80 U+1379 8 U+1370
    90 U+137A 9 U+1371
  5. For each group with an odd number (as given in the second step), append ፻ U+137B.
  6. For each group with an even number (as given in the second step), except the group with number 0, append ፼ U+137C.
  7. Concatenate the groups into one string.

This system is defined for all numbers greater than zero. For zero and negative numbers, the decimal system is used instead.

The suffix for the ethiopic-numeric numbering systems is a dot . U+002E. Is there a better suffix to use? The alphabetic ethiopic systems use a different suffix.

The decimal number 100, in ethiopic, is ፻ U+137B

The decimal number 78010092, in ethiopic, is ፸፰፻፩፼፻፺፪ U+1378 U+1370 U+137B U+1369 U+137C U+137B U+137A U+136A.

The decimal number 780000001092, in ethiopic, is ፸፰፻፩፼፻፼፻፺፪ U+1378 U+1370 U+137B U+1369 U+137C U+137B U+137C U+137B U+137A U+136A.

georgian
This is a simple additive system (like armenian) defined only for the range 1 to 19999. The appropriate digits are picked from the following list (at most one per column) and written in descending order by value (tens of thousands first).
Georgian numbering system
Tens of Thousands Thousands Hundreds Tens Units
Values Codepoints Values Codepoints Values Codepoints Values Codepoints Values Codepoints
10000 U+10EF 1000 U+10E8 100 U+10E0 10 U+10D8 1 U+10D0
2000 U+10E9 200 U+10E1 20 U+10D9 2 U+10D1
3000 U+10EA 300 U+10E2 30 U+10DA 3 U+10D2
4000 U+10EB 400 U+10E3 40 U+10DB 4 U+10D3
5000 U+10EC 500 U+10F3 50 U+10DC 5 U+10D4
6000 U+10ED 600 U+10E4 60 U+10F2 6 U+10D5
7000 U+10EE 700 U+10E5 70 U+10DD 7 U+10D6
8000 U+10F4 800 U+10E6 80 U+10DE 8 U+10F1
9000 U+10F5 900 U+10E7 90 U+10DF 9 U+10D7

Note that these codepoints are not all sequential.

The suffix for the georgian numbering system is a dot . U+002E.

Numbers outside the range of the georgian system are rendered using the decimal numbering style.

hebrew
Due to the complexities of the hebrew system, an exact algorithm is not given here, only a description of the rules that implementations should respect. The hebrew system is based on addition and is only defined for positive numbers and zero. If someone can come up with a correct exact algorithm, then I would be happy to include it. Note: These rules have an error. I am waiting to get confirmation of how to fix them.

For each group of three digits in the decimal system, the requisite numbers are selected from the following list.

Hebrew numbering system
Hundreds Tens Units
Values Codepoints Values Codepoints Values Codepoints
100 ק U+05E7 10 י U+05D9 1 א U+05D0
200 ר U+05E8 20 כ U+05DB 2 ב U+05D1
300 ש U+05E9 30 ל U+05DC 3 ג U+05D2
400 ת U+05EA 40 מ U+05DE 4 ד U+05D3
500 תק U+05EA U+05E7 50 נ U+05E0 5 ה U+05D4
600 תר U+05EA U+05E8 60 ס U+05E1 6 ו U+05D5
700 תש U+05EA U+05E9 70 ע U+05E2 7 ז U+05D6
800 תת U+05EA U+05EA 80 פ U+05E4 8 ח U+05D7
900 תתק U+05EA U+05EA U+05E7 90 צ U+05E6 9 ט U+05D8

Groups for more significant numbers are placed before groups for less significant numbers (as in the decimal system). Each group is separated by a space U+0020.

If the last two digits of a group (when represented in decimal) are 15 or 16, they should be expressed not as יה U+05D9 U+05D4 (10+5) and יו U+05D9 U+05D5 (10+6), but as טו U+05D8 U+05D5 (9+6) and טז U+05D8 U+05D6 (9+7). This is done to avoid a close resemblance to the Tetragrammaton (four-letter name of God) יהוה U+05D9 U+05D4 U+05D5 U+05D4. Although this convention is originally derived from religious practice, it is universally used even in completely secular contexts.

The numerical value of each letter is fixed and not determined by position, so reordering a number group will not change its value. This may be done when a number spells out a word with negative connotations. For instance, 298, רצח U+05E8 U+05E6 U+05D7 (200+90+8), is the Hebrew for "murder", so it is sometimes written as רחצ U+05E8 U+05D7 U+05E6 (200+8+90). Words are sometimes similarly rearranged when a reordered form has especially positive connotations, for example 18, יח U+05D9 U+05D7 (10+8) is often written as חי U+05D7 U+05D9 (8+10), the Hebrew for "alive". Unlike the exception for 15 and 16, using the regular form in these cases is not considered an error.

When a group or set of adjacent groups would have the numerical value zero, the word for "thousands", אלפי U+05D0 U+05DC U+05E4 U+05D9, is repeatedly inserted, one for each group up to the zero. The final group of thousands in a chain has a final form ם U+05DD appended at the end. For instance the decimal number 3000123 would be represented as ג אלפי אלפים קכג U+05D2 U+0020 U+05D0 U+05DC U+05E4 U+05D9 U+0020 U+05D0 U+05DC U+05E4 U+05D9 U+05DD U+0020 U+05E7 U+05DB U+05D2 (3, space, thousands, space, thousands with final form, space, 100+20+3). For grammatical reasons, the first "thousands" word after a group consisting of only the number 1 is represented by אלף U+05D0 U+05DC U+05E3. It does not have the final ם U+05DD appended, even if it occurs on its own. The number 2000 at the end of the number is represented by אלפיים U+05D0 U+05DC U+05E4 U+05D9 U+05D9 U+05DD (and does not get anything else appended at the end). The number 2 is not otherwise special (for example 2000000 is simply ב אלפי אלפים U+05D1 U+0020 U+05D0 U+05DC U+05E4 U+05D9 U+0020 U+05D0 U+05DC U+05E4 U+05D9 U+05DD (2, space, thousands, space, thousands with final form).

Some text about geresh/gershayim is commented out here.

For zero, the word אפס U+05D0 U+05E4 U+05E1 is used.

The suffix for the hebrew numbering system is a dot . U+002E.

For numbers less than zero, the 'decimal' system is used instead.

This table shows the decimal number in the first cell, and the equivalent hebrew number in the second.

Decimal Hebrew
-3 -3
-2 -2
-1 -1
0 אפס
1 א
2 ב
3 ג
4 ד
5 ה
97 צז
98 צח
99 צט
100 ק
101 קא
944 תתקמד
945 תתקמה
946 תתקמו
999 תתקצט
1000 אלף
1001 א א
1998 א תתקצח
1999 א תתקצט
2000 אלפיים
2001 ב א
2003 ב ג
2748 ב תשמח
2750 ב תשנ
1000000 אלף אלפים
1500000 א תק אלפים
2000000 ב אלפי אלפים
9999999 ט תתקצט תתקצט
10000212 י אלפי אלפים ריב
10000425 י אלפי אלפים תכה
10000851 י אלפי אלפים תתנא
10001064 י א סד
10001277 י א רעז
980000002000 תתקפ אלפי אלפי אלפים אלפיים
990000002000 תתקצ אלפי אלפי אלפים אלפיים
1000000000000 אלף אלפי אלפי אלפים
1000500000000 אלף אלפי אלפי אלפים תק אלפי אלפים
1000500002000 אלף אלפי אלפי אלפים תק אלפיים
1003000000000 א ג אלפי אלפי אלפים
1047500002000 א מז תק אלפיים
4823885215073 ד תתכג תתפה רטו עג
5249872460970 ה רמט תתעב תס תתקע

This example (like all other examples) is non-normative. If one of the numbers above is inconsistent with the rules described above, then the example should be disregarded.

japanese-formal
This uses the cjk-ideographic system with the following table.
Formal Japanese numbering system
Values Codepoints
Second Group Marker U+4E07
Third Group Marker U+5104
Fourth Group Marker U+5146
Second Digit Marker U+62FE
Third Digit Marker U+4F70
Fourth Digit Marker U+4EDF
Digit 0 U+96F6
Digit 1 U+58F9
Digit 2 U+8CB3
Digit 3 U+53C3
Digit 4 U+8086
Digit 5 U+4F0D
Digit 6 U+9678
Digit 7 U+67D2
Digit 8 U+634C
Digit 9 U+7396
japanese-informal
This uses the cjk-ideographic system with the following table.
Informal Japanese numbering system
Values Codepoints
Second Group Marker U+842C
Third Group Marker U+5104
Fourth Group Marker U+5146
Second Digit Marker U+842C
Third Digit Marker U+5104
Fourth Digit Marker U+5146
Digit 0 U+96F6
Digit 1 U+58F9
Digit 2 U+8D30
Digit 3 U+53C1
Digit 4 U+8086
Digit 5 U+4F0D
Digit 6 U+9646
Digit 7 U+67D2
Digit 8 U+634C
Digit 9 U+7396
lower-roman
The algorithm for this numbering style is identical to the upper-roman style but using ⅰ-ⅿ U+2170-U+217F instead of Ⅰ-Ⅿ U+2160-U+216F, and ignoring step 2 (i.e. not treating numbers 1000-40000 in a special way, since there are no lowercase equivalents to ↁ U+2181 and ↂ U+2182).
simp-chinese-formal
This uses the cjk-ideographic system with the following table.
Formal simple Chinese numbering system
Values Codepoints
Second Group Marker U+4E07
Third Group Marker U+5104
Fourth Group Marker U+5146
Second Digit Marker U+4E07
Third Digit Marker 亿 U+4EBF
Fourth Digit Marker U+5146
Digit 0 U+96F6
Digit 1 U+58F9
Digit 2 U+8CB3
Digit 3 U+53C3
Digit 4 U+8086
Digit 5 U+4F0D
Digit 6 U+9678
Digit 7 U+67D2
Digit 8 U+634C
Digit 9 U+7396
simp-chinese-informal
This uses the cjk-ideographic system with the following table.
Informal simple Chinese numbering system
Values Codepoints
Second Group Marker U+842C
Third Group Marker U+5104
Fourth Group Marker U+5146
Second Digit Marker U+842C
Third Digit Marker U+5104
Fourth Digit Marker U+5146
Digit 0 U+96F6
Digit 1 U+58F9
Digit 2 U+8CB3
Digit 3 U+53C3
Digit 4 U+8086
Digit 5 U+4F0D
Digit 6 U+9678
Digit 7 U+67D2
Digit 8 U+634C
Digit 9 U+7396
syriac
The Syriac number system is capable of representing numbers greater than 0 and less than 1010. The following algorithm should be used to convert a number to the syriac system:
  1. Divide the original number by 10000000.
  2. If the resulting number has a non-zero hundreds digit, add to the string the following characters, according to the value of the hundreds digit:
    Value Codepoints
    1 ܩ̭ U+0729 U+032D
    2 ܪ̭ U+072A U+032D
    3 ܫ̭ U+072B U+032D
    4 ܬ̭ U+072C U+032D
    5 ܬ̭ܪ̭ U+072C U+032D U+072A U+032D
    6 ܬ̭ܩ̭ U+072C U+032D U+0729 U+032D
    7 ܬ̭ܫ̭ U+072C U+032D U+072B U+032D
    8 ܬ̭ܬ̭ U+072C U+032D U+072C U+032D
    9 ܬ̭ܬ̭ܩ̭ U+072C U+032D U+072C U+032D U+0729 U+032D
  3. If the resulting number has a non-zero tens digit, add to the string the following characters, according to the value of the tens digit:
    Value Codepoints
    1 ܝ̭ U+071D U+032D
    2 ܟ̭ U+071F U+032D
    3 ܠ̭ U+0720 U+032D
    4 ܡ̭ U+0721 U+032D
    5 ܢ̭ U+0722 U+032D
    6 ܣ̭ U+0723 U+032D
    7 ܦ̭ U+0726 U+032D
    8 ܦ̭ U+0726 U+032D
    9 ܨ̭ U+0728 U+032D
  4. If the resulting number has a non-zero ones digit, add to the string the following characters, according to the value of the ones digit:
    Value Codepoints
    1 ܐ̭ U+0710 U+032D
    2 ܒ̭ U+0712 U+032D
    3 ܣ̭ U+0723 U+032D
    4 ܕ̭ U+0715 U+032D
    5 ܗ̭ U+0717 U+032D
    6 ܘ̭ U+0718 U+032D
    7 ܙ̭ U+0719 U+032D
    8 ܚ̭ U+071A U+032D
    9 ܛ̭ U+071B U+032D
  5. Divide the original number by 10,000. Follow steps 2 to 4, replacing the character ◌̭ U+032D with ◌̱ U+0331.
  6. Divide the original number by 1,000. Follow step 4, replacing the character ◌̭ U+032D with ◌́ U+0301.
  7. Apply steps 2 and 3 to the original number, omitting the ◌̭ U+032D character.
  8. If the ones digit of the original number is zero, and the only character in the string (including combining characters) is ܟ U+071F, ܡ U+0721, or ܢ U+0722, add another instance of that character to the string. Otherwise, if the ones digit of the original number is not zero, apply step 4 to the original number, omitting the ◌̭ U+032D character.

This assumes that numbers 10000 to 999999 are represented using the combination of characters with the combining macron below. It is possible to represent them using the combination of characters with the combining acute accent, as well. Which form is preferred in practice?

The suffix for the syriac numbering system is a dot . U+002E.

Numbers outside the range of the syriac system are rendered using the decimal numbering style.

tamil
This system is defined for numbers in the range of 1 to 9999 inclusive, for numbers outside this range, the decimal system should be used instead. Tamil uses a combination of multiplication and addition, using the following algorithm:
  1. Insert ௲ U+0BF2 between the fourth digit and the third digit if there is a fourth digit, counting from the least significant digit. (If the number is greater than 999.)
  2. Insert ௱ U+0BF1 between the third digit and the second digit if there is a third digit, counting from the least significant digit. (If the number is greater than 99.)
  3. Insert ௰ U+0BF0 between the second digit and the first digit if there is a second digit, counting from the least significant digit. (If the number is greater than 9.)
  4. Each decimal digit is substituted for a tamil digit using the table below. Occurances of the decimal 0 character are dropped.
    Tamil numbering system
    Values Codepoints
    1 U0BE79
    2 U+0BE8
    3 U+0BE9
    4 U+0BEA
    5 U+0BEB
    6 U+0BEC
    7 U+0BED
    8 U+0BEE
    9 U+0BEF

The suffix for the tamil numbering system is a dot . U+002E.

Numbers outside the range of the tamil system are rendered using the decimal numbering style.

The number 420, in tamil, is written ௪௱௨௰ U+0BEA U+0BF1 U+0BE8 U+0BF0.

trad-chinese-formal
This uses the cjk-ideographic system with the following table.
Formal Traditional Chinese numbering system
Values Codepoints
Second Group Marker U+4E07
Third Group Marker 亿 U+4EBF
Fourth Group Marker U+5146
Second Digit Marker U+4E07
Third Digit Marker 亿 U+4EBF
Fourth Digit Marker U+5146
Digit 0 U+96F6
Digit 1 U+4E00
Digit 2 U+4EBC
Digit 3 U+4E09
Digit 4 U+56DB
Digit 5 U+4E94
Digit 6 U+516D
Digit 7 U+4E03
Digit 8 U+516B
Digit 9 U+4E5D
trad-chinese-informal
This uses the cjk-ideographic system with the following table.
Informal traditional Chinese numbering system
Values Codepoints
Second Group Marker U+842C
Third Group Marker U+5104
Fourth Group Marker U+5146
Second Digit Marker U+842C
Third Digit Marker U+5104
Fourth Digit Marker U+5146
Digit 0 U+96F6
Digit 1 U+4E00
Digit 2 U+4EBC
Digit 3 U+4E09
Digit 4 U+56DB
Digit 5 U+4E94
Digit 6 U+516D
Digit 7 U+4E03
Digit 8 U+516B
Digit 9 U+4E5D
upper-armenian
This system is identical to the lower-armenian system but uses the following codepoints instead.
Upper-armenian numbering system
Thousands Hundreds Tens Units
Values Codepoints Values Codepoints Values Codepoints Values Codepoints
1000 Ռ U+054C 100 Ճ U+0543 10 Ժ U+053A 1 Ա U+0531
2000 Ս U+054D 200 Մ U+0544 20 Ի U+053B 2 Բ U+0532
3000 Վ U+054E 300 Յ U+0545 30 Լ U+053C 3 Գ U+0533
4000 Տ U+054F 400 Ն U+0546 40 Խ U+053D 4 Դ U+0534
5000 Ր U+0550 500 Շ U+0547 50 Ծ U+053E 5 Ե U+0535
6000 Ց U+0551 600 Ո U+0548 60 Կ U+053F 6 Զ U+0536
7000 ՈՒ U+0548 U+0552 700 Չ U+0549 70 Հ U+0540 7 Է U+0537
8000 Փ U+0553 800 Պ U+054A 80 Ձ U+0541 8 Ը U+0538
9000 Ք U+0554 900 Ջ U+054B 90 Ղ U+0542 9 Թ U+0539

There are two letters for 10,000 and 20,000 (U+0555 and U+0556 respectively), but whether and how they should be used is unclear.

Decimal 7482951 in upper-armenian is ՈՒ̂Ն̂Ձ̂ՍՋԾԱ U+0548 U+0552 U+0302 U+0546 U+0302 U+0541 U+0302 U+054D U+054B U+053E U+0531.

upper-roman
Numbers are converted to roman numerals using the steps described below. The phrase "take the three least significant numbers" means divide by 1000, truncate (drop the fractional part), multiply by one thousand, and subtract this from the original number. So the three least significant figures of 1004 is 4.
  1. If the number is in the range 0 to 1000 inclusive, use the following steps:
    1. If the number is 1000, add Ⅿ U+216F and skip to the end.
    2. If the number is 900 or more, add ⅭⅯ U+216D U+216F and subtract 900.
    3. If the number is 500 or more, add Ⅾ U+216E and subtract 500.
    4. If the number is 400 or more, add ⅭⅮ U+216D U+216E and subtract 400.
    5. While the number is greater than or equal to 100, add Ⅽ U+216D and subtract 100.
    6. If the number is 90 or more, add ⅩⅭ U+2169 U+216D and subtract 90.
    7. If the number is 50 or more, add Ⅼ U+216C and subtract 50.
    8. If the number is 40 or more, add ⅩⅬ U+2169 U+216C and subtract 40.
    9. While the number is greater than 12, add Ⅹ U+2169 and subtract 10.
    10. If the number is greater than 0, then add the appropriate roman numeral from Ⅰ U+2160 (1) to Ⅻ U+216B (12). For example, if the number is 8, add Ⅷ U+2167.
  2. If the number is in the range 1000 to 40000 exclusive, then take the three least significant numbers and convert them using step 1. Then convert the remainder using the following steps and prepend it to the result.
    1. While the number is greater than or equal to 10000, add ↂ U+2182 and subtract 10000.
    2. If the number is 9000, add Ⅿↂ U+216F U+2182 and skip to the end.
    3. If the number is 4000, add Ⅿↁ U+216F U+2181 and skip to the end.
    4. If the number is 5000 or more, add ↁ U+2181 and subtract 5000.
    5. While the number is greater than 0, add Ⅿ U+216F and subtract 1000.
  3. If the number is greater than 40000, then take the three least significant figures and convert them using step 1, calling that the result. Then convert the remainder by dividing it by 1000, passing it through the entire algorithm starting at the top, adding an overbar to it, and prepending it to the current result. For very large numbers, this step may be entered several times, resulting in the first few characters of the result having multiple overbars.

The suffix for roman numerals is a dot . U+002E.

Zero and negative numbers are rendered using the decimal numbering style.

For example, decimal 4294967296 is, in the upper-roman numbering style:

triple overbar Ⅳ, double overbar Ⅽ Ⅽ
Ⅹ Ⅽ Ⅳ, overbar Ⅽ Ⅿ Ⅼ Ⅹ
Ⅶ, no overbar Ⅽ Ⅽ Ⅹ Ⅽ Ⅵ

Similarly, decimal 15000 is ↂↁ (U+2182 U+2181) and decimal -47 would be rendered as -47 (negative numbers do not have roman numeral equivalents).

4.3. Numeric

Numeric and alphabetic systems use a simple repeating scheme. Each digit is used in turn, and when the digits are exhausted, an extra column of digits is added in front and all the combinations used up to that point are reused for each of the digits. For example, if the digits are A, B and C, then the sequence would be A, B, C, AA, AB, AC, BA, BB, BC, CA, CB, CC, AAA, AAB, AAC, ABA, ABB, etc.

The difference between numeric and alphabetic systems is that numeric systems have a zero value which is not a significant digit (1, 2, ... 9, 10, 11 ...), while alphabetic systems have no zero value and their first digit is significant (A, B, ... Z, AA, AB ...). (An insignificant digit is one which could be prefixed without changing the meaning of the number. For example, 1 and 0001 are both representations of the number one, while A and AAAA represent values 18278 positions apart.) Consequently, numeric systems may go zero or negative, while alphabetic systems are only defined for positive values. If an alphabetic system is selected to render zero or a negative number then the decimal numbering style must be used instead.

<numeric>
arabic-indic | binary | bengali | cambodian | decimal | decimal-leading-zero | devanagari | gujarati | gurmukhi | kannada | khmer | lao | lower-hexadecimal | malayalam | mongolian | myanmar | octal | oriya | persian | telugu | tibetan | thai | upper-hexadecimal | urdu

Numeric systems are detailed in the table below. The value for "one" is always the second character listed, the first character being the "zero" value.

For all these systems, negative numbers are first converted as if they were positive numbers, then have - U+002D prefixed.

Numeric repeating systems
System Characters Codepoints Base Suffix Notes
arabic-indic ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩ U+0660, U+0661, U+0662, U+0663, U+0664, U+0665, U+0666, U+0667, U+0668, U+0669 10 . U+002E
binary 0 1 U+0030, U+0031 2 . U+002E
bengali ০ ১ ২ ৩ ৪ ৫ ৬ ৭ ৮ ৯ U+09E6, U+09E7, U+09E8, U+09E9, U+09EA, U+09EB, U+09EC, U+09ED, U+09EE, U+09EF 10 . U+002E
cambodian, khmer ០ ១ ២ ៣ ៤ ៥ ៦ ៧ ៨ ៩ U+17E0, U+17E1, U+17E2, U+17E3, U+17E4, U+17E5, U+17E6, U+17E7, U+17E8, U+17E9 10 . U+002E
decimal 0 1 2 3 4 5 6 7 8 9 U+0030, U+0031, U+0032, U+0033, U+0034, U+0035, U+0036, U+0037, U+0038, U+0039 10 . U+002E
decimal-leading-zero 0 1 2 3 4 5 6 7 8 9 U+0030, U+0031, U+0032, U+0033, U+0034, U+0035, U+0036, U+0037, U+0038, U+0039 10 . U+002E Note 1
devanagari ० १ २ ३ ४ ५ ६ ७ ८ ९ U+0966, U+0967, U+0968, U+0969, U+096A, U+096B, U+096C, U+096D, U+096E, U+096F 10 . U+002E
gujarati ૦ ૧ ૨ ૩ ૪ ૫ ૬ ૭ ૮ ૯ U+0AE6, U+0AE7, U+0AE8, U+0AE9, U+0AEA, U+0AEB, U+0AEC, U+0AED, U+0AEE, U+0AEF 10 . U+002E
gurmukhi ੦ ੧ ੨ ੩ ੪ ੫ ੬ ੭ ੮ ੯ U+0A66, U+0A67, U+0A68, U+0A69, U+0A6A, U+0A6B, U+0A6C, U+0A6D, U+0A6E, U+0A6F 10 . U+002E
kannada ೦ ೧ ೨ ೩ ೪ ೫ ೬ ೭ ೮ ೯ U+0CE6, U+0CE7, U+0CE8, U+0CE9, U+0CEA, U+0CEB, U+0CEC, U+0CED, U+0CEE, U+0CEF 10 . U+002E
lower-hexadecimal 0 1 2 3 4 5 6 7 8 9 a b c d e f U+0030, U+0031, U+0032, U+0033, U+0034, U+0035, U+0036, U+0037, U+0038, U+0039, U+0061, U+0062, U+0063, U+0064, U+0065, U+0066 16 . U+002E
lao ໐ ໑ ໒ ໓ ໔ ໕ ໖ ໗ ໘ ໙ U+0ED0, U+0ED1, U+0ED2, U+0ED3, U+0ED4, U+0ED5, U+0ED6, U+0ED7, U+0ED8, U+0ED9 10 . U+002E
malayalam ൦ ൧ ൨ ൩ ൪ ൫ ൬ ൭ ൮ ൯ U+0D66, U+0D67, U+0D68, U+0D69, U+0D6A, U+0D6B, U+0D6C, U+0D6D, U+0D6E, U+0D6F 10 . U+002E
mongolian ᠐ ᠑ ᠒ ᠓ ᠔ ᠕ ᠖ ᠗ ᠘ ᠙ U+1810, U+1811, U+1812, U+1813, U+1814, U+1815, U+1816, U+1817, U+1818, U+1819 10 . U+002E
myanmar ၀ ၁ ၂ ၃ ၄ ၅ ၆ ၇ ၈ ၉ U+1040, U+1041, U+1042, U+1043, U+1044, U+1045, U+1046, U+1047, U+1048, U+1049 10 . U+002E
octal 0 1 2 3 4 5 6 7 U+0030, U+0031, U+0032, U+0033, U+0034, U+0035, U+0036, U+0037 8 . U+002E
oriya ୦ ୧ ୨ ୩ ୪ ୫ ୬ ୭ ୮ ୯ U+0B66, U+0B67, U+0B68, U+0B69, U+0B6A, U+0B6B, U+0B6C, U+0B6D, U+0B6E, U+0B6F 10 . U+002E
persian, urdu ۰ ۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ U+06F0, U+06F1, U+06F2, U+06F3, U+06F4, U+06F5, U+06F6, U+06F7, U+06F8, U+06F9 10 . U+002E
telugu ౦ ౧ ౨ ౩ ౪ ౫ ౬ ౭ ౮ ౯ U+0C66, U+0C67, U+0C68, U+0C69, U+0C6A, U+0C6B, U+0C6C, U+0C6D, U+0C6E, U+0C6F 10 . U+002E
tibetan ༠ ༡ ༢ ༣ ༤ ༥ ༦ ༧ ༨ ༩ U+0F20, U+0F21, U+0F22, U+0F23, U+0F24, U+0F25, U+0F26, U+0F27, U+0F28, U+0F29 10 . U+002E
thai ๐ ๑ ๒ ๓ ๔ ๕ ๖ ๗ ๘ ๙ U+0E50, U+0E51, U+0E52, U+0E53, U+0E54, U+0E55, U+0E56, U+0E57, U+0E58, U+0E59 10 . U+002E
upper-hexadecimal 0 1 2 3 4 5 6 7 8 9 A B C D E F U+0030, U+0031, U+0032, U+0033, U+0034, U+0035, U+0036, U+0037, U+0038, U+0039, U+0041, U+0042, U+0043, U+0044, U+0045, U+0046 16 . U+002E

Note 1: Numbers -9 to 9 in the decimal-leading-zero system should be prefixed by an extra single 0 U+0030.

The decimal number -7645, in the thai numbering system, is -๗๖๔๕ U+002D U+0E57 U+0E56 U+0E54 U+0E55.

4.4. Alphabetic

<alphabetic>
afar | amharic | amharic-abegede | cjk-earthly-branch | cjk-heavenly-stem | ethiopic | ethiopic-abegede | ethiopic-abegede-am-et | ethiopic-abegede-gez | ethiopic-abegede-ti-er | ethiopic-abegede-ti-et | ethiopic-halehame-aa-er | ethiopic-halehame-aa-et | ethiopic-halehame-am-et | ethiopic-halehame-gez | ethiopic-halehame-om-et | ethiopic-halehame-sid-et | ethiopic-halehame-so-et | ethiopic-halehame-ti-er | ethiopic-halehame-ti-et | ethiopic-halehame-tig | hangul | hangul-consonant | hiragana | hiragana-iroha | katakana | katakana-iroha | lower-alpha | lower-greek | lower-norwegian | lower-latin | oromo | sidama | somali | tigre | tigrinya-er | tigrinya-er-abegede | tigrinya-et | tigrinya-et-abegede | upper-alpha | upper-greek | upper-norwegian | upper-latin

Alphabetic systems are detailed in the next table. They are similar to numeric systems, see the previous section for more details. The value for "one" is always the first character listed, there being no "zero" value for these systems. Note: Many of the codepoints in the following table are not contiguous, and several systems in this table use a suffix other than a dot.

Alphabetic repeating systems
System Characters Codepoints Base Suffix Notes
afar, ethiopic-halehame-aa-et, ethiopic-halehame-aa-er ሀ ለ ሐ መ ረ ሰ በ ተ ነ አ ከ ወ ዐ የ ደ ገ ጸ ፈ U+1200, U+1208, U+1210, U+1218, U+1228, U+1230, U+1260, U+1270, U+1290, U+12A0, U+12A8, U+12C8, U+12D0, U+12E8, U+12F0, U+1308, U+1338, U+1348 18 ፦ U+1366
amharic, ethiopic-halehame-am-et ሀ ለ ሐ መ ሠ ረ ሰ ሸ ቀ በ ተ ቸ ኀ ነ ኘ አ ከ ኸ ወ ዐ ዘ ዠ የ ደ ጀ ገ ጠ ጨ ጰ ጸ ፀ ፈ ፐ U+1200, U+1208, U+1210, U+1218, U+1220, U+1228, U+1230, U+1238, U+1240, U+1260, U+1270, U+1278, U+1280, U+1290, U+1298, U+12A0, U+12A8, U+12B8, U+12C8, U+12D0, U+12D8, U+12E0, U+12E8, U+12F0, U+1300, U+1308, U+1320, U+1328, U+1330, U+1338, U+1340, U+1348, U+1350 33 ፦ U+1366
amharic-abegede, ethiopic-abegede-am-et አ በ ገ ደ ጀ ሀ ወ ዘ ዠ ሐ ጠ ጨ የ ከ ኸ ለ መ ነ ኘ ሠ ዐ ፈ ጸ ቀ ረ ሰ ሸ ተ ቸ ኀ ፀ ጰ ፐ U+12A0, U+1260, U+1308, U+12F0, U+1300, U+1200, U+12C8, U+12D8, U+12E0, U+1210, U+1320, U+1328, U+12E8, U+12A8, U+12B8, U+1208, U+1218, U+1290, U+1298, U+1220, U+12D0, U+1348, U+1338, U+1240, U+1228, U+1230, U+1238, U+1270, U+1278, U+1280, U+1340, U+1330, U+1350 33 ፦ U+1366
cjk-earthly-branch 子 丑 寅 卯 辰 巳 午 未 申 酉 戌 亥 U+5B50, U+4E11, U+5BC5, U+536F, U+8FB0, U+5DF3, U+5348, U+672A, U+7533, U+9149, U+620C, U+4EA5 12 . U+002E
cjk-heavenly-stem 甲 乙 丙 丁 戊 己 庚 辛 壬 癸 U+7532, U+4E59, U+4E19, U+4E01, U+620A, U+5DF1, U+5E9A, U+8F9B, U+58EC, U+7678 10 . U+002E
ethiopic, ethiopic-halehame-gez ሀ ለ ሐ መ ሠ ረ ሰ ቀ በ ተ ኀ ነ አ ከ ወ ዐ ዘ የ ደ ገ ጠ ጰ ጸ ፀ ፈ ፐ U+1200, U+1208, U+1210, U+1218, U+1220, U+1228, U+1230, U+1240, U+1260, U+1270, U+1280, U+1290, U+12A0, U+12A8, U+12C8, U+12D0, U+12D8, U+12E8, U+12F0, U+1308, U+1320, U+1330, U+1338, U+1340, U+1348, U+1350 26 ፦ U+1366
ethiopic-abegede, ethiopic-abegede-gez አ በ ገ ደ ሀ ወ ዘ ሐ ጠ የ ከ ለ መ ነ ሠ ዐ ፈ ጸ ቀ ረ ሰ ተ ኀ ፀ ጰ ፐ U+12A0, U+1260, U+1308, U+12F0, U+1200, U+12C8, U+12D8, U+1210, U+1320, U+12E8, U+12A8, U+1208, U+1218, U+1290, U+1220, U+12D0, U+1348, U+1338, U+1240, U+1228, U+1230, U+1270, U+1280, U+1340, U+1330, U+1350 26 ፦ U+1366
hangul-consonant ㄱ ㄴ ㄷ ㄹ ㅁ ㅂ ㅅ ㅇ ㅈ ㅊ ㅋ ㅌ ㅍ ㅎ U+3131, U+3134, U+3137, U+3139, U+3141, U+3142, U+3145, U+3147, U+3148, U+314A, U+314B, U+314C, U+314D, U+314E 14 . U+002E
hangul 가 나 다 라 마 바 사 아 자 차 카 타 파 하 U+AC00, U+B098, U+B2E4, U+B77C, U+B9C8, U+BC14, U+C0AC, U+C544, U+C790, U+CC28, U+CE74, U+D0C0, U+D30C, U+D558 14 . U+002E
hiragana-iroha い ろ は に ほ へ と ち り ぬ る を わ か よ た れ そ つ ね な ら む う ゐ の お く や ま け ふ こ え て あ さ き ゆ め み し ゑ ひ も せ す U+3044, U+308D, U+306F, U+306B, U+307B, U+3078, U+3068, U+3061, U+308A, U+306C, U+308B, U+3092, U+308F, U+304B, U+3088, U+305F, U+308C, U+305D, U+3064, U+306D, U+306A, U+3089, U+3080, U+3046, U+3090, U+306E, U+304A, U+304F, U+3084, U+307E, U+3051, U+3075, U+3053, U+3048, U+3066, U+3042, U+3055, U+304D, U+3086, U+3081, U+307F, U+3057, U+3091, U+3072, U+3082, U+305B, U+3059 47 . U+002E One character is not in this list.
hiragana あ い う え お か き く け こ さ し す せ そ た ち つ て と な に ぬ ね の は ひ ふ へ ほ ま み む め も や ゆ よ ら り る れ ろ わ ゐ ゑ を ん U+3042, U+3044, U+3046, U+3048, U+304A, U+304B, U+304D, U+304F, U+3051, U+3053, U+3055, U+3057, U+3059, U+305B, U+305D, U+305F, U+3061, U+3064, U+3066, U+3068, U+306A, U+306B, U+306C, U+306D, U+306E, U+306F, U+3072, U+3075, U+3078, U+307B, U+307E, U+307F, U+3080, U+3081, U+3082, U+3084, U+3086, U+3088, U+3089, U+308A, U+308B, U+308C, U+308D, U+308F, U+3090, U+3091, U+3092, U+3093 48 . U+002E One character is not in this list.
katakana-iroha イ ロ ハ ニ ホ ヘ ト チ リ ヌ ル ヲ ワ カ ヨ タ レ ソ ツ ネ ナ ラ ム ウ ヰ ノ オ ク ヤ マ ケ フ コ エ テ ア サ キ ユ メ ミ シ ヱ ヒ モ セ ス U+30A4, U+30ED, U+30CF, U+30CB, U+30DB, U+30D8, U+30C8, U+30C1, U+30EA, U+30CC, U+30EB, U+30F2, U+30EF, U+30AB, U+30E8, U+30BF, U+30EC, U+30BD, U+30C4, U+30CD, U+30CA, U+30E9, U+30E0, U+30A6, U+30F0, U+30CE, U+30AA, U+30AF, U+30E4, U+30DE, U+30B1, U+30D5, U+30B3, U+30A8, U+30C6, U+30A2, U+30B5, U+30AD, U+30E6, U+30E1, U+30DF, U+30B7, U+30F1, U+30D2, U+30E2, U+30BB, U+30B9 47 . U+002E One character is not in this list.
katakana ア イ ウ エ オ カ キ ク ケ, コ サ シ ス セ ソ タ チ ツ, テ ト ナ ニ ヌ ネ ノ ハ ヒ, フ ヘ ホ マ ミ ム メ モ ヤ, ユ ヨ ラ リ ル レ ロ ワ ヰ, ヱ ヲ ン U+30A2, U+30A4, U+30A6, U+30A8, U+30AA, U+30AB, U+30AD, U+30AF, U+30B1, U+30B3, U+30B5, U+30B7, U+30B9, U+30BB, U+30BD, U+30BF, U+30C1, U+30C4, U+30C6, U+30C8, U+30CA, U+30CB, U+30CC, U+30CD, U+30CE, U+30CF, U+30D2, U+30D5, U+30D8, U+30DB, U+30DE, U+30DF, U+30E0, U+30E1, U+30E2, U+30E4, U+30E6, U+30E8, U+30E9, U+30EA, U+30EB, U+30EC, U+30ED, U+30EF, U+30F0, U+30F1, U+30F2, U+30F3 48 . U+002E Four characters are not in this list.
lower-alpha, lower-latin a b c d e f g h i j k l m n o p q r s t u v w x y z U+0061, U+0062, U+0063, U+0064, U+0065, U+0066, U+0067, U+0068, U+0069, U+006A, U+006B, U+006C, U+006D, U+006E, U+006F, U+0070, U+0071, U+0072, U+0073, U+0074, U+0075, U+0076, U+0077, U+0078, U+0079, U+007A 26 . U+002E
lower-greek α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ σ τ υ φ χ ψ ω U+03B1, U+03B2, U+03B3, U+03B4, U+03B5, U+03B6, U+03B7, U+03B8, U+03B9, U+03BA, U+03BB, U+03BC, U+03BD, U+03BE, U+03BF, U+03C0, U+03C1, U+03C3, U+03C4, U+03C5, U+03C6, U+03C7, U+03C8, U+03C9 24 . U+002E How should U+03C2 (final sigma) be treated?
lower-norwegian a b c d e f g h i j k l m n o p q r s t u v w x y z æ ø å U+0061, U+0062, U+0063, U+0064, U+0065, U+0066, U+0067, U+0068, U+0069, U+006A, U+006B, U+006C, U+006D, U+006E, U+006F, U+0070, U+0071, U+0072, U+0073, U+0074, U+0075, U+0076, U+0077, U+0078, U+0079, U+007A, U+00E6, U+00F8, U+00E5 29 none
oromo, ethiopic-halehame-om-et ሀ ለ መ ረ ሰ ሸ ቀ በ ተ ቸ ነ ኘ አ ከ ወ የ ደ ዸ ጀ ገ ጠ ጨ ጸ ጰ ፈ U+1200, U+1208, U+1218, U+1228, U+1230, U+1238, U+1240, U+1260, U+1270, U+1278, U+1290, U+1298, U+12A0, U+12A8, U+12C8, U+12E8, U+12F0, U+12F8, U+1300, U+1308, U+1320, U+1328, U+1338, U+1330, U+1348 25 ፦ U+1366
sidama, ethiopic-halehame-sid-et ሀ ለ ሐ መ ረ ሰ ሸ ቀ በ ተ ቸ ነ ኘ አ ከ ወ የ ደ ዸ ጀ ገ ጠ ጨ ጸ ጰ ፈ U+1200, U+1208, U+1210, U+1218, U+1228, U+1230, U+1238, U+1240, U+1260, U+1270, U+1278, U+1290, U+1298, U+12A0, U+12A8, U+12C8, U+12E8, U+12F0, U+12F8, U+1300, U+1308, U+1320, U+1328, U+1338, U+1330, U+1348 26 ፦ U+1366
somali, ethiopic-halehame-so-et ሀ ለ ሐ መ ረ ሰ ሸ ቀ በ ተ ነ አ ከ ኸ ወ ዐ የ ደ ጀ ገ ጸ ፈ U+1200, U+1208, U+1210, U+1218, U+1228, U+1230, U+1238, U+1240, U+1260, U+1270, U+1290, U+12A0, U+12A8, U+12B8, U+12C8, U+12D0, U+12E8, U+12F0, U+1300, U+1308, U+1338, U+1348 22 ፦ U+1366
tigre, ethiopic-halehame-tig ሀ ለ ሐ መ ረ ሰ ሸ ቀ በ ተ ቸ ነ አ ከ ወ ዐ ዘ የ ደ ጀ ገ ጠ ጨ ጸ ጰ ፈ ፐ U+1200, U+1208, U+1210, U+1218, U+1228, U+1230, U+1238, U+1240, U+1260, U+1270, U+1278, U+1290, U+12A0, U+12A8, U+12C8, U+12D0, U+12D8, U+12E8, U+12F0, U+1300, U+1308, U+1320, U+1328, U+1338, U+1330, U+1348, U+1350 27 ፦ U+1366
tigrinya-er, ethiopic-halehame-ti-er ሀ ለ ሐ መ ረ ሰ ሸ ቀ ቐ በ ተ ቸ ነ ኘ አ ከ ኸ ወ ዐ ዘ ዠ የ ደ ጀ ገ ጠ ጨ ጰ ጸ ፈ ፐ U+1200, U+1208, U+1210, U+1218, U+1228, U+1230, U+1238, U+1240, U+1250, U+1260, U+1270, U+1278, U+1290, U+1298, U+12A0, U+12A8, U+12B8, U+12C8, U+12D0, U+12D8, U+12E0, U+12E8, U+12F0, U+1300, U+1308, U+1320, U+1328, U+1330, U+1338, U+1348, U+1350 31 ፦ U+1366
tigrinya-er-abegede, ethiopic-abegede-ti-er አ በ ገ ደ ጀ ሀ ወ ዘ ዠ ሐ ጠ ጨ የ ከ ኸ ለ መ ነ ኘ ዐ ፈ ጸ ቀ ቐ ረ ሰ ሸ ተ ቸ ጰ ፐ U+12A0, U+1260, U+1308, U+12F0, U+1300, U+1200, U+12C8, U+12D8, U+12E0, U+1210, U+1320, U+1328, U+12E8, U+12A8, U+12B8, U+1208, U+1218, U+1290, U+1298, U+12D0, U+1348, U+1338, U+1240, U+1250, U+1228, U+1230, U+1238, U+1270, U+1278, U+1330, U+1350 31 ፦ U+1366
tigrinya-et, ethiopic-halehame-ti-et ሀ ለ ሐ መ ሠ ረ ሰ ሸ ቀ ቐ በ ተ ቸ ኀ ነ ኘ አ ከ ኸ ወ ዐ ዘ ዠ የ ደ ጀ ገ ጠ ጨ ጰ ጸ ፀ ፈ ፐ U+1200, U+1208, U+1210, U+1218, U+1220, U+1228, U+1230, U+1238, U+1240, U+1250, U+1260, U+1270, U+1278, U+1280, U+1290, U+1298, U+12A0, U+12A8, U+12B8, U+12C8, U+12D0, U+12D8, U+12E0, U+12E8, U+12F0, U+1300, U+1308, U+1320, U+1328, U+1330, U+1338, U+1340, U+1348, U+1350 34 ፦ U+1366
tigrinya-et-abegede, ethiopic-abegede-ti-et አ በ ገ ደ ጀ ሀ ወ ዘ ዠ ሐ ጠ ጨ የ ከ ኸ ለ መ ነ ኘ ሠ ዐ ፈ ጸ ቀ ቐ ረ ሰ ሸ ተ ቸ ኀ ፀ ጰ ፐ U+12A0, U+1260, U+1308, U+12F0, U+1300, U+1200, U+12C8, U+12D8, U+12E0, U+1210, U+1320, U+1328, U+12E8, U+12A8, U+12B8, U+1208, U+1218, U+1290, U+1298, U+1220, U+12D0, U+1348, U+1338, U+1240, U+1250, U+1228, U+1230, U+1238, U+1270, U+1278, U+1280, U+1340, U+1330, U+1350 34 ፦ U+1366
upper-alpha, upper-latin A B C D E F G H I J K L M N O P Q R S T U V W X Y Z U+0041, U+0042, U+0043, U+0044, U+0045, U+0046, U+0047, U+0048, U+0049, U+004A, U+004B, U+004C, U+004D, U+004E, U+004F, U+0050, U+0051, U+0052, U+0053, U+0054, U+0055, U+0056, U+0057, U+0058, U+0059, U+005A 26 . U+002E
upper-greek Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω U+0391, U+0392, U+0393, U+0394, U+0395, U+0396, U+0397, U+0398, U+0399, U+039A, U+039B, U+039C, U+039D, U+039E, U+039F, U+03A0, U+03A1, U+03A3, U+03A9 24 . U+002E
upper-norwegian A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Æ Ø Å U+0041, U+0042, U+0043, U+0044, U+0045, U+0046, U+0047, U+0048, U+0049, U+004A, U+004B, U+004C, U+004D, U+004E, U+004F, U+0050, U+0051, U+0052, U+0053, U+0054, U+0055, U+0056, U+0057, U+0058, U+0059, U+005A, U+00C6, U+00D8, U+00C5 29 none

4.5. Symbolic

Symbolic systems use a very simple repeating scheme. Each symbol is used in turn, and once the last symbol has been used, the same symbols are used again but in pairs, and then in threes, and then fours, and so on.

<symbolic>
asterisks | footnotes
asterisks
Increasing numbers of asterisks (*, **, ***, ****, ...)
footnotes
Symbols used to denote footnotes (*, ⁑, †, ‡, ...)

Symbolic systems are detailed in the next table. Like glyphs, they have no suffix.

Symbolic repeating systems
System Characters Codepoints Notes
asterisks * U+002A
footnotes * ⁑ † ‡ U+002A, U+2051, U+2020, U+2021 What about U+2042 ASTERISM?

For example, the first 14 digits of the footnotes system are *, ⁑, †, ‡, **, ⁑⁑, ††, ‡‡, ***, ⁑⁑⁑, †††, ‡‡‡, ****, ⁑⁑⁑⁑.

4.6. Non-repeating

The last kind of numbering system is non-repeating. These specify a one to one mapping of numbers to UNICODE glyphs. These are only useful for limited ranges of numbers, beyond which user agents must either synthesize the missing glyphs or fall back on the decimal numbering style.

Should we explicitly define the rules for synthesis? Should we forbid synthesis?

<non-repeating>
circled-decimal | circled-lower-latin | circled-upper-latin | dotted-decimal | double-circled-decimal | filled-circled-decimal | parenthesised-decimal | parenthesised-lower-latin

The mappings for each non-repeating system is described below. These numbering systems do not have suffixes, as they typically contain their own punctuation.

Non-repeating systems
System Range Codepoint Mapping
circled-decimal 0-20
Value 0 1 2 ... 19 20
Character ...
Codepoint U+24EA U+2460 U+2461 ... U+2472 U+2473
circled-lower-latin 1-26
Value 1 2 3 ... 25 26
Character ...
Codepoint U+24D0 U+24D1 U+24D2 ... U+24E8 U+24E9
circled-upper-latin 1-26
Value 1 2 3 ... 25 26
Character ...
Codepoint U+24B6 U+24B7 U+24B8 ... U+24CE U+24CF
dotted-decimal 1-20
Value 1 2 3 ... 19 20
Character ...
Codepoint U+2488 U+2489 U+248A ... U+249A U+249B
double-circled-decimal 1-10
Value 1 2 3 ... 9 10
Character ...
Codepoint U+24F5 U+24F6 U+24F7 ... U+24FD U+24FE
filled-circled-decimal 11-20
Value 11 12 13 ... 19 20
Character ...
Codepoint U+24EB U+24EC U+24ED ... U+24F3 U+24F4
parenthesised-decimal 1-20
Value 1 2 3 ... 19 20
Character ...
Codepoint U+2474 U+2475 U+2476 ... U+2486 U+2487
parenthesised-lower-latin 1-26
Value 1 2 3 ... 25 26
Character ...
Codepoint U+249C U+249D U+249E ... U+24B4 U+24B5

Note: The following systems and UNICODE characters have not been given keywords: The superscript and subscript digits (starting at U+2070), the tag characters (starting at U+E0001), the variation forms of latin and greek characters (starting at U+1D400), the halfwidth and fullwidth forms (starting at U+FF01), most of the dingbats (starting at U+2701, including about 64 different star-like bullets, a dozen square bullets, three different kinds of circled decimal digits, as well as a sleuth of arrows and icons like pens and pencils), any of the miscellaneous symbols (starting at U+2600, including numbered recycled symbols, die faces, and many other icons), some of the General Punctuation bullets (e.g. hyphens and dashes at U+2010 to U+2015, triangular bullets starting at U+2023), most of the geometric shapes (starting at U+25A0, including U+25C9), all the enclosed cjk letters and months (starting at U+3200), hangzhou-style numerals (U+3021 to U+3029), the traditional greek numbering systems, the new ethiopic romanised Oromo system Qubee, korean, korean-hangul, korean-check, coptic, and probably many others.

4.7. Unsupported list styles

A user agent that does not recognize a numbering system should ignore the declaration in which the numbering system is used.

For example, the following HTML document:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
 <HEAD>
  <TITLE>Lowercase latin numbering</TITLE>
  <STYLE type="text/css">
   OL { list-style-type: lower-roman; list-style-type: ethiopic-halehame-om-et; }
  </STYLE>
 </HEAD>
 <BODY>
  <OL>
   <LI> This is the first item.
   <LI> This is the second item.
   <LI> This is the third item.
  </OL>
 </BODY>
</HTML>

might produce something like this in a user agent that does not support the ethiopic-halehame-om-et list style type:

   i. This is the first item.
  ii. This is the second item.
 iii. This is the third item.

Note that the list marker alignment (here, right justified) depends on the user agent style sheet's rules for the ::marker pseudo-element.

5. List Content: The 'list-style-image' property

Name: 'list-style-image'
Value: <uri> | none
Initial: none
Applies to: all elements with 'display: list-item'
Inherited: yes
Percentages: N/A
Media: visual
Computed value: specified value
Depends on: none

This property sets the image that will be used as the list item marker. When the image is available, it will replace the marker set with the 'list-style-type' marker.

The following example sets the marker at the beginning of each list item to be the image "ellipse.png".

LI { list-style-image: url("http://www.example.com/ellipse.png") }

6. List Content: Generating the computed value of the 'content' property

If a ::marker pseudo-element has its 'content' property set to normal, the following algorithm should be used to generate the computed value of the property. Note that there being a computed value of the 'content' property is not enough for the ::marker pseudo-element to be rendered. See the section on the 'list-style-position' property below.

  1. If 'list-style-image' is not 'none', and if the image is valid, then the content is the value of the 'list-style-image' property.
  2. Otherwise, if the list-style-type property is not 'none', then the computed value of the 'content' property is counter(list-item, <list-style-type>) followed by a string, where <list-style-type> is the computed value of the 'list-style-type' property, or the default style type for the list-item counter if the 'list-style-type' has the value 'normal', and the string is the suffix for the list style type in question (which may be empty).
  3. Otherwise the computed value is inhibit. (Note: This is not the same as the empty string, nor the same as none.)

Ths algorithm may be superseded by a more detailed algorithm given in the Generated and Replaced Content module, when it is released.

Given the following style sheet:

li { display: list-item; list-style-type: decimal /* initial value */; }
li::marker { content: normal /* initial value */; }

And the following document fragment:

<li> List Item </li>

The computed value of the 'content' property on the ::marker pseudo-element of the list item element is:

counter(list-item, decimal) '\002E'

7. Marker Position: The 'list-style-position' property

Name: 'list-style-position'
Value: inside | outside
Initial: outside
Applies to: all elements with 'display: list-item'
Inherited: yes
Percentages: N/A
Media: visual
Computed value: specified value
Depends on: none

This property specifies the position of the marker box in the principal block box. Values have the following meanings:

outside
The marker box is outside the principal block box, as described in the section on the ::marker pseudo-element below.
inside
The ::marker pseudo-element is an inline element placed immediately before all ::before pseudo-elements in the principal block box, after which the element's content flows. Note that if there is no inline content, this will create a line box, just as content in an inline ::before pseudo-element would. Also note that all the properties that apply to inline elements apply to the ::marker pseudo-element in this state, and this ::marker box participates in the inline box model in the normal manner.

Note that a marker is only generated if the computed value of the 'content' property for the element's ::marker pseudo-element is not inhibit.

For example:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
 <HEAD>
  <TITLE>Comparison of inside/outside position</TITLE>
  <STYLE type="text/css">
   UL         { list-style: outside }
   UL.compact { list-style: inside }
  </STYLE>
 </HEAD>
 <BODY>
  <UL>
   <LI>first list item comes first</LI>
   <LI>second list item comes second</LI>
  </UL>
  <HT>
  <UL class="compact">
   <LI>first list item comes first</LI>
   <LI>second list item comes second</LI>
  </UL>
 </BODY>
</HTML>

The above example may be formatted as:

list with bullets to the left of it and list with bullets
inside

In right-to-left text, the markers would have been on the right side of the box.

8. The 'list-style' shorthand property

Name: 'list-style'
Value: [ <'list-style-type'> || <'list-style-position'> || <'list-style-image'> ]
Initial: not defined for shorthand properties
Applies to: all elements with 'display: list-item'
Inherited: not defined for shorthand properties
Percentages: N/A
Media: visual
Computed value: not defined for shorthand properties
Depends on: none

The 'list-style' property is a shorthand notation for setting the three properties 'list-style-type', 'list-style-image', and 'list-style-position' at the same place in the style sheet.

For example:

UL { list-style: upper-roman inside }  /* Any UL */
UL > UL { list-style: circle outside } /* Any UL child of a UL */

Although authors may specify 'list-style' information directly on list item elements (e.g., LI in HTML), they should do so with care. The following rules look similar, but the first declares a descendant selector and the second a (more specific) child selector.

OL.alpha LI   { list-style: lower-alpha } /* Any LI descendant of an OL */
OL.alpha > LI { list-style: lower-alpha } /* Any LI child of an OL */

Authors who use only the descendant selector may not achieve the results they expect. Consider the following rules:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
 <HEAD>
  <TITLE>WARNING: Unexpected results due to cascade</TITLE>
  <STYLE type="text/css">
   OL.alpha LI  { list-style: lower-alpha }
   UL LI        { list-style: disc }
  </STYLE>
 </HEAD>
 <BODY>
  <OL class="alpha">
   <LI>level 1
    <UL>
     <LI>level 2</LI>
    </UL>
   </LI>
  </OL>
 </BODY>
</HTML>

The desired rendering would have level 1 list items with 'lower-alpha' labels and level 2 items with 'disc' labels. However, the cascading order will cause the first style rule (which includes specific class information) to mask the second. The following rules solve the problem by employing a child selector instead:

OL.alpha > LI   { list-style: lower-alpha }
UL LI           { list-style: disc }

Another solution would be to specify 'list-style' information only on the list type elements:

OL.alpha   { list-style: lower-alpha }
UL         { list-style: disc }

Inheritance will transfer the 'list-style' values from OL and UL elements to LI elements. This is the recommended way to specify list style information.

A URI value may be combined with any other value, as in:

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

In the example above, the 'disc' will be used when the image is unavailable.

A value of 'none' for the 'list-style' property sets both 'list-style-type' and 'list-style-image' to 'none', because it sets the 'list-style-type' to none (that is the first value in the list), and the initial value of the 'list-style-image' property, which isn't listed in that declaration, is none. For this reason,

LI { list-style: none; }

will ensure that no list-item marker is displayed on LI elements, except if a value is explicitly given to the 'content' property of the ::marker pseudo-element. In general, the best way to ensure that no marker is rendered is to not set the 'display' property to list-item.

9. Markers: The ::marker pseudo-element

Markers are created by setting an element's 'display' property to list-item. The list-item display type is, in every other respect, identical to the block display type.

The marker box is only created if the computed value of the 'content' property for the pseudo-element is not inhibit. The rest of this section discusses the details of the positioning of the marker box if it is positioned outside. For details on positioning the marker box when it is an inside list marker, see the section on 'list-style-position'.

If the elements' 'list-style-position' property has the value outside, then the value of the element's ::marker pseudo-element's 'content' property is formatted in an independent marker box, outside the principal box. Marker boxes are formatted as an inline-block (i.e., they fit in one line box), so they are not as flexible as floats or absolutely positioned boxes.

Marker boxes have padding, borders and margins, just like inline-block elements. The marker box will be vertically aligned with the first line of content in the principal box, as specified by the pseudo-element's 'vertical-align' property. The marker box participates in the height calculation of the principal box's first line box. Thus, markers are aligned with the first line of an element's content. If no first line box exists in a principal box, the marker box establishes its line box alone. (The first line of a principle box is the one matched by the box's '::first-line' pseudo-element.)

The marker box is horizontally aligned with the start of the line box. Thus if a float intersects the element, moving the line box start, the marker box is moved as well. It is the responsibility of the author to ensure that sufficient margins are provided to prevent marker boxes overlapping with the floats. If the marker box is generating the line box, then it is aligned with the content area's start edge. The box model defines the properties 'float-displace' and 'indent-edge-reset' to control how far line boxes are moved in the presence of floats.

If the value of the 'width' property is auto, the marker box content width is that of the content, otherwise it is the value of 'width'. For values of 'width' less than the content width, the overflow is visible. The 'overflow' property does not apply. The 'text-align' property determines the horizontal alignment of the content in the marker box.

Marker boxes may overlap principal boxes and other marker boxes. Overlap could happen for several reasons. If several nested elements without inline content all have marker boxes, for instance, or if a marker box has negative margins. Marker boxes are rendered at the same stack level as inline content of the principle box, as if it was the first box of the first line box.

The CSS2 'marker-offset' property is obsoleted in this model and has no effect. (It is replaced by the 'margin-right' property in left-to-right text, and the 'margin-left' property in right-to-left text.)

In the following example, the content is centered within a marker box of a fixed width. This document:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
 <HEAD>
  <TITLE>Content alignment in the marker box</TITLE>
  <STYLE type="text/css">
   LI::marker { 
     content: "(" counter(counter) ")";
     width: 6em;
     text-align: center;
   }
   LI {
     display: list-item;
     counter-increment: counter;
   }
  </STYLE>
 </HEAD>
 <BODY>
  <OL>
   <LI> This is the first item. </LI>
   <LI> This is the second item. </LI>
   <LI> This is the third item. </LI>
  </OL>
 </BODY>
</HTML>

should produce something like this:

  (1)    This is the 
         first item.
  (2)    This is the 
         second item.
  (3)    This is the 
         third item.

The next example uses markers to number notes (paragraphs).

The following document:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
 <HEAD>
  <TITLE>Markers to create numbered notes4>/TITLE>
  <STYLE type="text/css">
   P { margin-left: 12 em; }
   P.Note::marker { 
      content: url("note.gif") "Note " counter(note-counter) ":";
      text-align: left;
      width: 10em;
   }
   P.Note {
     display: list-item;
     counter-increment: note-counter;
   }
  </STYLE>
 </HEAD>
 <BODY>
  <P>This is the first paragraph in this document.</P>
  <P CLASS="Note">This is a very short document.</P>
  <P>This is the end.</P>
 </BODY>
</HTML>

should produce something like:

            This is the first paragraph 
            in this document.

  Note 1:   This is a very short 
            document.
           
            This is the end.

The following example illustrates how markers may be offset from their element. This HTML application and style sheet:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE>Marker example 5</TITLE>
  <STYLE type="text/css">
   P { margin-left: 8em } /* Make space for counters */
   LI::marker { margin: 0 3em 0 0; content: counter(list-item, lower-roman) "."; }
   LI { display: list-item }
  </STYLE>
 </HEAD>
 <BODY>
  <P> This is a long preceding paragraph ...</P>
  <OL>
   <LI> This is the first item.
   <LI> This is the second item.
   <LI> This is the third item.
  </OL>
  <P> This is a long following paragraph ...</P>
 </BODY>
</HTML>

should produce something like this:

        This is a long preceding
        paragraph ...
      
   i.   This is the first item.
  ii.   This is the second item.
 iii.   This is the third item.

        This is a long following
        paragraph ...

(Note the use of the implicit counter increment.)

10. Profiles

This module has two profiles: CSS Level 1 and Full. There is no CSS2 profile because this module is incompatible with the CSS2 list model.

The CSS Level 1 module consists of 'list-style', 'list-style-position', 'list-style-image', and 'list-style-type' (but only the following values: 'disc', 'circle, square', 'decimal', 'lower-roman', 'upper-roman', 'lower-alpha', 'upper-alpha', 'none'). It does not include the ::marker pseudo element.

The Full profile contains everything.

11. Sample style sheet for HTML 4.0

This section is informative, nor normative.


 /* Set up list items */
 li { display: list-item; /* counter-increment: list-item; (implied by display: list-item) */ }

 /* Set up ol and ul so that they reset the list-item counter */
 ol, ul { counter-reset: list-item; }

 /* Default list style types for ordered lists */
 ol { list-style-type: decimal; }

 /* Default list style types for unordered lists up to 3 deep */
 ul { list-style-type: disc; }
 ul ul { list-style-type: square; }
 ul ul ul { list-style-type: circle; }

 /* The type attribute on ol and ul elements */
 ul[type="disc"] { list-style-type: disc; }
 ul[type="circle"] { list-style-type: circle; }
 ul[type="square"] { list-style-type: square; }
 ol[type="1"] { list-style-type: decimal; }
 ol[type="a"] { list-style-type: lower-alpha; }
 ol[type="A"] { list-style-type: upper-alpha; }
 ol[type="i"] { list-style-type: lower-roman; }
 ol[type="I"] { list-style-type: upper-roman; }

 /* The start attribute on ol elements */
 ol[start] { counter-reset: list-item attr(start, integer, 1); counter-increment: list-item -1; }

 /* The value attribute on li elements */
 li[value] { counter-reset: list-item attr(value, integer, 1); counter-increment: none; }

 /* The above rules don't fully describe HTML4 lists, since they do not cover
    behaviors such as margins and the like. The following rules could be used
    for this purpose:

    ol, ul { display: block; margin: 1em 0; padding-left: 2.5em; }
    ol ol, ol ul, ul ul, ul ol { margin-top: 0; margin-bottom: 0; }  
    li::marker { margin-right: 1em; text-align: right; }

  */

Another example is required here.

Acknowledgments

The following people and documentation they wrote were very useful for defining the numbering systems: Alexander Savenkov, Frank Tang, Jonathan Rosenne, Karl Ove Hufthammer, Musheg Arakelyan, and Randall Bart.

Changes From CSS2

As described in the introduction section, there are significant changes in this module when compared to CSS2.

  1. display:marker has been replaced with ::marker
  2. It is no longer possible to make end markers.
  3. The 'marker-offset' property is obsoleted.
  4. The marker display type is obsoleted.
  5. Markers are now aligned relative to the line box edge, rather than the border edge.
  6. Markers now have margins.
  7. The introduction of many new list style types as well as explicit algorithms for all list style types.
  8. Error handling rules for unknown list style types were changed to be consistent with the normal parsing error handling rules.
  9. The list-item predefined counter identifier has been introduced.

References

Normative references

[CSS3BOX]
Bert Bos. CSS3 module: box model. 26 July 2001. W3C working draft. (Work in progress.) URL: http://www.w3.org/TR/2001/WD-css3-box-20010726
[CSS3GENCON]
Håkon Wium Lie; Ian Hickson. CSS3 module: generated text. (forthcoming). W3C working draft. (Work in progress.)
[CSS3LINE]
Eric A. Meyer. CSS3 module: linebox model. (forthcoming). W3C working draft. (Work in progress.)
[CSS3SYN]
David Baron. CSS3 module: syntax. (forthcoming). W3C working draft. (Work in progress.)
[CSS3VAL]
Håkon Wium Lie. CSS3 module: values and units. (forthcoming). W3C working draft. (Work in progress.)
[SELECT]
Daniel Glazman; Tantek Çelik; Ian Hickson; et al. Selectors. 13 Nov 2001. W3C Candidate Recommendation. URL: http://www.w3.org/TR/2001/CR-css3-selectors-20011113

Other references

[CSS3INTRO]
Eric A. Meyer; Bert Bos. Introduction to CSS3. 23 May 2001. W3C working draft. (Work in progress.) URL: http://www.w3.org/TR/css3-roadmap

Index