BeautifulCode

Promocje Heliona

Bestsellery Heliona

4 Składnia i podstawowe typy danych

4.1 Składnia

W tym podrozdziale została opisana gramatyka (i reguły zgodne z przyszłymi wersjami) wspólna dla wszystkich poziomów CSS (także CSS 2.1). W przyszłych aktualizacjach CSS ta podstawowa składnia będzie zachowana, przy czym mogą zostać zastosowane dodatkowe ograniczenia syntaktyczne.

Te opisy są normatywne. Ich uzupełnienie stanowią normatywne reguły gramatyczne opisane w dodatku G.

Wyrażenia "bezpośrednio przed" i "bezpośrednio za" w tej specyfikacji oznaczają, że pomiędzy nie występują żadne spacje ani komentarze.

4.1.1 Podział na tokeny

Wszystkie poziomy CSS — 1, 2 i przyszłe — korzystają z tej samej podstawowej składni. Dzięki temu aplikacje klienckie mogą przetwarzać (chociaż nie w pełni rozumieć) arkusze stylów napisane w poziomach CSS, które nie istniały jeszcze podczas tworzenia tych aplikacji. Projektanci mogą wykorzystać ten fakt przy tworzeniu arkuszy stylów działających we wcześniejszych wersjach aplikacji jednocześnie wykorzystując możliwości najnowszych poziomów CSS.

Na poziomie leksykalnym arkusz stylów składa się z szeregu tokenów. Poniżej znajduje się lista tokenów CSS. W definicjach zostały wykorzystane wyrażenia regularne w stylu analizatora leksykalnego Lex. Kody ósemkowe pochodzą z normy ISO 10646 ([ISO10646]). Podobnie jak w analizatorze Lex, jeśli zostanie znalezionych kilka dopasowań, za token uznawane jest najdłuższe z nich.

Token Definicja

IDENT {ident}
ATKEYWORD @{ident}
STRING {string}
INVALID {invalid}
HASH #{name}
NUMBER {num}
PERCENTAGE {num}%
DIMENSION {num}{ident}
URI url\({w}{string}{w}\)
|url\({w}([!#$%&*-~]|{nonascii}|{escape})*{w}\)
UNICODE-RANGE u\+[0-9a-f?]{1,6}(-[0-9a-f]{1,6})?
CDO <!--
CDC -->
: :
; ;
{ \{
} \}
( \(
) \)
[ \[
] \]
S [ \t\r\n\f]+
COMMENT \/\*[^*]*\*+([^/*][^*]*\*+)*\/
FUNCTION {ident}\(
INCLUDES ~=
DASHMATCH |=
DELIM każdy inny znak niedopasowany przez powyższe reguły, niebędący pojedynczym ani podwójnym cudzysłowem

Definicje makr znajdujących się powyżej w nawiasach klamrowych ({}) są następujące:

Makro Definicja

ident [-]?{nmstart}{nmchar}*
name {nmchar}+
nmstart [_a-z]|{nonascii}|{escape}
nonascii[^\0-\177]
unicode \\[0-9a-f]{1,6}(\r\n|[ \n\r\t\f])?
escape {unicode}|\\[^\n\r\f0-9a-f]
nmchar [_a-z0-9-]|{nonascii}|{escape}
num [0-9]+|[0-9]*\.[0-9]+
string {string1}|{string2}
string1 \"([^\n\r\f\\"]|\\{nl}|{escape})*\"
string2 \'([^\n\r\f\\']|\\{nl}|{escape})*\'
invalid {invalid1}|{invalid2}
invalid1\"([^\n\r\f\\"]|\\{nl}|{escape})*
invalid2\'([^\n\r\f\\']|\\{nl}|{escape})*
nl \n|\r\n|\r|\f
w [ \t\r\n\f]*

Poniżej znajduje się podstawowa składnia CSS. W dalszych podrozdziałach opisano jak z niej korzystać. W dodatku G znajduje się bardziej restrykcyjna gramatyka, bliższa językowi CSS 2. Części arkuszy stylów, które mogą zostać przetworzone zgodnie z tą gramatyką, ale nie zgodnie z gramatyką w dodatku G to części, które zostaną zignorowane według zasad obsługi błędów analizy składniowej.

stylesheet  : [ CDO | CDC | S | statement ]*;
statement   : ruleset | at-rule;
at-rule     : ATKEYWORD S* any* [ block | ';' S* ];
block       : '{' S* [ any | block | ATKEYWORD S* | ';' S* ]* '}' S*;
ruleset     : selector? '{' S* declaration? [ ';' S* declaration? ]* '}' S*;
selector    : any+;
declaration : property S* ':' S* value;
property    : IDENT;
value       : [ any | block | ATKEYWORD S* ]+;
any         : [ IDENT | NUMBER | PERCENTAGE | DIMENSION | STRING
              | DELIM | URI | HASH | UNICODE-RANGE | INCLUDES
              | DASHMATCH | ':' | FUNCTION S* any* ')' 
              | '(' S* any* ')' | '[' S* any* ']' ] S*;

W gramatyce tej nie ma tokenów COMMENT (dzięki czemu jest bardziej czytelna), ale może występować dowolna ich liczba w dowolnym miejscu poza wnętrzem innych tokenów. (Należy jednak zauważyć, że komentarz umieszczony przed regułą @charset lub wewnątrz niej wyłącza tę regułę.)

Token S w powyższej gramatyce oznacza biały znak. Dozwolone są tylko następujące białe znaki: "spacja" (U+0020), "tabulator" (U+0009), "nowy wiersz" (U+000A), "powrót karetki" (U+000D) oraz "wysuw strony" (U+000C). Inne znaki podobne do spacji, jak "długa spacja" (U+2003) i "spacja ideograficzna" (U+3000) nigdy nie są zaliczane do zestawu białych znaków.

Znaczenie danych, których nie da się podzielić na tokeny lub przeanalizować pod względem składniowym jest w CSS 2.1 niezdefiniowane.

4.1.2 Słowa kluczowe

Słowa kluczowe mają postać identyfikatorów. Słowa kluczowe nie mogą występować w cudzysłowach ("..." lub '...'). Zatem

red

jest słowem kluczowym, natomiast

"red"

słowem kluczowym nie jest. (Jest to łańcuch.) Przykłady kilku innych niedozwolonych przypadków:

Niedozwolone przykłady:


width: "auto";
border: "none";
background: "red";

4.1.2.1 Rozszerzenia niestandardowe

Identyfikatory w CSS mogą zaczynać się znakiem '-' (myślnik) lub '_' (znak podkreślenia). Słowa kluczowe i nazwy własności zaczynające się od znaków -' i '_' są zarezerwowane dla rozszerzeń producentów. Rozszerzenia producentów powinny być wyłącznie w jednym z następujących formatów:

'-' + identyfikator producenta + '-' + znacząca nazwa
'_' + identyfikator producenta + '-' + znacząca nazwa

Przykłady:

Jeśli np. organizacja XYZ dodałaby własność służącą do opisywania koloru obramowania wschodniej strony ekranu, jej nazwa mogłaby być następująca: -xyz-border-east-color.

Inne znane przykłady:

-moz-box-sizing
-moz-border-radius
-wap-accesskey

Jest zagwarantowane, że w żadnej aktualnej ani przyszłej wersji CSS żadna własność ani żadne słowo kluczowe nie będzie zaczynać się od myślnika lub znaku podkreślenia. Dlatego typowe implementacje CSS mogą nie rozpoznać takich własności i zignorować zgodnie z zasadami postępowania z błędami analizy składniowej. Ponieważ jednak myślnik i znak podkreślenia występujące na początku należą do gramatyki, implementatorzy CSS 2.1 zawsze powinni mieć możliwość użycia zgodnego z CSS analizatora składni, bez względu na to czy obsługują rozszerzenia niestandardowe, czy nie.

Autorzy powinni unikać rozszerzeń niestandardowych

4.1.2.2 Uwagi historyczne

Ten podrozdział jest nienormatywny.

W chwili pisania tego tekstu znane były następujące przedrostki:

przedrostekorganizacja
-ms-, mso-Microsoft
-moz-Mozilla
-o-, -xv-Opera Software
-atsc-Advanced Television Standards Committee
-wap-The WAP Forum
-khtml-KDE
-webkit-Apple
prince-YesLogic
-ah-Antenna House
-hp-Hewlett Packard
-ro-Real Objects
-rim-Research In Motion

4.1.3 Litery i wielkość liter

Poniższe reguły obowiązują zawsze:

4.1.4 Instrukcje

Arkusz stylów na każdym poziomie CSS składa się z instrukcji (zobacz gramatykę powyżej). Wyróżnia się dwa rodzaje instrukcji: reguły '@' i zbiory reguł. Instrukcje mogą znajdować się między białymi znakami.

4.1.5 Reguły '@'

Reguły '@' zaczynają się od słowa kluczowego "at", czyli znaku '@', bezpośrednio po którym znajduje się identyfikator (na przykład '@import', '@page').

W skład reguły '@' wchodzi wszystko do najbliższego średnika (włącznie) lub wszystko do następnego bloku w zależności co wystąpi pierwsze.

Aplikacje klienckie CSS 2.1 muszą ignorować reguły '@import' znajdujące się w blokach lub za nieignorowanymi instrukcjami innymi niż reguła @charset lub @import.

Niedozwolone przykłady:

Załóżmy, że analizator składni CSS 2.1 napotyka poniższy arkusz stylów:


@import "subs.css";
h1 { color: blue }
@import "list.css";

Zgodnie z zasadami CSS 2.1, druga reguła '@import' jest niedozwolona. Analizator składni CSS 2.1 zignoruje całą tę regułę, przez co arkusz stylów będzie wyglądał następująco:


@import "subs.css";
h1 { color: blue }

Niedozwolone przykłady:

W poniższym przykładzie druga reguła '@import' jest niepoprawna, ponieważ znajduje się w bloku '@media'.


@import "subs.css";
@media print {
  @import "print-main.css";
  body { font-size: 10pt }
}
h1 { color: blue }

Aby zaimportować arkusz stylów przeznaczony tylko dla mediów 'print', należy zastosować regułę @import ze składnią mediów, np.:


@import "subs.css";
@import "print-main.css" print;
@media print {
  body { font-size: 10pt }
}
h1 { color: blue }

4.1.6 Bloki

Początek bloku wyznacza otwierający nawias klamrowy ({), a koniec — odpowiadający mu zamykający nawias klamrowy (}). Między nawiasami mogą znajdować się dowolne tokeny. Nawiasy okrągłe (( )), kwadratowe ([ ]) klamrowe ({ }) muszą występować w dopełniających się parach i mogą być zagnieżdżane. Także pojedyncze (') i podwójne (") cudzysłowy muszą występować parami. Znajdujące się między nimi znaki są przetwarzane jako łańcuchy. Definicję łańcucha można znaleźć w podrozdziale Podział na tokeny powyżej.

Niedozwolone przykłady:

Poniżej znajduje się przykładowy blok. Zamykająca klamra znajdująca się w podwójnym cudzysłowie nie odpowiada klamrze otwierającej blok, a drugi pojedynczy cudzysłów jest znakiem specjalnym, przez co nie pasuje do pierwszego pojedynczego cudzysłowu:


{ causta: "}" + ({7} * '\'') }

Powyższa reguła nie jest poprawna według zasad CSS 2.1, ale jest blokiem zgodnie z powyższą definicją.

4.1.7 Zestawy reguł, bloki deklaracji i selektory

Zestaw reguł (nazywany również "regułą") składa się z selektora i bloku deklaracji.

Początek bloku deklaracji wyznacza otwierający nawias klamrowy ({), a koniec — odpowiadający mu zamykający nawias klamrowy (}). Między klamrami musi znajdować się zero lub więcej deklaracji oddzielonych średnikami (;).

Selektor (zobacz również podrozdział o selektorach) obejmuje wszystko to, co znajduje się przed otwierającym nawiasem klamrowym ({). Selektor zawsze występuje w towarzystwie bloku deklaracji. Jeśli aplikacja kliencka nie może przetworzyć selektora (np. nie jest to poprawny selektor CSS 2.1), musi go zignorować wraz ze znajdującym się za nim blokiem deklaracji (jeśli jest).

W selektorach CSS 2.1 specjalne znaczenie mają przecinki (,). Ponieważ jednak nie wiadomo czy w przyszłych aktualizacjach CSS przecinkowi nie zostaną nadane inne znaczenia, w przypadku wystąpienia jakiegokolwiek błędu w którejś części selektora, nawet jeśli reszta tego selektora może być poprawna według zasad CSS 2.1, cała instrukcja powinna zostać zignorowana.

Niedozwolone przykłady:

Ponieważ na przykład znak "&" nie jest poprawnym tokenem w selektorach CSS 2.1, aplikacja kliencka CSS 2.1 musi zignorować cały drugi wiersz i zaniechać ustawienia koloru elementów H3 na czerwony:


h1, h2 {color: green }
h3, h4 & h5 {color: red }
h6 {color: black }

Przykłady:

Oto nieco bardziej skomplikowany przykład. Dwie pierwsze pary nawiasów klamrowych znajdują się wewnątrz łańcucha i nie wyznaczają końca selektora. Jest to poprawna reguła CSS 2.1.


p[example="public class foo\
{\
    private int x;\
\
    foo(int x) {\
        this.x = x;\
    }\
\
}"] { color: red }

4.1.8 Deklaracje i własności

Deklaracja może być pusta lub składać się z nazwy własności, dwukropka (:) i wartości. Każdy z tych elementów może być otoczony białymi znakami.

Ze względu na sposób działania selektorów, jeśli istnieje więcej niż jedna deklaracja dla danego selektora, można je wszystkie zebrać w grupę deklaracji oddzielonych średnikami (;).

Przykłady:

Poniższe reguły:


h1 { font-weight: bold }
h1 { font-size: 12px }
h1 { line-height: 14px }
h1 { font-family: Helvetica }
h1 { font-variant: normal }
h1 { font-style: normal }

są równoważne z następującymi:


h1 {
  font-weight: bold;
  font-size: 12px;
  line-height: 14px;
  font-family: Helvetica;
  font-variant: normal;
  font-style: normal
}

Nazwa własności jest identyfikatorem. W wartości może znaleźć się dowolny token. Nawiasy okrągłe ("( )"), kwadratowe ("[ ]") i klamrowe ("{ }") oraz pojedyncze (') i podwójne cudzysłowy (") muszą występować w uzupełniających się parach. Natomiast średniki nie należące do łańcuchów muszą być pisane ze znakiem specjalnym. Wszystkie wymienione rodzaje nawiasów można zagnieżdżać. Znaki znajdujące się w cudzysłowach są traktowane jako łańcuch.

Składnia wartości każdej własności jest określona osobno. Jednak zawsze wartości są zbudowane z identyfikatorów, łańcuchów, liczb, jednostek długości, procentów, identyfikatorów URI, kolorów itp.

Aplikacja kliencka musi ignorować deklaracje zawierające niepoprawną nazwę własności lub niepoprawne wartości. Każda własność CSS 2.1 ma własne warunki syntaktyczne i semantyczne dotyczące przyjmowanych wartości.

Niedozwolone przykłady:

Załóżmy, że analizator składni CSS 2.1 napotyka poniższy arkusz stylów:


h1 { color: red; font-style: 12pt }  /* Niepoprawna wartość: 12pt */
p { color: blue;  font-vendor: any;  /* Niepoprawna własność: font-vendor */
    font-variant: small-caps }
em em { font-style: normal }

Druga deklaracja w pierwszym wierszu ma niepoprawną wartość '12pt'. Druga deklaracja w drugim wierszu zawiera niezdefiniowaną własność 'font-vendor'. Analizator składni CSS 2.1 zignoruje te deklaracje, przez co arkusz stylów będzie wyglądał następująco:


h1 { color: red; }
p { color: blue;  font-variant: small-caps }
em em { font-style: normal }

4.1.9 Komentarze

Początek komentarza wyznaczają znaki "/*", a koniec — znaki "*/". Komentarze mogą znajdować się w dowolnym miejscu między tokenami i nie mają wpływu na prezentację dokumentu. Komentarzy nie można zagnieżdżać.

CSS umożliwia także stosowanie w niektórych miejscach zdefiniowanych przez gramatykę ograniczników komentarzy SGML ("<!--" i "-->"), ale nie wyznaczają one początku i końca komentarzy CSS. Zezwolono na ich używanie, aby dało się ukryć reguły stylistyczne wpisane w dokumenty HTML (w elemencie STYLE) przed aplikacjami klienckimi powstałymi przed ukazaniem się HTML 3.2. Więcej informacji na ten temat znajduje się w specyfikacji języka HTML 4 ([HTML4]).

4.2 Zasady postępowania z błędami analizy składniowej

W pewnych sytuacjach aplikacje klienckie muszą ignorować części niepoprawnych arkuszy stylów. W specyfikacji tej słowo ignorować oznacza, że aplikacja kliencka przetwarza niepoprawną część arkusza (aby odnaleźć jej początek i koniec), ale zachowuje się tak, jakby tego nie robiła. CSS 2.1 zastrzega prawo dla przyszłych aktualizacji do użycia dowolnej kombinacji własność:wartość i @-słowo kluczowe, które nie zawierają identyfikatora zaczynającego się od myślnika lub znaku podkreślenia. Implementacje muszą ignorować takie kombinacje (oprócz tych, które zostaną wprowadzone do CSS w przyszłości).

Aby w przyszłości było możliwe dodawanie nowych własności i wartości dla istniejących własności, aplikacje klienckie muszą przestrzegać poniższych zasad w następujących sytuacjach:

4.3 Wartości

4.3.1 Liczby całkowite i rzeczywiste

Niektóre typy wartościowe mogą mieć wartości całkowitoliczbowe (oznaczane <integer>) lub w postaci liczb rzeczywistych (oznaczane <number>). Liczby rzeczywiste i całkowite mogą być wyrażane wyłącznie w notacji dziesiętnej. Liczba typu <integer> (całkowita) składa się z przynajmniej jednej cyfry z przedziału od "0" do "9". Liczba typu <number> (rzeczywista) może być liczbą typu <integer> lub składać się z zera cyfr lub więcej, po których znajduje się kropka (.) i jedna cyfra lub więcej. Przed oboma typami liczb można stawiać symbole "-" i "+" określające ich znak. -0 jest równoważne z 0 i nie jest liczbą ujemną.

Należy zauważyć, że wiele własności, które przyjmują jako wartości liczby całkowite lub rzeczywiste ogranicza przedział akceptowanych wartości do określonego zakresu, często tylko do liczb dodatnich.

4.3.2 Długości

Długości odnoszą się do miar poziomych lub pionowych.

Format wartości długości (oznaczanej jako <length> w tej specyfikacji) składa się z następujących części: <number> (liczba z kropką dziesiętną lub bez), bezpośrednio po której znajduje się identyfikator jednostki (np.: px, em, itd.). Stosowanie jednostek po wartościach zerowych jest opcjonalne.

Niektóre własności pozwalają na używanie wartości ujemnych, ale to może skomplikować model formatowania. Ponadto mogą istnieć ograniczenia implementacyjne w tym zakresie. Jeśli dana wartość ujemna nie może zostać obsłużona, powinna zostać zamieniona na najbliższą obsługiwaną wartość.

Jeśli wartość ujemna zostanie ustawiona dla własności nie przyjmującej ujemnych wartości długości, deklaracja zostanie zignorowana.

Wyróżnia się dwa typy jednostek długości: względne i bezwzględne. Jednostka względna określa długość w odniesieniu do innej własności długościowej. Arkusze stylów, w których użyto jednostek względnych łatwiej dostosowują się przy przenoszeniu na różne media (np. z ekranu komputera do drukarki laserowej).

Do jednostek względnych należą:

Przykłady:


h1 { margin: 0.5em }      /* em */
h1 { margin: 1ex }        /* ex */
p  { font-size: 12px }    /* px */

Jednostka 'em' jest równa obliczonej wartości własności 'font-size' elementu, w którym została użyta. Wyjątkiem jest sytuacja, w której jednostka ta występuje w wartości własności 'font-size'. Wówczas odnosi się ona do rozmiaru pisma elementu nadrzędnego. Jednostki tej można używać do określania miar poziomych i pionowych. (W tekstach z dziedziny poligrafii jednostka ta jest czasami nazywana szerokością poczwórną [quad-width].)

Jednostka 'ex' jest zdefiniowana przez pierwszy dostępny font elementu. Nazwa 'x-height' (wysokość-x) pochodzi od faktu, że jednostka ta często jest równa wysokości małej litery "x". Jednostka ta jest jednak zdefiniowana także dla tych fontów, w których nie występuje litera "x".

Wysokość x fontu można określić na różne sposoby. Niektóre fonty zawierają wiarygodne metryki dla wysokości x. Jeśli metryki takie są niedostępne, aplikacje klienckie mogą określić wysokość na podstawie wysokości glifu małej litery. Jednym ze sposobów jest sprawdzenie jak daleko glif małej litery "o" sięga za linię bazową pisma i odjęcie tej wartości od wierzchołka ograniczającego ją pola. W przypadkach, gdy określenie wysokości x jest niemożliwe lub niepraktyczne, powinna być stosowana wartość 0.5em.

Przykłady:

Spójrzmy na poniższą regułę:


h1 { line-height: 1.2em }

Ustawia ona wysokość linii elementów "h1" na wartość o 20% większą od rozmiaru pisma tych elementów. Natomiast poniższa reguła:


h1 { font-size: 1.2em }

ustawia rozmiar pisma elementów "h1" na wartość o 20% większą od rozmiaru pisma oddziedziczonego przez te elementy.

W przypadku elementu głównego drzewa dokumentu (np. "HTML w języku HTML) jednostki 'em' i 'ex' odnoszą się do wartości początkowej własności.

Jednostki pikselowe zależą od rozdzielczości urządzenia prezentującego, najczęściej monitora komputerowego. Jeśli gęstość pikselowa urządzenia wyjściowego bardzo różni się od typowego monitora komputerowego, aplikacja kliencka powinna przeskalować wartości pikseli. Zalecane jest, aby jednostki pikselowe odnosiły się do całkowitej liczby pikseli urządzenia, co daje najlepsze przybliżenie piksela stanowiącego punkt odniesienia. Zalecane jest, aby piksel odniesienia stanowił wizualny kąt jednego piksela na urządzeniu o gęstości pikseli 96 dpi przy odległości od czytającego na wyciągnięcie ręki. Przyjmując długość ręki 70 cm, kąt ten wyniósłby około 0,0213 stopnia.

Zatem dla czytającego z odległości na wyciągnięcie ręki 1 px odpowiadałby wartości około 0,26 mm (1/96 cala). W przypadku druku w drukarce laserowej, której wydruk jest przeznaczony do czytania z mniejszej odległości (55 cm, około 21 cali), 1 px miałby rozmiar około 0,20 mm. W drukarce o rozdzielczości 300 punktów na cal (dpi) wartość ta mogłaby zostać zaokrąglona do 3 punktów (0,25 mm). W drukarce 600 dpi zaokrąglenie wyniosłoby 5 punktów.

Poniższe dwa rysunki ilustrują efekt patrzenia z różnych odległości na rozmiar piksela oraz wpływ rozdzielczości urządzenia. Na pierwszym rysunku odległość czytającego to 71 cm (28 cali), co daje piksel o rozmiarze 0,26 mm. Natomiast czytanie z odległości 3,5 m (12 stóp) wymaga piksela o rozmiarze 1,3 mm.

Wykazanie, że piksel musi stawać się coraz
większy w miarę zwiększania odległości czytającego   [O]

Na drugim rysunku obszar o wymiarach 1 x 1 piksel został pokryty jednym punktem w urządzeniu o niskiej rozdzielczości (ekranie komputerowym), podczas gdy w urządzeniu o wysokiej rozdzielczości (np. drukarce laserowej 400 dpi) ten sam obszar został pokryty 16 punktami.

Wykazanie, że w urządzeniu o wysokiej rozdzielczości
potrzeba więcej pikseli do pokrycia obszaru 1 x 1 px niż w
urządzeniu o niskiej rozdzielczości   [O]

Elementy potomne nie dziedziczą wartości względnych swoich rodziców, tylko wartości obliczone.

Przykłady:

W poniższych przykładach obliczona wartość własności 'text-indent' elementów "h1" wyniesie 36 px, a nie 45 px, jeśli element "h1" będzie dzieckiem elementu "body".


body {
  font-size: 12px;
  text-indent: 3em;  /* i.e., 36px */
}
h1 { font-size: 15px }

Bezwzględne jednostki długości są przydatne wyłącznie wówczas, gdy znane są fizyczne właściwości medium docelowego. Do jednostek bezwzględnych zaliczają się:

Przykłady:


h1 { margin: 0.5in }      /* cale  */
h2 { line-height: 3cm }   /* centymetry */
h3 { word-spacing: 4mm }  /* milimetry */
h4 { font-size: 12pt }    /* punkty */
h4 { font-size: 1pc }     /* cycero */

Jeśli aplikacja kliencka nie może obsłużyć użytej długości, musi zastosować przybliżoną rzeczywistą wartość.

4.3.3 Wartości procentowe

Format wartości procentowej (oznaczanej w tej specyfikacji jako <percentage>) jest następujący: <number> (liczba), bezpośrednio po której znajduje się znak '%'.

Wartości procentowe zawsze są zależne od jakiejś innej wartości, np. długości. Każda własność pozwalająca na stosowanie wartości procentowych definiuje również wartość, do której się one odnoszą. Może to być wartość innej własności tego samego elementu, wartość własności elementu nadrzędnego lub wartość kontekstu formatowania (np. szerokość zawierającego bloku). Jeśli wartość procentowa zostanie ustawiona dla własności elementu głównego i odnosi się do oddziedziczonej wartości jakiejś własności, wartością wynikową będzie procent pomnożony przez wartość początkową tej własności.

Przykłady:

Ponieważ elementy dzieci z reguły dziedziczą wartości obliczone swoich rodziców, w poniższym przykładzie dzieci elementu P oddziedziczą wartość 12px dla własności 'line-height', a nie wartość procentową (120%).


p { font-size: 10px }
p { line-height: 120% }  /* 120% of 'font-size' */

4.3.4 Identyfikatory URL i URI

Wartości URI (Uniform Resource Identifier — zobacz [RFC3986] — do których zaliczają się URL, URN itp.) są w tej specyfikacji oznaczane jako <uri>. Notacja funkcyjna służąca do określania identyfikatorów URI w wartościach własności to "url()", np.:

Przykłady:


body { background: url("http://www.example.com/pinkish.png") }

Format wartości URI jest następujący: 'url(' + opcjonalne białe znaki + opcjonalny pojedynczy cudzysłów (') lub podwójny cudzysłów (") + identyfikator URI + opcjonalny pojedynczy cudzysłów (') lub podwójny cudzysłów (") + opcjonalne białe znaki + ')'. Oba użyte cudzysłowy muszą być takie same.

Przykłady:

Przykład bez cudzysłowów:


li { list-style: url(http://www.example.com/redball.png) disc }

Niektóre znaki znajdujące się w identyfikatorze URI nie umieszczonym w cudzysłowach, np. nawiasy, przecinki, białe znaki, pojedyncze cudzysłowy (') i podwójne cudzysłowy ("), muszą zostać opatrzone wstecznym ukośnikiem, aby powstał token URI: '\(', '\)', '\,'.

Zależnie od typu URI, może być również możliwe napisanie wymienionych znaków jako symboli zastępczych URI (gdzie "(" = %28, ")" = %29 itd.) zgodnie z dokumentem [RFC3986].

W celu utworzenia modułowych arkuszy stylów niezależnych od bezwzględnej lokalizacji zasobu, autorzy mogą użyć względnych identyfikatorów URI. Względne identyfikatory URI (zdefiniowane w dokumencie [RFC3986]) są rozwijane w pełne identyfikatory przy użyciu identyfikatora bazowego. W rozdziale 5 dokumentu RFC 3986 znajduje się definicja normatywnego algorytmu tego procesu. Dla arkuszy stylów CSS bazowym identyfikatorem URI jest identyfikator arkusza, nie dokumentu źródłowego.

Przykłady:

Spójrzmy na poniższą regułę:


body { background: url("yellow") }

Znajduje się ona w arkuszu stylów o następującym identyfikatorze URI:

http://www.example.org/style/basic.css

Tło elementu BODY dokumentu źródłowego nałoży się na obraz opisany przez zasób o identyfikatorze URI

http://www.example.org/style/yellow

Aplikacje klienckie mogą na różne sposoby postępować z niepoprawnymi identyfikatorami URI lub identyfikatorami wskazującymi niedostępne lub nienadające się do użycia zasoby.

4.3.5 Liczniki

Liczniki są oznaczane przez identyfikatory, w których ma znaczenie wielkość liter (zobacz własności 'counter-increment' i 'counter-reset'). W celu odwołania się do wartości licznika, należy zastosować notację 'counter(<identifier>)' lub 'counter(<identifier>, <'list-style-type'>)'. Tokeny mogą być opcjonalnie oddzielone białymi znakami. Domyślny styl to 'decimal'.

W celu odwołania się do sekwencji zagnieżdżonych liczników o takiej samej nazwie, należy zastosować notację counters(<identifier>, <string>)' lub 'counters(<identifier>, <string>, <'list-style-type'>)' . Tokeny mogą być opcjonalnie oddzielone białymi znakami.

W celu dowiedzenia się, jak aplikacje klienckie muszą określać wartość lub wartości licznika, zobacz podrozdział "Liczniki zagnieżdżone i zakres" w rozdziale poświęconym treści generowanej. Sposób konwersji wartości licznikowych na łańcuchy przez własność 'content' został opisany w definicji wartości licznikowych tej własności.

W CSS 2.1 dostęp do wartości liczników można uzyskać tylko z własności 'content'. Należy zauważyć, że wartość 'none' jest jedną z możliwości dla <'list-style-type'>: 'counter(x, none)' zwraca pusty łańcuch.

Przykłady:

Poniżej znajduje się arkusz stylów numerujący akapity (p) w każdym rozdziale (h1). Numeracja ma format liczby rzymskiej z kropką i spacją:


p {counter-increment: par-num}
h1 {counter-reset: par-num}
p:before { content: counter(par-num, upper-roman) ". "}

4.3.6 Kolory

Wartość typu <color> może być słowem kluczowym lub liczbowym określeniem składowych RGB koloru.

Lista słów kluczowych kolorów: aqua, black, blue, fuchsia, gray, green, lime, maroon, navy, olive, orange, purple, red, silver, teal, white oraz yellow. Wartości liczbowe odpowiadające tym 17 kolorom są następujące:

maroon #800000red #ff0000orange #ffA500yellow #ffff00olive #808000
purple #800080 fuchsia #ff00ff white #ffffff lime #00ff00 green #008000
navy #000080 blue #0000ff aqua #00ffff teal #008080
black #000000 silver #c0c0c0 gray #808080

Dodatkowo użytkownik może określić słowa kluczowe odpowiadające kolorom używanym przez pewne obiekty w środowisku użytkownika. Więcej informacji na ten temat znajduje się w podrozdziale o kolorach systemowych.

Przykłady:


body { color: black; background: white }
h1 { color: maroon }
h2 { color: olive }

Model RGB jest stosowany do określania kolorów za pomocą wartości liczbowych. Wszystkie poniższe reguły określają ten sam kolor:

Przykłady:


em { color: #f00 }              /* #rgb */
em { color: #ff0000 }           /* #rrggbb */
em { color: rgb(255,0,0) }      
em { color: rgb(100%, 0%, 0%) } 

W notacji szesnastkowej wartość RGB jest poprzedzona znakiem '#'. Po nim może znajdować się ciąg trzech lub sześciu cyfr szesnastkowych. Trzycyfrowa notacja RGB (#rgb) jest przekształcana na formę sześciocyfrową (#rrggbb) poprzez skopiowanie poszczególnych cyfr, nie dodanie zer. Na przykład wartość #fb0 zostanie rozwinięta do postaci #ffbb00. Dzięki temu kolor biały (#ffffff) można oznaczyć krótką notacją (#fff) oraz zostaje usunięta zależność od głębi kolorów wyświetlacza.

Format wartości RGB w notacji funkcyjnej jest następujący: 'rgb(' + trzy wartości liczbowe oddzielone przecinkami (wartości całkowitoliczbowe lub procentowe) + ')'. Wartość całkowitoliczbowa 255 odpowiada wartości 100% i wartościom F lub FF w notacji szesnastkowej: rgb(255,255,255) = rgb(100%,100%,100%) = #FFF. W bezpośrednim sąsiedztwie wartości liczbowych mogą znajdować się białe znaki.

Wszystkie kolory RGB są określane w przestrzeni kolorów sRGB (zobacz [SRGB]). Różne aplikacje klienckie mogą odtwarzać kolory z różną wiernością. sRGB pozwala użyć jednoznacznej i dającej się obiektywnie zmierzyć definicji tego, jaki kolor powinien być, którą można odnieść do norm międzynarodowych (zobacz [COLORIMETRY]).

Zgodne aplikacje klienckie mogą ograniczać liczbę wyświetlanych kolorów poprzez dokonywanie korekcji gamma. sRGB określa współczynnik gamma wyświetlacza 2.2 w określonych warunkach. Aplikacje klienckie powinny tak dostosowywać kolory określone w CSS, aby w połączeniu z "naturalnym" współczynnikiem gamma urządzenia wyjściowego, był uzyskiwany efektywny współczynnik o wartości 2.2. Aby uzyskać więcej informacji, zobacz podrozdział o korekcji gamma. Należy zauważyć, że dotyczy to tylko kolorów określonych w CSS, np. obrazy powinny mieć własne informacje o kolorach.

Wartości z poza zakresu urządzenia powinny być obcinane lub odwzorowane w tym zakresie, gdy jest on znany: kolory czerwony, zielony i niebieski muszą zostać tak zmienione, aby mieściły się w zakresie obsługiwanym przez urządzenie. Aplikacje klienckie mogą wykonywać odwzorowania kolorów wyższej jakości z jednego zakresu na inny. Dla typowego monitora CRT, którego zakres kolorów pokrywa się z przestrzenią sRGB, poniższe cztery reguły są równoważne:

Przykłady:


em { color: rgb(255,0,0) }       /* Zakres całkowitoliczbowy 0 - 255 */
em { color: rgb(300,0,0) }       /* Obcięcie do rgb(255,0,0) */
em { color: rgb(255,-10,0) }     /* Obcięcie do rgb(255,0,0) */
em { color: rgb(110%, 0%, 0%) }  /* Obcięcie do rgb(100%,0%,0%) */

Inne urządzenia, takie jak drukarki, mają inne zakresy niż przestrzeń sRGB. Niektóre kolory z poza zakresu 0..255 mogą dać się przedstawić (w zakresie danego urządzenia), podczas gdy niektóre kolory z tego zakresu mogą znajdować się poza zakresem urządzenia i mogą wymagać odwzorowania.

Uwaga: odwzorowywanie lub przycinanie wartości kolorów powinno być wykonywane do rzeczywistego zakresu urządzenia, jeśli jest on znany (zakres ten może być mniejszy lub większy od 0..255).

4.3.7 Łańcuchy

Łańcuchy mogą być pisane w podwójnych lub pojedynczych cudzysłowach. Podwójne cudzysłowy mogą występować wewnątrz innych podwójnych cudzysłowów pod warunkiem, że zostaną wstawione jako sekwencja specjalna (np. '\"' lub '\22'). To samo dotyczy pojedynczych cudzysłowów (np.: "\'" lub "\27").

Przykłady:

"to jest 'łańcuch'"
"to jest \"łańcuch\""
'to jest "łańcuch"'
'to jest \'łańcuch\''

Łańcuch nie może bezpośrednio zawierać znaku nowego wiersza. Aby wstawić do łańcucha znak nowego wiersza, należy użyć znaku specjalnego zastępującego znak nowego wiersza w normie ISO-10646 (U+000A), np. "\A" lub "\00000a". Znak ten reprezentuje ogólne pojęcie "znaku nowego wiersza" w CSS. Aby zobaczyć przykład, przejdź do własności 'content'.

Łańcuch można podzielić na kilka wierszy (np. z powodów estetycznych lub innych), ale w takim przypadku należy znak nowego wiersza opatrzyć wstecznym ukośnikiem. Na przykład dwa poniższe selektory są dokładnie takie same:

Przykłady:


a[title="a not s\
o very long title"] {/*...*/}
a[title="a not so very long title"] {/*...*/}

4.3.8 Nieobsługiwane wartości

Jeśli aplikacja kliencka nie obsługuje określonej wartości, powinna ją zignorować podczas analizy składniowej arkusza stylów, tak jakby była to niedozwolona wartość. Na przykład:

Przykłady:


  h3 {
    display: inline;
    display: run-in;
  }

Aplikacja kliencka obsługująca wartość 'run-in' własności 'display' zaakceptuje pierwszą deklarację 'display', a następnie "nadpisze" ją drugą deklaracją 'display'. Aplikacja nieobsługująca wartości 'run-in' przetworzy pierwszą deklarację 'display' i zignoruje drugą.

4.4 Reprezentacja arkusza stylów CSS

Arkusz stylów CSS jest sekwencją znaków z zestawu Universal Character Set (zobacz [ISO10646]). Dla celów transmisji i przechowywania znaki te muszą zostać zakodowane w jakimś kodowaniu znaków, które obsługuje znaki z zestawu US-ASCII (np. UTF-8, ISO 8859-x, SHIFT JIS itp.). Dobry wstęp do zestawów znaków i kodowania znaków znajduje się w specyfikacji języka HTML 4 ([HTML4], rozdział 5). Zobacz również specyfikację XML 1.0 ([XML10], podrozdziały 2.2 i 4.3.3 oraz dodatek F).

Jeśli arkusz stylów jest osadzony w innym dokumencie, np. w dokumencie HTML za pomocą elementu STYLE lub atrybutu "style", używa tego samego kodowania znaków, co ten dokument.

Jeśli arkusz stylów znajduje się w osobnym pliku, aplikacje klienckie muszą stosować następujące priorytety przy określaniu kodowania znaków arkusza stylów (kolejność od najwyższego do najniższego priorytetu):

  1. Parametr HTTP "charset" w polu "Content-Type" (lub podobne parametry w innych protokołach)
  2. BOM i/lub @charset (zobacz poniżej)
  3. <link charset=""> lub inne metadane z mechanizmu dołączania
  4. zestaw znaków arkusza stylów lub dokumentu (jeśli jest)
  5. Przyjęcie UTF-8

Jeśli użyta zostaje reguła @charset, musi się ona znajdować na samym początku arkusza stylów. Nie może być przed nią żadnego znaku. (Jeśli dla użytego kodowania właściwe jest użycie znaku kolejności bajtów, może się on znajdować przed regułą @charset.)

Za regułą "@charset" podaje się nazwę kodowania znaków (w cudzysłowach). Na przykład:

@charset "ISO-8859-1";

Regułę @charset należy zapisywać dosłownie, tzn. ciąg 10 znaków '@charset "' (małe litery, bez wstecznych ukośników), po którym znajduje się nazwa kodowania oraz ciąg '";'.

Nazwa zestawu znaków musi zgadzać się z nazwami opisanymi przez organizację IANA. Aby uzyskać pełną listę zestawów znaków, zobacz [CHARSETS]. Należy używać nazw zestawów znaków, które w spisie IANA są oznaczone jako "preferowane nazwy MIME" ("preferred MIME name")

Aplikacje klienckie muszą obsługiwać przynajmniej kodowanie UTF-8.

Wszystkie reguły @charset nie znajdujące się na początku arkusza stylów muszą być ignorowane. W przypadku wykrycia kodowania znaków przy użyciu znaku BOM i/lub reguły @charset, aplikacja kliencka powinna przestrzegać następujących zasad:

Aplikacje klienckie muszą ignorować arkusze stylów o nieznanym kodowaniu.

4.4.1 Używanie znaków niedostępnych w określonym kodowaniu znaków

Może być konieczne użycie w arkuszu stylów znaków, których nie można zaprezentować przy użyciu bieżącego kodowania znaków. Znaki takie należy zapisywać jako specjalne referencje do znaków ISO 10646. Te specjalne referencje służą do tego samego celu, co numeryczne referencje do znaków w dokumentach HTML i XML (zobacz [HTML4], rozdziały 5 i 25).

Mechanizm stosowania znaków specjalnych należy stosować tylko wówczas, gdy takiej reprezentacji wymaga tylko kilka znaków. Jeśli większość znaków w arkuszu stylów musi być zapisana w ten sposób, należy zastosować bardziej odpowiednie kodowanie (jeśli np. arkusz stylów zawiera dużo znaków alfabetu greckiego, można użyć kodowania "ISO-8859-7" lub "UTF-8").

Procesory pośrednie używające innego kodowania znaków mogą przetłumaczyć te sekwencje specjalne na sekwencje bajtów tego kodowania. Procesory pośrednie nie mogą natomiast zmieniać sekwencji specjalnych anulujących specjalne znaczenie znaków ASCII.

Zgodne aplikacje klienckie muszą prawidłowo odwzorowywać na ISO-10646 wszystkie znaki z każdego kodowania znaków, które rozpoznają (lub muszą się zachowywać, jakby to robiły).

Na przykład arkusz stylów przesyłany jako ISO-8859-1 (Latin-1) nie może zawierać bezpośrednio greckich liter: "κουρος" (greckie: "kouros") musi zostać zapisane jako "\3BA\3BF\3C5\3C1\3BF\3C2".

Uwaga: w języku HTML 4 numeryczne referencje do znaków są interpretowane w wartościach atrybutu "style", ale nie w treści elementu STYLE. Ze względu na tę asymetrie zalecamy korzystanie z mechanizmu CSS zastępowania znaków zamiast używania numerycznych referencji do znaków zarówno w atrybucie "style", jak i w elemencie STYLE. Zalecamy na przykład zapis:


<SPAN style="font-family: L\FC beck">...</SPAN>

zamiast:


<SPAN style="font-family: Lübeck">...</SPAN>