logo-w3c
(nikt jeszcze nie ocenił tego wpisu)
Loading...Loading...

Rozdział 12. Treść generowana, numerowanie automatyczne oraz listy

12 Treść generowana, numerowanie automatyczne oraz listy

Czasami konieczne jest wygenerowanie treści nie pochodzącej z drzewa dokumentu. Jedną z takich sytuacji jest tworzenie listy numerowanej. Autor nie wpisuje numerów bezpośrednio — są one generowane automatycznie przez aplikację kliencką. Analogicznie można spowodować wstawianie przez aplikację kliencką słowa "Rysunek" przed podpisem rysunku albo słowa "Rozdział 7" przed tytułem siódmego rozdziału. Aplikacje klienckie powinny w szczególności potrafić wstawiać takie łańcuchy w kontekstach audio i Braille’a.

W CSS 2.1 są dwa mechanizmy umożliwiające generowanie treści:

  • Własność ‚content’ w połączeniu z pseudoelementami :before i :after.
  • Elementy z własnością ‚display’ ustawioną na ‚list-item’.

12.1 Pseudoelementy :before i :after

Styl i miejsce występowania treści generowanej określa się za pomocą pseudoelementów :before i :after. Jak ich nazwy wskazują, pseudoelementy te określają położenie treści przed (:before) i za (:after) treścią elementu w drzewie dokumentu. Własność ‚content’ służy do określania treści, którą te pseudoelementy mają wstawić.

Przykłady:

Poniższa reguła na przykład wstawia łańcuch "Uwaga:" przed treścią wszystkich elementów P mających atrybut "class" o wartości "note":

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

Treść generowana jest zaliczana do treści obiektu formatującego (np. pola) wygenerowanego przez element. Zmienimy powyższy arkusz stylów w następujący sposób:

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

Modyfikacja ta spowoduje pojawienie się zielonego obramowania wokół całego akapitu, włącznie z pierwszym łańcuchem.

Pseudoelementy :before i :after dziedziczą wszystkie dziedziczne własności po elemencie z drzewa dokumentu, do którego są dołączone.

Przykłady:

Poniższe reguły wstawiają cudzysłów otwierający przed każdym elementem Q. Kolor tego cudzysłowu będzie czerwony, natomiast własności pisma pozostaną takie same, jak w całym elemencie Q:

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

Własności niedziedziczne w deklaracjach pseudoelementów :before i :after przyjmują wartości początkowe.

Przykłady:

Na przykład wartość początkowa własności ‚display’ to ‚inline’, dzięki czemu cytat w powyższym przykładzie zostanie wstawiony jako pole śródliniowe (tzn. w tej samej linii, co pozostała treść tekstowa elementu). Poniższa reguła ustawia własność ‚display’ na ‚block’, dzięki czemu wstawiony tekst będzie blokiem:

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

Pseudoelementy :before i :after oddziałują wzajemnie z innymi polami, np. typu ‚run-in’, tak, jakby były prawdziwymi elementami wstawionymi wewnątrz elementów, z którymi są związane.

Przykłady:

Na przykład poniższy fragment dokumentu i arkusz stylów:

<h2> Nagłówek </h2>             h2 { display: run-in; }
<p> Tekst </p>                  p:before { display: block; content: 'Jakiś'; }

zostałyby sformatowane dokładnie tak samo, jak poniższy fragment dokumentu i arkusz stylów:

<h2> Nagłówek </h2>          h2 { display: run-in; }
<p><span>Jakiś</span> Tekst </p>  span { display: block }

Analogicznie poniższy fragment dokumentu i arkusz stylów:

<h2> Nagłówek </h2>   h2 { display: run-in; }
                      h2:after { display: block; content: 'Rzecz'; }
<p> Tekst </p>

zostałyby sformatowane dokładnie tak samo, jak poniższy fragment dokumentu i arkusz stylów:

<h2> Nagłówek <span>Rzecz</span></h2> h2 { display: block; }
                                      span { display: block; }
<p> Tekst </p>

Uwaga: specyfikacja ta nie definiuje w pełni interakcji pseudoelementów :before i :after z elementami zastępowanymi (np. IMG w języku HTML). Zostanie to uściślone w jednej z przyszłych wersji specyfikacji.

12.2 Własność ‚content’

‚content’
Wartość:  normal | none | [ <string> | <uri> | <counter> | attr(<identifier>) | open-quote | close-quote | no-open-quote | no-close-quote ]+ | inherit
Wartość domyślna:  normal
Zastosowanie:  pseudoelementy :before i :after
Dziedziczenie:  nie
Wartości procentowe:  nie dotyczy
Media:  wszystkie
Wartość obliczana:  W elementach zawsze zostaje obliczona na ‚normal’. W pseudoelementach :before i :after wartość ‚normal’ jest zamieniana na ‚none’. Identyfikatory URI są zamieniane na bezwzględne; wartości attr() — na łańcuchy; pozostałe słowa kluczowe — jak określono.

Własność ta w połączeniu z pseudoelementami :before i :after służy do generowania treści w dokumencie. Opis wartości:

none
Pseudoelement nie jest generowany.
normal
Dla pseudoelementów :before i :after zostaje zamieniona na ‚none’.
<string>

Treść tekstowa (zobacz podrozdział o łańcuchach).

<uri>
Identyfikator URI wskazujący zasób zewnętrzny (np. obraz). Jeśli aplikacja kliencka nie może wyświetlić zasobu, musi zachować się tak, jakby zasób ten w ogóle nie został określony lub wyświetlić jakiś znak informujący, że nie można wyświetlić zasobu.
<counter>
Liczniki można określać za pomocą dwóch funkcji: ‚counter()’ i ‚counters()’. Pierwsza z nich ma dwie postaci: ‚counter(nazwa)’ i ‚counter(nazwa, styl)’. Wygenerowany tekst jest wartością najgłębiej zagnieżdżonego licznika o danej nazwie w zakresie w tym pseudoelemencie. Jego formatowanie określa podany styl (domyślnie ‚decimal’). Druga funkcja również ma dwie postaci: ‚counters(nazwa, łańcuch)’ i ‚counters(nazwa, łańcuch, styl)’. Wygenerowany tekst jest wartością wszystkich liczników o danej nazwie w zakresie w tym pseudoelemencie, od najpłycej do najgłębiej zagnieżdżonego, oddzielone podanym łańcuchem. Formatowanie tych liczników określa zdefiniowany styl (domyślnie ‚decimal’). Aby uzyskać szczegółowe informacje, zobacz podrozdział o automatycznych licznikach i numerowaniu. Nazwą nie może być ‚none’, ‚inherit’ ani ‚initial’. Deklaracje z tymi nazwami są ignorowane.
open-quote i close-quote
Wartości te są zastępowane odpowiednim łańcuchem pobranym z własności ‚quotes’.
no-open-quote i no-close-quote
Nie dodaje żadnej treści, ale zwiększa (lub zmniejsza) poziom zagnieżdżenia cudzysłowów.
attr(X)
Funkcja zwracająca jako łańcuch wartość atrybutu X przedmiotu selektora. Łańcuch ten nie jest przetwarzany przez procesor CSS. Jeśli przedmiot selektora nie ma atrybutu X, zostanie zwrócony pusty łańcuch. To, czy w nazwach atrybutów są rozróżniane małe i wielkie litery zależy od języka dokumentu.
Uwaga: w CSS 2.1 nie ma możliwości odwołania się do wartości atrybutów elementów innych niż będących przedmiotem selektora.

Za pomocą własności ‚display’ można określić czy treść ma zostać zaprezentowana w polu blokowym, czy śródliniowym.

Przykłady:

Poniższa reguła generuje łańcuch "Rozdział:" przed każdym elementem H1:

H1:before {
  content: "Rozdział: ";
  display: inline;
}

Aby w generowanej treści uzyskać przejście do nowego wiersza, można użyć sekwencji specjalnej "A" w jednym z łańcuchów własności ‚content’. Tak wstawione złamanie wiersza nadal podlega własności ‚white-space’. Aby uzyskać dodatkowe informacje na temat sekwencji specjalnej "A", zobacz "Łańcuchy" oraz "Litery i wielkość liter".

Przykłady:

h1:before {
    display: block;
    text-align: center;
    white-space: pre;
    content: "rozdziałA hoofdstukA chapitre"
}

Treść generowana nie modyfikuje drzewa dokumentu. W szczególności nie jest zwracana do procesora języka dokumentu (np. w celu przeprowadzenia ponownej analizy składniowej).

12.3 Cudzysłowy

W CSS 2.1 istnieje możliwość określenia sposobu (zależnie od stylu i kontekstu) prezentowania przez aplikacje klienckie cudzysłowów. Własność ‚quotes’ służy do określania cudzysłowów na wszystkich poziomach zagnieżdżenia. Dostęp do tych cudzysłowów można uzyskać za pomocą własności ‚content’, która umożliwia wstawienie ich przed i za cytatem.

12.3.1 Określanie cudzysłowów za pomocą własności ‚quotes’

‚quotes’
Wartość:  [<string> <string>]+ | none | inherit
Wartość domyślna:  zależy od aplikacji klienckiej
Zastosowanie:  wszystkie elementy
Dziedziczenie:  tak
Wartości procentowe:  nie dotyczy
Media:  wizualne
Wartość obliczana:  jak określono

Własność ta służy do określania cudzysłowów dla dowolnej liczby zagnieżdżonych cytatów. Opis wartości:

none
Wartości ‚open-quote’ i ‚close-quote’ własności ‚content’ nie tworzą żadnych cudzysłowów.
[<string>  <string>]+
Wartości ‚open-quote’ i ‚close-quote’ własności ‚content’ są pobierane z tej listy par cudzysłowów (otwierających i zamykających). Pierwsza (z lewej) para reprezentuje podstawowy poziom cytowania, druga para to pierwszy poziom itd. Aplikacja kliencka musi wstawiać odpowiednie cudzysłowy w zależności od poziomu zagnieżdżenia.

Przykłady:

Spójrzmy na następujący arkusz stylów:

/* Określa pary cudzysłowów dla dwóch poziomów w dwóch językach */ q:lang(en) { quotes: ‚"’ ‚"’ "’" "’" } q:lang(no) { quotes: "?" "?" ‚"’ ‚"’ } /* Wstawia cudzysłowy przed i za treścią elementu Q */ q:before { content: open-quote } q:after { content: close-quote }

Powyższy arkusz stylów dotyczy poniższego fragmentu dokumentu HTML:

<HTML lang="en">
  <HEAD>
  <TITLE>Cytaty</TITLE>
  </HEAD>
  <BODY>
    <P><Q>Zacytuj mnie!</Q>
  </BODY>
</HTML>

Wynik byłby następujący:

"Zacytuj mnie!"

Natomiast poniższy fragment dokumentu 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>

zostałby przedstawiony następująco:

?Tr?ndere gr?ter n?r "Vinsjan p? kaia" blir deklamert.?

Uwaga: podczas gdy cudzysłowy określone we własności ‚quotes’ w powyższych przykładach można znaleźć na klawiaturze komputera, do składu tekstu wysokiej jakości mogą być potrzebne inne znaki z zestawu ISO 10646. Poniższa tabela przedstawia część cudzysłowów z tego zestawu:

ZnakPrzybliżona prezentacjaKod ISO 10646 (hex)Opis
""0022QUOTATION MARK [podwójny cudzysłów z zestawu ASCII]
0027APOSTROPHE [cudzysłów pojedynczy z zestawu ASCII]
<2039SINGLE LEFT-POINTING ANGLE QUOTATION MARK
>203ASINGLE RIGHT-POINTING ANGLE QUOTATION MARK
««00ABLEFT-POINTING DOUBLE ANGLE QUOTATION MARK
»»00BBRIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
`2018LEFT SINGLE QUOTATION MARK [single high-6]
2019RIGHT SINGLE QUOTATION MARK [single high-9]
201CLEFT DOUBLE QUOTATION MARK [double high-6]
201DRIGHT DOUBLE QUOTATION MARK [double high-9]
,,201EDOUBLE LOW-9 QUOTATION MARK [double low-9]

12.3.2 Wstawianie cudzysłowów za pomocą własności ‚content’

Cudzysłowy wstawiane są w odpowiednich miejscach w dokumencie za pomocą wartości ‚open-quote’ i ‚close-quote’ własności ‚content’. Każde wystąpienie wartości ‚open-quote’ lub ‚close-quote’ jest zastępowane przez jeden łańcuch z wartości własności ‚quotes’ zgodnie z poziomem zagnieżdżenia.

Wartość ‚open-quote’ określa pierwszy znak z pary cudzysłowów, a ‚close-quote’ — drugi. To, która para cudzysłowów zostanie użyta, zależy od poziomu zagnieżdżenia cytatów: liczba wystąpień wartości ‚open-quote’ w całym dotychczas wygenerowanym tekście minus liczba wystąpień wartości ‚close-quote’. Jeśli głębokość wynosi 0, zostanie użyta pierwsza para, jeśli — 1, zostanie użyta druga para itd. Jeśli głębokość zagnieżdżenia jest większa od liczby par, zostanie użyta ostatnia para. Wartości ‚close-quote’ i ‚no-close-quote’, które powodują powstanie ujemnego poziomu zagnieżdżenia są błędne i ignorowane (w czasie prezentowania treści): poziom zagnieżdżenia pozostaje 0 i nie zostaje wygenerowany żaden cudzysłów (ale pozostała część wartości ‚content’ zostanie wstawiona).

Uwaga: głębokość zagnieżdżenia cytatu jest niezależna od zagnieżdżenia dokumentu źródłowego i struktury formatującej.

W niektórych stylach poligraficznych cudzysłów otwierający musi zostać powtórzony przed każdym akapitem cytatu obejmującego kilka akapitów, a cudzysłów zamykający powinien znajdować się tylko na końcu ostatniego akapitu. W CSS efekt taki można uzyskać przy użyciu "fikcyjnych" cudzysłowów zamykających. Słowo kluczowe ‚no-close-quote’ zmniejsza poziom zagnieżdżenia cytatu, ale nie wstawia cudzysłowu.

Przykłady:

Poniższy arkusz stylów wstawia cudzysłowy otwierające przed każdym akapitem w elemencie BLOCKQUOTE oraz wstawia jeden cudzysłów zamykający na końcu:

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

Efekt ten uzyskano dzięki przypisaniu ostatniego akapitu do klasy "last".

Dla zachowania symetrii istnieje też słowo kluczowe ‚no-open-quote’, które nic nie wstawia, ale zwiększa poziom zagnieżdżenia cudzysłowów o jeden.

12.4 Automatyczne liczniki i numerowanie

W CSS 2.1 do kontrolowania numerowania automatycznego służą dwie własności: ‚counter-increment’ i ‚counter-reset’. Liczniki zdefiniowane przez te własności są używane z funkcjami counter() i counters() własności ‚content’.

‚counter-reset’
Wartość:  [ <identifier> <integer>? ]+ | none | inherit
Wartość domyślna:  none
Zastosowanie:  wszystkie elementy
Dziedziczenie:  nie
Wartości procentowe:  nie dotyczy
Media:  wszystkie
Wartość obliczana:  jak określono
‚counter-increment’
Wartość:  [ <identifier> <integer>? ]+ | none | inherit
Wartość domyślna:  none
Zastosowanie:  wszystkie elementy
Dziedziczenie:  nie
Wartości procentowe:  nie dotyczy
Media:  wszystkie
Wartość obliczana:  jak określono

Własność ‚counter-increment’ przyjmuje jedną lub więcej nazw liczników (identyfikatorów), po każdym z których może znajdować się liczba całkowita. Liczba ta określa o ile licznik ma zostać zwiększony przy każdym wystąpieniu elementu. Domyślna wartość to 1. Dozwolone są także wartości ujemne i zero.

Własność ‚counter-reset’ również zawiera listę nazw liczników, po każdym z których może znajdować się liczba całkowita. Liczba ta określa wartość, na jaką licznik zostaje ustawiony przy każdym wystąpieniu elementu. Domyślna wartość to 0.

Jako nazw liczników nie można używać słów kluczowych ‚none’, ‚inherit’ oraz ‚initial’. Sama wartość ‚none’ oznacza, że żadne liczniki nie są resetowane (ani zwiększane). Wartość ‚inherit’ sama w sobie ma swoje typowe znaczenie (zobacz 6.2.1). Wartość ‚initial’ została zarezerwowana na przyszłość.

Przykłady:

Poniższy arkusz stylów stanowi przykład numerowania rozdziałów i podrozdziałów — "Rozdział 1", "1.1", "1.2" itd.

BODY {
    counter-reset: chapter;      /* Tworzy zakres licznika rozdziałów */
}
H1:before {
    content: "Rozdział " counter(chapter) ". ";
    counter-increment: chapter;  /* Dodaje 1 do chapter */
}
H1 {
    counter-reset: section;      /* Ustawia podrozdział na 0 */
}
H2:before {
    content: counter(chapter) "." counter(section) " ";
    counter-increment: section;
}

Jeśli element zwiększa lub zeruje licznik i jednocześnie go używa (we własności ‚content’ swoich pseudoelementów :before i :after), licznik zostaje użyty po zwiększeniu lub wyzerowaniu.

Jeśli element jednocześnie zeruje i zwiększa licznik, najpierw wykonywane jest zerowanie.

Jeśli jeden licznik zostanie określony w wartościach własności ‚counter-reset’ i ‚counter-increment’ więcej niż raz, każde jego zerowanie/zwiększanie jest wykonywane w kolejności określenia.

Przykłady:

Poniższa reguła przywróci wartość licznika podrozdziałów (‚section’) do 0:

H1 { counter-reset: section 2 section }

Poniższa reguła zwiększy wartość licznika rozdziałów (‚chapter’) do 3:

H1 { counter-increment: chapter chapter 2 }

Własność ‚counter-reset’ przestrzega zasad kaskadowości. W związku z tym, ze względu na te zasady poniższy arkusz stylów:

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

wyzeruje tylko ‚imagenum’. Aby oba liczniki zostały wyzerowane, muszą one zostać określone razem:

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

12.4.1 Liczniki zagnieżdżone i zakres

Liczniki "same się zagnieżdżają", tzn. wyzerowanie licznika w elemencie potomnym lub pseudoelemencie powoduje automatyczne utworzenie nowego egzemplarza tego licznika. Jest to ważne np. w listach HTML, gdzie elementy mogą być zagnieżdżane na dowolną głębokość. Zdefiniowanie niepowtarzalnych nazw liczników dla wszystkich poziomów byłoby niemożliwe.

Przykłady:

Poniższe reguły CSS wystarczą do ponumerowania elementów listy. Wynik jest bardzo podobny do zastosowania deklaracji ‚display:list-item’ i ‚list-style: inside’ na rzecz elementu LI:

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

Zakres licznika zaczyna się od pierwszego elementu w dokumencie, który ma własność ‚counter-reset’ dla tego licznika i obejmuje potomków tego elementu oraz znajdujących się za nim braci wraz z ich potomkami. Nie obejmuje natomiast elementów znajdujących się w zakresie licznika o tej samej nazwie utworzonego przez własność ‚counter-reset’ dalszego brata tego elementu lub dalszą własność ‚counter-reset’ tego samego elementu.

Jeśli własności ‚counter-increment’ lub ‚content’ elementu lub pseudoelementu odnoszą się do licznika nie znajdującego się w zakresie żadnej własności ‚counter-reset’, implementacje powinny zachowywać się tak, jakby licznik ten został zresetowany przez własność ‚counter-reset’ tego elementu lub pseudoelementu do 0.

W powyższym przykładzie element OL utworzy licznik, a wszystkie jego dzieci potomne będą się do niego odnosić.

Przyjmując, że item[n] oznacza nte wystąpienie licznika "item", a "{" i "}" — początek i koniec zakresu, w poniższym fragmencie dokumentu HTML zostaną użyte pokazane liczniki. (Zakładamy, że arkusz stylów jest taki sam, jak powyżej.)

<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>                   <!--                   -->

Przykłady:

Poniżej znajduje się jeszcze jeden przykład ilustrujący zakresy w sytuacji, gdy liczniki należą do elementów niezagnieżdżonych. Pokazuje on jak przedstawione wyżej reguły stylistyczne numerujące rozdziały i podrozdziały zostałyby zastosowane do kodu.

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

Funkcja ‚counters()’ generuje łańcuch składający się z wszystkich liczników o tej samej nazwie, które znajdują się w zakresie. Poszczególne wartości są oddzielone od siebie podanym łańcuchem znaków.

Przykłady:

Poniższy arkusz stylów numeruje zagnieżdżone elementy listy jako "1", "1.1", "1.1.1" itd.

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

12.4.2 Style liczników

Domyślnie liczniki są formatowane jako liczby dziesiętne, ale można to zmienić za pomocą dowolnej wartości własności ‚list-style-type’. Notacja jest następująca:

licznik(nazwa)

dla stylu domyślnego lub:

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

Dozwolone jest używanie wszystkich stylów, takich jak np. ‚disc’, ‚circle’, ‚square’ oraz ‚none’.

Przykłady:

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 Liczniki w elementach z ustawieniem własności ‚display: none’

Element, który nie jest wyświetlany (ma własność ‚display’ ustawioną na ‚none’) nie może zwiększać ani resetować liczników.

Przykłady:

W poniższym arkuszu stylów elementy H2 należące do klasy "secret" nie zwiększają licznika ‚count2′.

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

Pseudoelementy, które nie są generowane również nie mogą zwiększać ani resetować liczników.

Przykłady:

Poniższa reguła nie zwiększa licznika ‚heading':

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

Natomiast elementy, których własność ‚visibility’ jest ustawiona na ‚hidden’ zwiększają liczniki.

12.5 Listy

W CSS 2.1 można formatować podstawowe właściwości list. Element, którego własność ‚display’ jest ustawiona na ‚list-item’ generuje pole pierwotne dla treści elementu i opcjonalne pole wskazujące, że element jest elementem listy.

Własności list opisują podstawowe cechy formatowania wizualnego list: umożliwiają określenie typu punktora (obraz, glif lub liczba) oraz jego położenia względem pola pierwotnego (poza nim lub wewnątrz, przed treścią). Nie ma możliwości określenia osobnych stylów (koloru, fontu, wyrównania itp.) dla punktorów list ani dostosowania ich położenia względem pola pierwotnego. Własności te mogą zostać przejęte od pola pierwotnego.

Własności tła mają zastosowanie tylko do pola pierwotnego — pole punktora zewnętrznego jest przezroczyste.

12.5.1 Listy: własności ‚list-style-type’, ‚list-style-image’, ‚list-style-position’ oraz ‚list-style’

‚list-style-type’
Wartość:  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
Wartość domyślna:  disc
Zastosowanie:  elementy, których własność ‚display’ jest ustawiona na ‚list-item’
Dziedziczenie:  tak
Wartości procentowe:  nie dotyczy
Media:  wizualne
Wartość obliczana:  jak określono

Własność ta służy do określania wyglądu punktora elementu listy, jeśli własność ‚list-style-image’ ma wartość ‚none’ lub obraz wskazywany przez URI nie może zostać wyświetlony. Wartość ‚none’ oznacza brak punktora. Poza tym są dostępne jeszcze trzy rodzaje punktorów: glify, systemy liczbowe oraz systemy alfabetyczne.

Glify określa się za pomocą własności disc, circle oraz square. Ich wygląd zależy od aplikacji klienckiej.

Systemy liczbowe określa się za pomocą następujących wartości:

decimal
Liczby dziesiętne, zaczynając od 1.
decimal-leading-zero
Liczby dziesiętne dopełniane wiodącymi zerami (np. 01, 02, 03, …, 98, 99).
lower-roman
Małe liczby rzymskie (i, ii, iii, iv, v itd.).
upper-roman
Wielkie liczby rzymskie (I, II, III, IV, V itd.).
georgian
Tradycyjna numeracja gruzińska (an, ban, gan, …, he, tan, in, in-an, …).
armenian
Tradycyjna numeracja ormiańska.

Systemy alfabetyczne określa się za pomocą następujących wartości:

lower-latin lub lower-alpha
Małe litery z zestawu ASCII (a, b, c, … z).
upper-latin lub upper-alpha
Wielkie litery z zestawu ASCII (A, B, C, … Z).
lower-greek
Małe litery klasycznej greki: alpha, beta, gamma, … (?, ?, ?, …)

Specyfikacja ta nie definiuje co się dzieje po wyczerpaniu wszystkich liter alfabetu. Na przykład po zaprezentowaniu 26 elementów listy w systemie ‚lower-latin’ dalsze działanie jest niezdefiniowane. Dlatego zalecamy stosowanie prawdziwych liczb do numerowania elementów długich list.

Spójrzmy na poniższy przykładowy dokument HTML:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
   <HEAD>
     <TITLE>Numerowanie małymi cyframi rzymskimi</TITLE>
     <STYLE type="text/css">
          ol { list-style-type: lower-roman }
     </STYLE>
  </HEAD>
  <BODY>
    <OL>
      <LI> Pierwszy element listy.
      <LI> Drugi element listy.
      <LI> Trzeci element listy.
    </OL>
  </BODY>
</HTML>

Jego wynik mógłby wyglądać następująco:

  i Pierwszy element listy.
 ii Drugi element listy.
iii Trzeci element listy.

Wyrównanie punktora (tutaj — do prawej) zależy od aplikacji klienckiej.

‚list-style-image’
Wartość:  <uri> | none | inherit
Wartość domyślna:  none
Zastosowanie:  elementy, których własność ‚display’ jest ustawiona na ‚list-item’
Dziedziczenie:  tak
Wartości procentowe:  nie dotyczy
Media:  wizualne
Wartość obliczana:  bezwzględny identyfikator URI lub ‚none’

Własność ta służy do określenia obrazu reprezentującego punktor elementu listy. Jeśli obraz ten jest dostępny, zastępuje on punktor ustawiony przez własność ‚list-style-type’.

Rozmiar tego obrazu jest obliczany wg następujących zasad:

  1. Jeśli obraz ma wewnętrzną szerokość lub wysokość, wartość ta staje się jego używaną szerokością lub wysokością.
  2. Jeśli szerokość lub wysokość wewnętrzna obrazu jest wartością procentową, wartość ta jest obliczana w stosunku do 1 em.
  3. Jeśli obraz nie ma wewnętrznego współczynnika i nie da się go obliczyć na podstawie jego szerokości i wysokości, przyjmowany zostaje współczynnik 1:1.
  4. Jeśli obraz ma szerokość, ale nie ma wysokości, wysokość zostaje obliczona ze współczynnika wewnętrznego.
  5. Jeśli nie da się obliczyć wysokości obrazu stosując powyższe zasady, zostaje przyjęta wysokość 1 em.
  6. Jeśli obraz nie ma wewnętrznej szerokości, zostaje ona obliczona przy użyciu wydedukowanej wysokości i współczynnika wewnętrznego.

Przykłady:

Poniższa reguła ustawia jako punktor każdego elementu listy obraz "ellipse.png".

ul { list-style-image: url("http://png.com/ellipse.png") }
‚list-style-position’
Wartość:  inside | outside | inherit
Wartość domyślna:  outside
Zastosowanie:  elementy, których własność ‚display’ jest ustawiona na ‚list-item’
Dziedziczenie:  tak
Wartości procentowe:  nie dotyczy
Media:  wizualne
Wartość obliczana:  jak określono

Własność ta służy do określania położenia pola punktora względem pierwotnego pola blokowego. Opis wartości:

outside
Pole punktora znajduje się poza polem pierwotnym. Specyfikacja CSS 2.1 nie określa precyzyjnie położenia pola punktora. Wymagane jest jednak, aby w przypadku elementów listy z własnością ‚direction’ ustawioną na ‚ltr’ pole to znajdowało się po lewej stronie treści, a w przypadku elementów z własnością ‚direction’ ustawioną na ‚rtl’ — po prawej. Własność ‚overflow’ takiego elementu nie powoduje obcięcia pola punktora. Pole punktora jest pozycjonowane stale względem obramowania pola pierwotnego bloku i nie jest przewijane wraz z jego treścią. Rozmiar i zawartość pola punktora mogą zmienić wysokość pola pierwotnego bloku i/lub wysokość jego pierwszego pola liniowego. W niektórych przypadkach mogą nawet spowodować powstanie nowego pola liniowego.


Uwaga: w przyszłych wersjach CSS te interakcje mogą zostać uściślone.
inside
Pole punktora znajduje się w pierwszym polu liniowym pola pierwotnego bloku. Specyfikacja CSS 2.1 nie określa dokładnie tego położenia pola punktora.

Na przykład:

<HTML>
  <HEAD>
    <TITLE>Porównanie sposobów pozycjonowania punktora</TITLE>
    <STYLE type="text/css">
      ul         { list-style: outside }
      ul.compact { list-style: inside }
    </STYLE>
  </HEAD>
  <BODY>
    <UL>
      <LI>Pierwszy element listy jest pierwszy
      <LI>Drugi element listy jest drugi
    </UL>
    <UL class="compact">
      <LI>Pierwszy element listy jest pierwszy
      <LI>Drugi element listy jest drugi
    </UL>
  </BODY>
</HTML>

Powyższy dokument mógłby zostać sformatowany następująco:

   [O]

W tekście pisanym od prawej strony punktory znajdowałyby się po prawej stronie pola.

‚list-style’
Wartość:  [ <‚list-style-type’> || <‚list-style-position’> || <‚list-style-image’> ] | inherit
Wartość domyślna:  zobacz indywidualne własności
Zastosowanie:  elementy, których własność ‚display’ jest ustawiona na ‚list-item’
Dziedziczenie:  tak
Wartości procentowe:  nie dotyczy
Media:  wizualne
Wartość obliczana:  zobacz indywidualne własności

‚list-style’ to własność zbiorcza służąca do ustawiania trzech własności: ‚list-style-type’, ‚list-style-image’ oraz ‚list-style-position’ w jednym miejscu.

Przykłady:

ul { list-style: upper-roman inside }  /* Każdy element "ul" */
ul > li > ul { list-style: circle outside } /* Każde dziecko "ul"
                                             elementu "li" będącego dzieckiem
                                             elementu "ul" */

Mimo że własność ‚list-style’ można stosować bezpośrednio na rzecz elementów listy, (np. elementów "li" w HTML), należy to robić ostrożnie. Poniższe reguły wyglądają podobnie. Jednak pierwsza z nich deklaruje selektor potomka a druga (bardziej precyzyjna) selektor dziecka.

ol.alpha li { list-style: lower-alpha } /* Każdy potomek "li" elementu "ol" */ ol.alpha > li { list-style: lower-alpha } /* Każde dziecko "li" elementu "ol" */

Autorzy używający tylko selektora potomka mogą nie uzyskać spodziewanych wyników. Rozważmy poniższy przykład:

<HTML>
  <HEAD>
    <TITLE>UWAGA: niespodziewane wyniki spowodowane zasadami kaskadowości</TITLE>
    <STYLE type="text/css">
      ol.alpha li   { list-style: lower-alpha }
      ul li        { list-style: disc }
    </STYLE>
  </HEAD>
  <BODY>
    <OL class="alpha">
      <LI>poziom 1
      <UL>
         <LI>poziom 2
      </UL>
    </OL>
  </BODY>
</HTML>

Zamierzeniem autora było, aby elementy poziomu 1 miały oznaczenia typu ‚lower-alpha’, a elementy poziomu 2 — ‚disc’. Jednak zasady kolejności w kaskadzie spowodują, że pierwsza reguła (zawierająca specyficzne informacje o klasie) zasłoni drugą. Problem ten został rozwiązany w poniższych regułach poprzez użycie selektora dziecka:

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

Innym możliwym rozwiązaniem byłoby zastosowanie własności ‚list-style’ tylko na rzecz elementów typu listowego:

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

Zasady dziedziczenia przekażą wartości własności ‚list-style’ z elementów OL i UL na elementy LI. Jest to zalecany sposób określania własności stylu listy.

Przykłady:

Wartość typu URI można użyć w połączeniu z dowolną inną wartością:

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

W powyższym przykładzie wartość ‚disc’ zostanie użyta, gdy obraz będzie niedostępny.

Wartość ‚none’ we własności ‚list-style’ ustawia na ‚none’ własności ‚list-style-type’ i ‚list-style-image’, jeśli któraś z nich nie ma tej wartości. Jeśli obie te własności mają określone wartości, deklaracja jest błędna (i zostanie zignorowana).

Przykłady:

Na przykład wartość ‚none’ we własności ‚list-style’ ustawia na ‚none’ własności ‚list-style-type’ i ‚list-style-image’:

ul { list-style: none }

W wyniku tego nie zostanie wyświetlony żaden punktor elementu listy.

Inne artykuły poruszające podobny temat

Dwa nowe moduły CSS: układy siatkowe i treść generowana dla mediów stronicowanych

Animowane menu - ikona

Tworzenie animowanego menu za pomocą jQuery

Scout — narzędzie ułatwiające pracę z Sass i Compass w systemach Windows i Mac

Narzędzie csscss do wyszukiwania duplikatów kodu CSS

Chłopiec z gazetą oznaczający newsa

CSS Writing Modes Module Level 3 i CSS Masking

CSS Grid Layout

CSS Grid Layout

Dodaj komentarz









Newsletter

Subskrybując nasz newsletter masz pewność, że nie ominie Cię żadna nowość w serwisie!