9 Model formatowania wizualnego
Spis treści
- 9.1 Wprowadzenie do modelu formatowania wizualnego
- 9.2 Kontrolowanie generowania pól
- 9.3 Systemy pozycjonowania
- 9.4 Układ normalny
- 9.5 Elementy pływające
- 9.6 Pozycjonowanie bezwzględne
- 9.7 Zależności między własnościami ‚display’, ‚position’ i ‚float’
- 9.8 Porównanie normalnego układu, układu elementów pływających oraz pozycjonowania bezwzględnego
- 9.9 Prezentacja warstwowa
- 9.10 Orientacja tekstu: własności ‚direction’ i ‚unicode-bidi’
9.1 Wprowadzenie do modelu formatowania wizualnego
W tym i następnym rozdziale został opisany model formatowania wizualnego: sposób przetwarzania przez aplikacje klienckie drzewa dokumentu dla mediów wizualnych.
Zgodnie z modelem polowym w modelu formatowania wizualnego każdy element znajdujący się w drzewie dokumentu generuje zero lub więcej pól. Rozmieszczenie tych pól zależy od kilku czynników:
- rozmiar i typ pola;
- system pozycjonowania (układ normalny, pływający oraz pozycjonowanie bezwzględne);
- relacje między elementami w drzewie dokumentu;
- informacje zewnętrzne (np. rozmiar obszaru widoku, wymiary wewnętrzne obrazów itp.).
Własności zdefiniowane w tym i następnym rozdziale mają zastosowanie zarówno do mediów ciągłych jak i stronicowanych. Działanie własności marginesów w mediach stronicowanych jest inne (zobacz model stronicowania).
Model formatowania wizualnego nie określa wszystkich aspektów formatowania (np. nie definiuje algorytmu obliczania odstępu między literami). Zachowanie zgodnych aplikacji klienckich może się różnić w tych przypadkach, które nie zostały uwzględnione w niniejszej specyfikacji.
9.1.1 Obszar widoku
Aplikacje klienckie przeznaczone dla mediów ciągłych zwykle udostępniają obszar widoku (okno lub inny obszar na ekranie), przez który można uzyskać dostęp do dokumentu. Aplikacje klienckie mogą zmieniać rozmieszczenie elementów w odpowiedzi na zmianę rozmiaru obszaru widoku (zobacz pierwotny blok zawierający).
Jeśli obszar widoku jest mniejszy od kanwy, na której prezentowany jest dokument, aplikacja kliencka powinna umożliwiać jego przewijanie. W kanwie może być maksymalnie jeden obszar widoku. Natomiast liczba kanw może być większa (np. w celu zaprezentowania różnych widoków tego samego dokumentu).
9.1.2 Bloki zawierające
W CSS 2.1 położenie i rozmiar wielu pól wyznaczane są względem krawędzi prostokątnego pola o nazwie pole zawierające. Ogólnie rzecz biorąc, pola generowane są blokami zawierającymi swoich pól potomnych. Mówi się, że dane pole ustanawia kontener dla swoich potomków. Wyrażenie "blok zawierający pola" oznacza "blok zawierający, w którym znajduje się dane pole".
Położenie każdego pola jest obliczane względem jego bloku zawierającego. Jednak żadne pole nie musi zawierać się w całości w swoim kontenerze — może "się wylewać".
Sposób obliczania wymiarów bloku zawierającego został szczegółowo opisany w następnym rozdziale.
9.2 Kontrolowanie generowania pól
W poniższych podrozdziałach zostały opisane rodzaje pól, które mogą zostać wygenerowane w CSS 2.1. Typ pola częściowo wpływa na jego zachowanie w modelu formatowania wizualnego. Do określania typu pól służy własność ‚display’ (opis poniżej).
9.2.1 Elementy blokowe i pola blokowe
Elementy blokowe to te elementy w źródle dokumentu, które w formatowaniu wizualnym mają postać bloków (np. akapity). Utworzenie elementu blokowego umożliwia kilka wartości własności ‚display’: ‚Block’, ‚list-item’, ‚run-in’ (czasami — zobacz Pola typu ‚run-in’) oraz ‚table’.
Elementy blokowe (z wyjątkiem elementów typu ‚table’, których opis znajduje się w jednym z dalszych rozdziałów) generują pierwotne pole bloku zawierające tylko pola blokowe lub tylko pola śródliniowe. Pierwotne pole blokowe stanowi blok zawierający pól potomnych i treści generowanej oraz jest brane pod uwagę przy pozycjonowaniu bloków. Pierwotne pola blokowe biorą udział w kontekście formatowania blokowego.
Niektóre elementy blokowe generują dodatkowe pola poza polem pierwotnym: elementy typu ‚list-item’. Położenie tych dodatkowych pól jest ustalane względem pola pierwotnego.
9.2.1.1 Anonimowe pola blokowe
Spójrzmy na poniższy fragment dokumentu:
<DIV>
Jakiś tekst
<P>Więcej tekstu
</DIV>
Przy założeniu, że elementy DIV i P mają własność ‚display: Block’, element DIV będzie miał zarówno treść śródliniową jak i blokową. Aby ułatwić sobie zdefiniowanie formatowania, przyjmiemy, że tekst "Jakiś tekst" znajduje się w anonimowym polu blokowym.
Rysunek przedstawiający trzy pola powyższego dokumentu, z których jedno jest anonimowe
Innymi słowy, jeśli pole blokowe (jak to wygenerowane powyżej dla elementu DIV) zawiera inne pole blokowe lub pole typu ‚run-in’ (jak P w powyższym przykładzie), wymuszamy na nim, aby zawierało tylko pola blokowe i typu ‚run-in’.
Jeśli pole śródliniowe zawiera pole blokowe, pole to dzieli owe pole śródliniowe (i jego śródliniowych przodków znajdujących się w tym samym polu liniowym). Pola liniowe znajdujące się przed i za polem blokowym są umieszczane w anonimowych polach i blok ten staje się ich bratem. Jeśli taki śródliniowy blok jest pozycjonowany względnie, pozycjonowanie to ma także wpływ na pole blokowe.
Model ten zostałby zastosowany w poniższym przykładzie. Reguły CSS:
body { display: inline }
p { display: Block }
Kod dokumentu HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HEAD>
<TITLE>Anonimowy tekst przerwany przez blok</TITLE>
</HEAD>
<BODY>
To jest anonimowy tekst znajdujący się przed P.
<P>To jest zawartość elementu P.</P>
To jest anonimowy tekst znajdujący się za P.
</BODY>
Element BODY zawiera fragment (F1) anonimowego tekstu, za którym znajduje się element blokowy i kolejny (F2) anonimowy fragment tekstu. Dla dokumentu tego zostałyby utworzone następujące pola: anonimowe pole elementu BODY zawierające anonimowe pole fragmentu tekstu F1, pole blokowe elementu P oraz drugie anonimowe pole fragmentu tekstu F2.
Pola anonimowe dziedziczą własności po zawierających je nieanonimowych polach (np. we fragmencie dokumentu znajdującym się pod nagłówkiem tego podrozdziału byłoby to pole elementu DIV). Własnościom które nie są dziedziczone nadawane są wartości domyślne. Na przykład własności pisma anonimowe pole odziedziczy po elemencie DIV, ale marginesy będą miały wartość ’0′.
Własności ustawione dla elementów powodujących wygenerowanie anonimowych pól blokowych mają zastosowanie do tych pól i zawartości tych elementów. Jeśli na przykład dla elementu BODY w powyższym przykładzie zdefiniowanoby obramowanie, zostałoby ono narysowane wokół bloków F1 (otwarte na końcu linii) i F2 (otwarte na początku linii).
Niektóre aplikacje klienckie inaczej traktują obramowanie elementów śródliniowych zawierających bloki. Na przykład opakowują takie zagnieżdżone bloki w "anonimowe pola liniowe", dzięki czemu mogą rysować obramowania wokół takich pól. Ponieważ w CSS 1 i CSS 2 nie zdefiniowano zachowania w takich sytuacjach, aplikacje klienckie CSS 1 i CSS 2 mogą implementować ten alternatywny model i mimo to być zgodne z CSS 2.1 Nie dotyczy to aplikacji klienckich utworzonych po opublikowaniu tej specyfikacji.
9.2.2 Elementy śródliniowe i pola śródliniowe
Elementy śródliniowe to te elementy w źródle dokumentu, które nie tworzą nowych bloków treści. Ich zawartość jest dzielona na wiersze (np. wyróżnione fragmenty tekstu w akapicie, obrazy śródliniowe itp.). Do tworzenia elementów śródliniowych służy kilka wartości własności ‚display’: ‚inline’, ‚inline-table’, ‚inline-Block’ oraz ‚run-in’ (czasami — zobacz Pola typu ‚run-in’). Elementy śródliniowe generują pola śródliniowe.
9.2.2.1 Anonimowe pola śródliniowe
Przeanalizujemy poniższy fragment dokumentu HTML:
<p>Trochę <em>wyróżnionego</em> tekstu</p>
Element <p> w powyższym kodzie wygeneruje pole blokowe zawierające kilka pól śródliniowych. Pole śródliniowe dla tekstu wyróżnionego zostanie wygenerowane przez element śródliniowy (<em>). Natomiast pozostałe pola śródliniowe ("Jakiś" i "tekst") zostaną wygenerowane przez element blokowy (<p>). Te ostatnie nazywane są anonimowymi polami śródliniowymi, ponieważ nie jest z nimi związany żaden element śródliniowy.
Takie anonimowe pola śródliniowe dziedziczą po swoich rodzicach wszystkie własności, które są dziedziczne. Własnościom które nie są dziedziczone nadawane są wartości domyślne. W tym przykładzie anonimowe pola śródliniowe dziedziczą kolor po elemencie P, natomiast ich tło jest przezroczyste.
Białe znaki, które zostałyby scalone zgodnie z zasadami własności ‚white-space’ nie generują anonimowych pól śródliniowych.
Ponieważ z kontekstu jasno wynika o który typ anonimowego pola chodzi, w specyfikacji tej zarówno anonimowe pola śródliniowe jak i anonimowe pola blokowe są nazywane polami anonimowymi.
Przy formatowaniu tabeli pojawiają się jeszcze inne typy pól anonimowych.
9.2.3 Pola typu ‚run-in’
Pola typu ‚run-in’ zachowują się następująco:
- Jeśli pole typu ‚run-in’ zawiera pole blokowe, staje się polem blokowym.
- Jeśli za polem typu ‚run-in’ znajduje się brat blokowy (który nie jest pozycjonowany bezwzględnie i nie pływa), pole to staje się pierwszym polem śródliniowym tego pola blokowego. Blok typu ‚run-in’ nie może "wchodzić" do bloku, który zaczyna się od bloku tego samego typu lub sam jest typu ‚run-in’.
- W pozostałych przypadkach pole typu ‚run-in’ staje się polem blokowym.
Pola typu ‚run-in’ są przydatne do tworzenia nagłówków śródliniowych, np.:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
<HEAD>
<TITLE>Przykład pola typu 'run-in'</TITLE>
<STYLE type="text/css">
H3 { display: run-in }
</STYLE>
</HEAD>
<BODY>
<H3>Nagłówek liniowy.</H3>
<P>I akapit, który się za tym nagłówkiem
znajduje.
</BODY>
</HTML>
Dokument ten może zostać sformatowany następująco:
Nagłówek liniowy. i akapit który się za tym nagłówkiem znajduje.
Mimo że wizualnie został umieszczony w znajdującym się za nim polu blokowym, element typu ‚run-in’ dziedziczy własności po swoim rodzicu wg drzewa dokumentu.
Informacje na temat interakcji pól typu ‚run-in’ z treścią generowaną znajdują się w podrozdziale o treści generowanej.
9.2.4 Własność ‚display’
- ‚display’
-
Wartość: inline | Block | list-item | run-in | inline-Block | table | inline-table | table-row-group | table-header-group | table-footer-group | table-row | table-column-group | table-column | table-cell | table-caption | none | inherit Wartość domyślna: inline Zastosowanie: wszystkie elementy Dziedziczenie: nie Wartości procentowe: nie dotyczy Media: wszystkie Wartość obliczana: zobacz opis
Opis wartości:
- Block
- Powoduje wygenerowanie przez element pola blokowego.
- inline-Block
- Powoduje wygenerowanie przez element pola blokowego, które jest w układzie traktowane jako pojedynczy blok śródliniowy, podobny do elementu zastępowanego. Wnętrze bloku śródliniowego jest formatowane jako pole blokowe, natomiast sam element jest formatowany jako śródliniowy element zastępowany.
- inline
- Powoduje wygenerowanie przez element jednego lub większej liczby bloków śródliniowych.
- list-item
- Powoduje wygenerowanie przez element (np. element LI języka HTML) pierwotnego pola blokowego i śródliniowego pola elementu listy. Informacje na temat list i przykłady ich formatowania znajdują się w podrozdziale o listach.
- none
Ta wartość powoduje, że element nie zostanie umieszczony w strukturze formatującej (tzn. w mediach wizualnych element taki nie generuje żadnych bloków i nie ma wpływu na układ). Elementy potomne również nie generują żadnych pól. Element wraz z zawartością zostaje całkowicie usunięte ze struktury formatującej. Zachowania tego nie można zmienić poprzez ustawienie własności ‚display’ potomków.
Należy zauważyć, że wartość ‚none’ własności ‚display’ nie powoduje utworzenia niewidocznego pola. Zapobiega ona utworzeniu jakiegokolwiek pola. W CSS dostępne są także mechanizmy pozwalające elementom generować pola w strukturze formatującej wpływające na formatowanie, pozostając przy tym niewidoczne. Szczegółowe informacje na ten temat można znaleźć w podrozdziale o widzialności.
- run-in
- Powoduje utworzenie pola blokowego lub śródliniowego w zależności od kontekstu. Inne własności tego rodzaju pól typu ‚run-in’ są stosowane na rzecz ich ostatecznej formy (śródliniowej lub blokowej).
- table, inline-table, table-row-group, table-column, table-column-group, table-header-group, , table-row, table-cell oraz table-caption
- Wszystkie te wartości powodują, że element zachowuje się jak element tabeli (zgodnie z ograniczeniami opisanymi w rozdziale o tabelach).
Wartość obliczona odpowiada wartości określonej. Nie dotyczy to tylko elementów pozycjonowanych i pływających (zobacz Zależności między własnościami ‚display’, ‚position’ i ‚float’) oraz elementu głównego. W przypadku elementu głównego wartość obliczona zostaje zmieniona zgodnie z zasadami opisanymi w podrozdziale Zależności między własnościami ‚display’, ‚position’ i ‚float’.
Należy zauważyć, że mimo iż wartość domyślna własności ‚display’ to ‚inline’, reguły znajdujące się w domyślnym arkuszu stylów aplikacji klienckiej mogą ją zastępować. Zobacz przykładowy arkusz stylów dla języka HTML 4 w odpowiednim dodatku.
Kilka przykładów zastosowania własności ‚display’:
p { display: block }
em { display: inline }
li { display: list-item }
img { display: none } /* Nie wyświetla obrazów */
9.3 Systemy pozycjonowania
W CSS 2.1 pola można rozmieszczać według trzech systemów pozycjonowania:
- Układ normalny. W CSS 2.1 do układu normalnego zalicza się formatowanie blokowe pól blokowych, formatowanie śródliniowe pól śródliniowych, pozycjonowanie względne pól blokowych i śródliniowych oraz pozycjonowanie pól typu ‚run-in’.
- Elementy pływające. W modelu pól pływających, położenie pola najpierw zostaje określone według układu normalnego, a następnie wyjęte z niego i przesunięte maksymalnie w lewo lub w prawo. Element pływający może być opływany przez treść po wolnej stronie.
- Pozycjonowanie bezwzględne. W modelu pozycjonowania bezwzględnego pole zostaje całkowicie wyjęte z układu normalnego (nie ma wpływu na znajdujące się dalej elementy) i pozycjonowane względem bloku zawierającego.
9.3.1 Wybieranie systemu pozycjonowania: własność ‚position’
Własności CSS 2.1 ‚position’ i ‚float’ służą do określania algorytmu pozycjonowania, który ma zostać użyty do wyznaczenia położenia pola.
- ‚position’
-
Wartość: static | relative | absolute | fixed | inherit Wartość domyślna: static Zastosowanie: wszystkie elementy Dziedziczenie: nie Wartości procentowe: nie dotyczy Media: wizualne Wartość obliczana: jak określono
Opis wartości:
- static
- Pole pozostaje normalnym polem, którego położenie jest wyznaczane według układu normalnego. Własności ‚top’, ‚right’, ‚bottom’ i ‚left’ nie mają zastosowania.
- relative
- Położenie pola jest obliczane w odniesieniu do układu normalnego (jest to tzw. położenie w układzie normalnym). Następnie pole to zostaje przesunięte względem swojego normalnego położenia. Gdy pole B jest pozycjonowane względnie, położenie pola znajdującego się za nim jest obliczane w taki sposób, jakby pole B nie zostało przesunięte. Efekt zastosowania deklaracji ‚position:relative’ na rzecz elementów typu ‚table-row-group’, ‚table-header-group’, ‚table-footer-group’, ‚table-row’, ‚table-column-group’, ‚table-column’, ‚table-cell’ oraz ‚table-caption’ jest niezdefiniowany.
- absolute
- Położenie pola (i ewentualnie jego rozmiar) jest określane za pomocą własności ‚top’, ‚right’, ‚bottom’ oraz ‚left’. Własności te określają przesunięcie względem bloku zawierającego pole. Pola pozycjonowane bezwzględnie są wyjmowane z układu normalnego. Oznacza to, że nie mają one wpływu na rozmieszczenie swoich dalszych braci. Ponadto marginesy pól pozycjonowanych bezwzględnie nie są scalane z marginesami żadnych innych pól.
- fixed
Położenie pola jest wyznaczane według modelu pozycjonowania bezwzględnego, ale dodatkowo pole to zostaje przymocowane na stałe względem jakiegoś punktu. Podobnie jak w przypadku modelu pozycjonowania bezwzględnego, marginesy takiego pola nie są scalane z marginesami żadnych innych pól. W urządzeniach kieszonkowych, projekcyjnych, ekranowych, telegraficznych i telewizorach położenie pola o stałym położeniu jest ustalane względem obszaru widoku i pole takie nie porusza się podczas przewijania. W mediach drukowanych pole takie zostaje wydrukowane na każdej stronie i jego położenie jest ustalane względem pola strony, nawet jeśli strona ta jest oglądana poprzez obszar widoku (na przykład w podglądzie wydruku). Dla innych typów mediów sposób prezentacji jest niezdefiniowany. Autorzy mogą mieć różne wymagania jeśli chodzi o pozycjonowanie pól o stałym położeniu w różnych mediach. Można na przykład wymagać, aby pole pozostawało zawsze w górnej części obszaru widoku na ekranie, ale by go nie było na każdej stronie wydruku. Aby spełnić te dwa warunki, można użyć reguły @media:
@media screen { h1#first { position: fixed } } @media print { h1#first { position: static } }Aplikacje klienckie nie mogą dzielić zawartości pól o stałym położeniu na strony.
Należy zauważyć, że niewidoczna część treści może zostać przez aplikacją kliencką wydrukowana w inny sposób. Zobacz "Treść poza polem strony" w rozdziale 13.
Położenie elementu głównego może być przez aplikacje klienckie traktowane jako statyczne (‚static’).
9.3.2 Przesuwanie pól: ‚top’, ‚right’, ‚bottom’, ‚left’
Element nazywa się elementem pozycjonowanym, jeśli jego własność ‚position’ ma wartość inną niż ‚static’. Elementy pozycjonowane generują pozycjonowane pola, o których położeniu decydują cztery własności:
- ‚top’
-
Wartość: <length> | <percentage> | auto | inherit Wartość domyślna: auto Zastosowanie: elementy pozycjonowane Dziedziczenie: nie Wartości procentowe: odnoszą się do wysokości bloku zawierającego Media: wizualne Wartość obliczana: Dla ‚position:relative’: zobacz podrozdział Pozycjonowanie względne. Dla ‚position:static’: ‚auto’. Pozostałe: jeśli określona jako długość — odpowiadająca jej długość bezwzględna; jeśli określona jako wartość procentowa — określona wartość; w pozostałych przypadkach — ‚auto’.
Własność ta określa odległość krawędzi górnego marginesu pola pozycjonowanego bezwzględnie od górnej krawędzi bloku zawierającego to pole. W przypadku pól pozycjonowanych względnie przesunięcie jest ustalane względem górnych krawędzi samego pola (tzn. pole jest umieszczane w układzie normalnym, a następnie przesuwane zgodnie z wartościami tych własności).
- ‚right’
-
Wartość: <length> | <percentage> | auto | inherit Wartość domyślna: auto Zastosowanie: elementy pozycjonowane Dziedziczenie: nie Wartości procentowe: odnoszą się do szerokości bloku zawierającego Media: wizualne Wartość obliczana: Dla ‚position:relative’: zobacz podrozdział Pozycjonowanie względne. Dla ‚position:static’: ‚auto’. Pozostałe: jeśli określona jako długość — odpowiadająca jej długość bezwzględna; jeśli określona jako wartość procentowa — określona wartość; w pozostałych przypadkach — ‚auto’.
Zastosowanie tej własności jest bardzo podobne do własności ‚top’. Różnica polega na tym, że ta własność określa odległość krawędzi prawego marginesu pola od prawej krawędzi bloku zawierającego to pole. W przypadku pól pozycjonowanych względnie przesunięcie jest obliczane w odniesieniu do prawej krawędzi pozycjonowanego pola.
- ‚bottom’
-
Wartość: <length> | <percentage> | auto | inherit Wartość domyślna: auto Zastosowanie: elementy pozycjonowane Dziedziczenie: nie Wartości procentowe: odnoszą się do wysokości bloku zawierającego Media: wizualne Wartość obliczana: Dla ‚position:relative’: zobacz podrozdział Pozycjonowanie względne. Dla ‚position:static’: ‚auto’. Pozostałe: jeśli określona jako długość — odpowiadająca jej długość bezwzględna; jeśli określona jako wartość procentowa — określona wartość; w pozostałych przypadkach — ‚auto’.
Zastosowanie tej własności jest bardzo podobne do własności ‚top’. Różnica polega na tym, że ta własność określa odległość krawędzi dolnego marginesu pola od dolnej krawędzi bloku zawierającego to pole. W przypadku pól pozycjonowanych względnie przesunięcie jest obliczane w odniesieniu do dolnej krawędzi pozycjonowanego pola.
- ‚left’
-
Wartość: <length> | <percentage> | auto | inherit Wartość domyślna: auto Zastosowanie: elementy pozycjonowane Dziedziczenie: nie Wartości procentowe: odnoszą się do szerokości bloku zawierającego Media: wizualne Wartość obliczana: Dla ‚position:relative’: zobacz podrozdział Pozycjonowanie względne. Dla ‚position:static’: ‚auto’. Pozostałe: jeśli określona jako długość — odpowiadająca jej długość bezwzględna; jeśli określona jako wartość procentowa — określona wartość; w pozostałych przypadkach — ‚auto’.
Zastosowanie tej własności jest bardzo podobne do własności ‚top’. Różnica polega na tym, że ta własność określa odległość krawędzi lewego marginesu pola od lewej krawędzi bloku zawierającego to pole. W przypadku pól pozycjonowanych względnie przesunięcie jest obliczane w odniesieniu do lewej krawędzi pozycjonowanego pola.
Opis wartości tych czterech własności:
- <length>
- Przesunięcie względem krawędzi odniesienia ma wartość stałą. Dozwolone są wartości ujemne.
- <percentage>
- Wartość przesunięcia wynosi określony procent szerokości bloku zawierającego (dotyczy własności ‚left’ i ‚right’) lub wysokości bloku zawierającego (dotyczy własności ‚top’ i ‚bottom’). Dozwolone są wartości ujemne.
- auto
- W przypadku elementów niezastępowanych efekt tej wartości zależy od tego, która z powiązanych własności również ma wartość ‚auto’. Aby uzyskać szczegółowe informacje, zobacz podrozdziały o szerokości i wysokości bezwzględnie pozycjonowanych niezastępowanych elementów. W przypadku elementów zastępowanych efekt tej wartości zależy tylko od wewnętrznych wymiarów zastępowanej treści. Aby uzyskać szczegółowe informacje, zobacz podrozdziały o szerokości i wysokości bezwzględnie pozycjonowanych zastępowanych elementów.
9.4 Układ normalny
Pola znajdujące się w układzie normalnym należą do kontekstu formatowania, który może być blokowy lub śródliniowy (ale nie taki i taki jednocześnie). Pola blokowe uczestniczą w kontekście formatowania blokowego. Pola śródliniowe uczestniczą w kontekście formatowania śródliniowego.
9.4.1 Konteksty formatowania blokowego
Elementy pływające i pozycjonowane bezwzględnie, bloki śródliniowe, komórki i podpisy tabeli oraz elementy, których własność ‚overflow’ jest ustawiona na wartość inną niż ‚visible’ (z wyjątkiem sytuacji, w której wartość ta została przesłana do obszaru widoku) ustanawiają nowe konteksty formatowania blokowego.
W kontekście formatowania blokowego pola są rozmieszczane jedno pod drugim, zaczynając od góry bloku zawierającego. Odstęp pionowy między dwoma polami braćmi określają własności ‚margin’. Marginesy pionowe znajdujące się między przylegającymi polami blokowymi w kontekście formatowania blokowego zostają scalone.
W kontekście formatowania blokowego lewa zewnętrzna krawędź każdego pola styka się z lewą krawędzią bloku zawierającego (w przypadku formatowania "od prawej do lewej" stykają się krawędzie prawe). Zasada ta obowiązuje także w obecności elementów pływających (chociaż pola liniowe pól mogą zostać skrócone), jeśli pole nie ustanawia nowego kontekstu formatowania (wówczas pole samo może zostać zwężone z powodu obecności elementów pływających).
Aby uzyskać informacje na temat łamania stron w mediach stronicowanych, zobacz Dozwolone złamania stron.
9.4.2 Śródliniowy kontekst formatowania
W kontekście formatowania śródliniowego pola są rozmieszczane poziomo jeden obok drugiego, zaczynając od góry bloku zawierającego. Znajdujące się między tak rozmieszczonymi polami poziome marginesy, obramowanie i dopełnienie są respektowane. Pola mogą być wyrównane w pionie na różne sposoby: mogą zostać wyrównane według górnej lub dolnej krawędzi albo według znajdujących się w nich podstawowych linii pisma. Prostokątny obszar zawierający pola składające się na jeden wiersz (jedną linię) nazywa się polem liniowym.
O szerokości pola liniowego decydują dwa czynniki: blok zawierający i obecność lub brak elementów pływających. Wysokość pola liniowego jest określana wg zasad opisanych w podrozdziale o obliczaniu wysokości linii.
Minimalna wysokość pola liniowego zawsze odpowiada wszystkim zawartym w nim polom. Pole liniowe może także być wyższe od najwyższego znajdującego się w nim pola (jeśli np. pola zostaną tak ustawione, że ich linie podstawowe znajdują się w szeregu). Jeśli pole B jest niższe od zawierającego je pola liniowego, o wyrównaniu w pionie pola B wewnątrz tego pola liniowego decyduje własność ‚vertical-align’. Jeśli kilka pól śródliniowych nie mieści się poziomo w jednym polu liniowym, są one rozdzielane na kilka pól liniowych ułożonych jedno nad drugim. Zatem akapit jest stosem takich pól liniowych. Między polami liniowymi nie ma żadnych odstępów i nigdy one na siebie nie nachodzą.
Ogólnie rzecz biorąc, lewa krawędź pola liniowego styka się z lewą krawędzią zawierającego je bloku, a prawa krawędź — z prawą krawędzią zawierającego bloku. Między krawędzią bloku zawierającego a krawędzią pola liniowego mogą znajdować się elementy pływające. Zatem, mimo że ogólnie pola liniowe znajdujące się w tym samym śródliniowym kontekście formatowania mają taką samą szerokość (taką samą, jak blok zawierający), elementy pływające mogą zająć część miejsca i spowodować, że niektóre takie pola liniowe będą miały mniejszą szerokość. Pola liniowe znajdujące się w tym samym śródliniowym kontekście formatowania zwykle mają różne wysokości (np. jedno może zawierać wysoki obraz a inne — tylko tekst).
Jeśli suma szerokości wszystkich pól śródliniowych w linii jest mniejsza niż szerokość zawierającego je pola liniowego, ich wyrównanie poziome w tym polu jest ustalane przez własność ‚text-align’. Jeśli własność ta ma wartość ‚justify’, aplikacja kliencka może rozciągnąć spacje i słowa w polach śródliniowych (z wyjątkiem tabel śródliniowych i śródliniowych pól blokowych).
Jeśli szerokość pola śródliniowego przekracza szerokość pola liniowego, zostaje ono podzielone na kilka pól, które zostaną rozmieszczone w kilku polach liniowych. Jeśli pola śródliniowego nie da się podzielić (np. zawiera jeden znak, uniemożliwiają to językowe zasady dzielenia słów lub pole to ma np. wyłączone zawijanie), wówczas "wylewa się" ono z pola liniowego.
Gdy pole śródliniowe zostaje podzielone, marginesy, obramowanie i dopełnienie nie są stosowane w miejscu złamania (lub złamań).
Pola śródliniowe mogą również być dzielone na kilka pól w tym samym polu liniowym w przypadku dwukierunkowego przetwarzania tekstu.
Pola liniowe nie zawierające tekstu, białych znaków, które muszą zostać zachowane, elementów śródliniowych o niezerowym marginesie, dopełnieniu lub obramowaniu ani żadnej innej treści śródliniowej (jak obrazy, bloki śródliniowe czy tabele śródliniowe) oraz nie nie są zakończone znakiem nowego wiersza, są traktowane jako pola liniowe o zerowej wysokości. Pola takie muszą być ignorowana ze względu na scalanie marginesów.
Oto przykład konstrukcji pola śródliniowego. Poniższy akapit (utworzony przez element blokowy P języka HTML) zawiera anonimowy tekst zmieszany z elementami EM i STRONG:
<P>Kilka <EM>wyróżnionych słów</EM> w zdaniu
<STRONG>tym ma</STRONG> niebanalne znaczenie.</P>
Element P generuje pole blokowe zawierające pięć pól śródliniowych, z których trzy są anonimowe:
- Anonimowe: "Kilka"
- EM: "wyróżnionych słów"
- Anonimowe: "w zdaniu"
- STRONG: "tym ma"
- Anonimowe: "niebanalne znaczenie."
Aplikacja kliencka formatująca ten akapit umieści te pięć pól w polach liniowych. W tym przypadku blok zawierający dla pól liniowych ustanawia pole wygenerowane dla elementu P. Gdyby blok zawierający był wystarczająco szeroki, wszystkie pola śródliniowe zostałyby umieszczone w jednym polu liniowym:
Kilka wyróżnionych słów w zdaniu tym ma niebanalne znaczenie.
W przeciwnym przypadku pola śródliniowe zostaną podzielone i rozdzielone na kilka pól liniowych. Powyższy akapit mógłby zostać podzielony następująco:
Kilka wyróżnionych słów w zdaniu tym ma niebanalne znaczenie.albo tak:
Kilka wyróżnionych słów w zdaniu tym ma niebanalne znaczenie.
W powyższym przykładzie pole EM zostało podzielone na dwa pola EM (nazwiemy je "część 1" i "część 2"). Za częścią 1 i przed częścią 2 marginesy, obramowanie, dopełnienie i ozdobniki tekstu nie wywołują żadnego widocznego efektu.
Rozważmy poniższy przykład:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
<HEAD>
<TITLE>Przykład układu śródliniowego podzielonego na kilka linii</TITLE>
<STYLE type="text/css">
EM {
padding: 2px;
margin: 1em;
border-width: medium;
border-style: dashed;
line-height: 2.4em;
}
</STYLE>
</HEAD>
<BODY>
<P>Kilka <EM>wyróżnionych słów</EM> tu jest.</P>
</BODY>
</HTML>
W zależności od szerokości elementu P, pola mogą zostać rozdzielone następująco:
- Margines został wstawiony przed słowem "wyróżnionych" i za słowem "słów".
- Dopełnienie zostało wstawione przed, nad i pod słowem "wyróżnionych" oraz za, nad i pod słowem "słów". Przerywane obramowanie zostało wyświetlone z trzech stron w obu przypadkach.
9.4.3 Pozycjonowanie względne
Po ustaleniu położenia pola w układzie normalnym lub jako elementu pływającego, można go przesunąć względem tego miejsca. Czynność taka nazywa się pozycjonowaniem względnym. Przesunięcie pola (B1) w taki sposób nie ma wpływu na pole znajdujące się za nim (B2): Położenie pola B2 jest ustalane tak, jakby pole B1 nie zostało przesunięte i położenie pola B2 nie zostanie zmienione w wyniku przesunięcia pola B1. Oznacza to, że pozycjonowanie względne może powodować nakładanie się pól. Jeśli jednak pozycjonowanie względne spowoduje, że pole z własnością ‚overflow:auto’ lub ‚overflow:scroll’ zostanie przepełnione, aplikacja kliencka musi umożliwić użytkownikowi dostęp do tej treści (w miejscu, w które zostanie przesunięta), która, z powodu wyświetlenia pasków przewijania, może wpłynąć na układ.
Względnie pozycjonowane pole zachowuje swój normalny rozmiar układowy, włącznie ze złamaniami wiersza i przestrzenią, która została dla niego zarezerwowana. W podrozdziale o blokach zawierających objaśniono kiedy względnie pozycjonowane pole ustanawia nowy blok zawierający.
Własności ‚left’ i ‚right’ elementów pozycjonowanych względnie przesuwają je w poziomie, nie zmieniając ich rozmiaru. Własność ‚left’ przesuwa pole w prawo, a ‚right’ — w lewo. Ponieważ zastosowanie własności ‚left’ i ‚right’ nie powoduje podzielenia lub rozciągnięcia pól, wartości obliczone zawsze wynoszą: left = -right.
Jeśli zarówno własność ‚left’ jak i ‚right’ mają wartość ‚auto’ (ich wartość domyślna), wartości obliczone wynoszą ’0′ (tzn. pola pozostają w swoim pierwotnym położeniu).
Jeśli własność ‚left’ ma wartość ‚auto’, jego wartość obliczona wynosi odwrotność wartości własności ‚right’ (tzn. pole zostaje przesunięte w lewo o wartość własności ‚right’).
Jeśli własność ‚right’ ma wartość ‚auto’, jego wartość obliczona wynosi odwrotność wartości własności ‚left’.
Jeśli ani własność ‚left’, ani ‚right’ nie mają wartości ‚auto’, położenia nie da się ustalić i jedną z tych wartości należy zignorować. Jeśli własność ‚direction’ bloku zawierającego ma wartość ‚ltr’, zastosowana zostanie wartość własności ‚left’ i wartość ‚right’ wyniesie -’left’. Jeśli własność ‚direction’ bloku zawierającego ma wartość ‚rtl’, zastosowana zostanie wartość własności ‚right’, a ‚left’ zostanie zignorowana.
Przykład: Poniższe trzy reguły są równoważne:
div.a8 { position: relative; direction: ltr; left: -1em; right: auto }
div.a8 { position: relative; direction: ltr; left: auto; right: 1em }
div.a8 { position: relative; direction: ltr; left: -1em; right: 5em }
Własności ‚top’ i ‚bottom’ przesuwają względnie pozycjonowane elementy w górę i do dołu, nie zmieniając ich rozmiaru. Własność ‚top’ przesuwa pola do dołu, a własność ‚bottom’ — do góry. Ponieważ zastosowanie własności ‚top’ i ‚bottom’ nie powoduje podzielenia lub rozciągnięcia pól, wartości obliczone zawsze wynoszą: top = -bottom. Jeśli obie własności mają wartość ‚auto’, ich wartości obliczone wynoszą ’0′. Jeśli jedna z nich ma wartość ‚auto’, jej wartość wynosi odwrotność wartości drugiej. Jeśli żadna z tych własności nie ma wartości ‚auto’, zignorowana zostanie wartość własności ‚bottom’ (tzn. wartość własności ‚bottom’ wyniesie odwrotność wartości własności ‚top’).
Uwaga: Za pomocą skryptów i dynamicznego poruszania względnie pozycjonowanych elementów można uzyskać efekt animacji (zobacz także własność ‚visibility’). Mimo że pozycjonowanie względne można wykorzystać do uzyskania efektu indeksu górnego lub dolnego, wysokość linii nie jest automatycznie dostosowywana, aby uwzględnić to pozycjonowanie. Aby uzyskać więcej informacji, zobacz opis sposobu obliczania wysokości linii.
Przykłady pozycjonowania względnego znajdują się w podrozdziale Porównanie normalnego układu, układu elementów pływających oraz pozycjonowania bezwzględnego.
9.5 Elementy pływające
Pole pływające to pole dosunięte do lewej lub prawej krawędzi linii. Najciekawszą cechą pól pływających jest to, że obok nich może znajdować się jakaś treść (chyba że zostanie to zabronione za pomocą własności ‚clear’). Pola spływające do lewej krawędzi pozwalają na występowanie treści po prawej stronie, a pola spływające do prawej — po lewej stronie. Poniższy tekst stanowi wprowadzenie do pozycjonowania elementów pływających i kontrolowania układu treści. Szczegółowe zasady zachowywania się elementów pływających zostały przedstawione w opisie własności ‚float’.
Pole pływające przesuwa się w lewo lub prawo aż jego zewnętrzna krawędź dotknie krawędzi bloku zawierającego lub krawędzi zewnętrznej innego pola pływającego. Jeśli jest pole liniowe, górna krawędź pola pływającego zostanie wyrównana z górną krawędzią bieżącego pola liniowego.
Jeśli pole pływające jest za szerokie, zostaje przeniesione w dół aż będzie wystarczająco dla niego miejsca lub nie będzie żadnych innych pól pływających.
Ponieważ elementy pływające nie należą do układu, niepozycjonowane pola blokowe utworzone przed i za nimi są rozmieszczane w pionie tak, jakby tych elementów pływających nie było. Jednak pola liniowe utworzone obok elementów pływających zostają skrócone, aby zrobić miejsce dla pola marginesu elementu pływającego. Jeśli skrócone pole liniowe jest za małe, aby cokolwiek jeszcze w nim zmieścić, zostaje przesunięte w dół aż będzie wystarczająco dużo miejsca lub nie będzie żadnych elementów pływających. Treść znajdująca się w bieżącej linii przed polem pływającym zostaje przeniesiona do pierwszej dostępnej linii po drugiej stronie tego pola pływającego. Innymi słowy, jeśli w polu liniowym przed napotkaniem mieszczącego się w nim pola spływającego do lewej zostaną umieszczone pola śródliniowe, to pole pływające zostanie umieszczone w tej linii i wyrównane z górną krawędzią tego pola liniowego. Następnie pola śródliniowe, które się już tam znajdowały zostaną przesunięte odpowiednio na prawą stronę pola pływającego (drugą stroną pola spływającego do lewej jest — prawa) i odwrotnie w przypadku kierunku ‚rtl’ i bloków spływających do prawej.
Pole obramowania tabeli, blokowe elementy zastępowane oraz elementy znajdujące się w układzie normalnym ustanawiające nowe konteksty formatowania blokowego (np. elementy z własnością ‚overflow’ o wartości innej niż ‚visible’) nie mogą nakładać się na elementy pływające znajdujące się w tym samym kontekście formatowania blokowego, co one. W razie potrzeby implementacje powinny takie elementy umieszczając pod znajdującymi się przed nimi elementami pływającymi. Jeśli jest wystarczająco dużo miejsca, mogą je umieszczać obok. Mogą nawet pole obramowania tych elementów zwężać bardziej niż wynika z definicji w podrozdziale 10.3.3. Specyfikacja CSS 2 nie określa kiedy aplikacja kliencka może umieścić dany element obok elementu pływającego ani o ile taki element może zostać zwężony.
Przykład: W poniższym fragmencie dokumentu blok zawierający jest za wąski, aby pomieścić treść znajdującą się obok elementu pływającego. Dlatego treść ta zostanie przesunięta pod elementy pływające, gdzie zostanie wyrównana w polu liniowym zgodnie z własnością ‚text-align’.
p { width: 10em; border: solid aqua; } span { float: left; width: 5em; height: 5em; border: solid blue; }...<p> <span> </span> Supercalifragilisticexpialidocious </p>
Ten fragment może wyglądać następująco:
Elementy pływające mogą do siebie wzajemnie przylegać. Dotyczy to także przylegających elementów pływających w tej samej linii.
Poniższa reguła zamienia wszystkie elementy IMG z atrybutem class="icon" w elementy spływające do lewej (i ustawia lewy margines na ’0′):
img.icon {
float: left;
margin-left: 0;
}
Spójrz na poniższy dokument HTML i znajdujący się w nim arkusz stylów:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
<HEAD>
<TITLE>Przykład elementu pływającego</TITLE>
<STYLE type="text/css">
IMG { float: left }
BODY, P, IMG { margin: 2em }
</STYLE>
</HEAD>
<BODY>
<P><IMG src=img.png alt="Ten obraz ilustruje pływanie elementów">
Przykładowy tekst, którego jedynym...
</BODY>
</HTML>
Pole IMG spływa w lewo. Znajdująca się za nim treść zostaje umieszczona po jego prawej stronie i zaczyna się w tej samej linii, co pole. Pola liniowe znajdujące się po prawej stronie pola pływającego zostały skrócone, aby zrobić dla niego miejsce. Za polem pływającym ich szerokość (równa szerokości bloku zawierającego ustanowionego przez element P) wraca do "normy". Dokument ten może zostać sformatowany następująco:
Formatowanie wyglądałoby dokładnie tak samo, nawet gdyby źródło dokumentu byłoby takie:
<BODY>
<P>Przykładowy tekst
<IMG src=img.png alt="Ten obraz ilustruje pływanie elementów">
którego jedynym...
</BODY>
Treść znajdująca się po lewej stronie pola pływającego zostanie przeniesiona na prawą stronę tego elementu.
Jak napisano w podrozdziale 8.3.1, marginesy pól pływających nigdy nie są scalane z marginesami pól do nich przylegających. Dzięki temu w powyższym przykładzie marginesy pionowe pola P i pływającego pola IMG nie zostały scalone.
Zawartość elementu pływającego jest ustawiana w stos, jakby element ten generował nowy kontekst rozmieszczenia stosowego. Różnica polega na tym, że wszelkie elementy pozycjonowane i elementy, które rzeczywiście tworzą nowy kontekst rozmieszczenia stosowego biorą udział w kontekście stosowym rodzica tego elementu pływającego. Pole pływające może nachodzić na inne pola, znajdujące się w układzie normalnym (gdy np. pole z układu normalnego znajdujące się obok pola pływającego ma ustawione ujemne marginesy). W takich przypadkach pola pływające są prezentowane nad niepozycjonowanymi blokami należącymi do układu, ale pod polami śródliniowymi należącymi do układu.
Poniżej znajduje się jeszcze jedna ilustracja przedstawiająca co się dzieje, gdy pole pływające nachodzi na obramowanie elementów znajdujących się w układzie normalnym.
Obraz pływający zasłania obramowanie pól blokowych, na które nachodzi.
Poniższy przekład ilustruje zastosowanie własności ‚clear’ do uniemożliwienia oblewania elementu pływającego inną treścią.
Jeśli zostanie zastosowana następująca reguła CSS:
p { clear: left }
formatowanie może wyglądać następująco:
9.5.1 Pozycjonowanie elementów pływających: własność ‚float’
Własność ta służy do określania czy element ma spływać w lewo, prawej, czy w ogóle ma nie pływać. Można ją stosować na rzecz wszystkich elementów, ale działa tylko na te, które nie generują pól pozycjonowanych bezwzględnie. Opis wartości:
- left
- Element generuje pole blokowe spływające w lewo. Treść oblewa taki element z prawej strony jego pola, zaczynając od góry (zależy to od ustawień własności ‚clear’).
- right
- Podobne działanie do wartości ‚left’. Różnica polega na tym, że pole spływa w prawo, a treść oblewa je po lewej stronie, zaczynając od góry.
- none
- Pole nie spływa w żadną stronę.
Aplikacje klienckie mogą przyjmować, że własność ‚float’ elementu głównego ma wartość ‚none’.
Szczegółowe zasady zachowywania się elementów pływających:
- Lewa zewnętrzna krawędź pola spływającego w lewo nie może znajdować się po lewej stronie lewej krawędzi bloku zawierającego. Analogiczna zasada dotyczy elementów spływających w prawo.
- Jeśli dane pole spływa w lewo, a przed nim w kodzie źródłowym istnieją inne elementy generujące pola spływające w lewo, to lewa zewnętrzna krawędź tego pola musi znajdować się po prawej stronie prawej zewnętrznej krawędzi wcześniejszego bloku lub jego górna krawędź musi znajdować się poniżej dolnej krawędzi wcześniejszego bloku. Analogiczne zasady dotyczą elementów spływających w prawo.
- Prawa krawędź zewnętrzna pola spływającego w lewo nie może znajdować się po prawej stronie lewej krawędzi zewnętrznej pola spływającego w prawo, które znajduje się po jego prawej stronie. Analogiczne zasady dotyczą elementów spływających w prawo.
- Zewnętrzna krawędź górna pola pływającego nie może znajdować się wyżej niż krawędź górna bloku zawierającego. Jeśli element pływający znajduje się między dwoma scalanymi marginesami, jest pozycjonowany tak, jakby miał anonimowego blokowego rodzica (poza tym pustego) uczestniczącego w układzie elementów. Położenie tego rodzica jest wyznaczane zgodnie z zasadami opisanymi w podrozdziale o scalaniu marginesów.
- Krawędź górna zewnętrzna pola pływającego nie może znajdować się nad krawędzią górną zewnętrzną żadnego pola blokowego ani pływającego znajdującego się wyżej w źródle dokumentu.
- Krawędź górna zewnętrzna pola pływającego elementu nie może znajdować się nad krawędzią górną pola liniowego zawierającego pole wygenerowane przez element znajdujący się wyżej w źródle dokumentu.
- Prawa krawędź zewnętrzna pola spływającego w lewo, obok którego po lewej stronie znajduje się inne pole spływające w lewo nie może znajdować się po prawej stronie prawej krawędzi bloku zawierającego. Innymi słowy, pole spływające w lewo nie może wystawać poza prawą krawędź, jeśli nie jest przesunięte maksymalnie w lewo. Analogiczna zasada dotyczy elementów spływających w prawo.
- Pole pływające musi zostać umieszczone tak wysoko, jak to możliwe.
- Pole spływające w lewo musi być przesunięte maksymalnie w lewo, a pole spływające w prawo — w prawo. W przypadku, gdy pole można przesunąć dalej w lewo lub wyżej, preferowana jest pozycja wyższa.
Odwołania do innych elementów w tych zasadach dotyczą tylko elementów znajdujących się w tym samym kontekście formatowania blokowego, co element pływający.
Element b w tym fragmencie dokumentu HTML spływa w prawo:
<P>a<SPAN style="float: right">b</SPAN></P>
Jeśli element P będzie wystarczająco szeroki, elementy a i b zostaną ustawione obok siebie. Może to wyglądać następująco:
9.5.2 Kontrolowanie układu obok elementów pływających: własność ‚clear’
Własność ta służy do określania które strony pola elementu nie mogą przylegać do znajdującego się wyżej w kodzie pola pływającego. Własność ‚clear’ nie dotyczy elementów pływających znajdujących się wewnątrz samego takiego pola lub w innych kontekstach formatowania blokowego.
W przypadku pól typu ‚run-in’ własność ta odnosi się do ostatecznego pola blokowego, do którego pole ‚run-in’ należy.
Odstęp izolujący to przestrzeń znajdująca się nad górnym marginesem elementu. Jego celem jest zepchnięcie elementu pionowo (zwykle w dół) poza element pływający.
Opis wartości dla niepływających pól blokowych:
- left
- Odstęp izolujący wygenerowanego pola jest ustawiany na wartość pozwalającą umieścić jego górną krawędź pod dolną krawędzią zewnętrzną wszystkich pól spływających w lewo znajdujących się wyżej w kodzie źródłowym dokumentu.
- right
- Odstęp izolujący wygenerowanego pola jest ustawiany na wartość pozwalającą umieścić jego górną krawędź pod dolną krawędzią zewnętrzną wszystkich pól spływających w prawo znajdujących się wyżej w kodzie źródłowym dokumentu.
- both
- Odstęp izolujący wygenerowanego pola jest ustawiany na wartość pozwalającą umieścić jego górną krawędź pod dolną krawędzią zewnętrzną wszystkich pól spływających w prawo i w lewo znajdujących się wyżej w kodzie źródłowym dokumentu.
- none
- Brak ograniczeń dotyczących położenia pola względem elementów pływających.
Rozmiar odstępu izolującego element jest ustalany poprzez określenie najpierw hipotetycznego położenia jego górnej krawędzi w bloku rodzicu. Położenie to jest określane po scaleniu marginesu górnego tego elementu z marginesami przylegającymi (włącznie z marginesem górnym elementu rodzica).
Jeśli to hipotetyczne położenie krawędzi górnej elementu nie wypadnie poza odpowiednimi elementami pływającymi, wówczas jego odstęp izolujący musi zostać ustawiony na większą z poniższych wartości:
- Wartość konieczna do umieszczenia krawędzi obramowania bloku na równi z krawędzią dolną zewnętrzną najniżej położonego elementu pływającego, od którego element ma zostać odizolowany.
- Wartość konieczna do wyrównania sumy poniższych wartości z odległością wytworzoną przez scalenie marginesów po obliczeniu hipotetycznego położenia:
- marginesy scalone ponad odstępem izolującym;
- sam odstęp izolujący;
- jeśli marginesy własne bloku scalają się ze sobą: górny margines tego bloku;
- jeśli marginesy własne bloku nie scalają się ze sobą: marginesy scalane pod odstępem izolującym;
Uwaga: odstęp izolujący może być ujemny.
W przedstawionej poniżej sytuacji odstęp izolujący ma wartość -1 em (założono, że żaden z elementów nie ma obramowania ani dopełnienia):
<p style="margin-bottom: 4em"> Pierwszy akapit. <p style="float: left; height: 2em; margin: 0"> Pływający akapit. <p style="clear: left; margin-top: 3em"> Ostatni akapit.
Objaśnienie: Gdyby nie zastosowano własności ‚clear’, marginesy pierwszego i ostatniego akapitu uległyby scaleniu, przez co górna krawędź zewnętrzna ostatniego akapitu zostałaby wyrównana z górną krawędzią akapitu pływającego. Jednak własność ‚clear’ wymaga, aby górna krawędź obramowania znajdowała się pod elementem pływającym, tzn. była o 2 em niżej. Oznacza to, że marginesy nie mogą zostać scalone i odstęp izolujący musi zostać dodany tak, aby odstęp izolujący + margines górny = 2 em, tzn. odstęp izolujący = 2 em - margines górny = 2 em - 3 em = -1 em.
Jeśli własność ta jest ustawiona dla elementu pływającego, powoduje zmodyfikowanie zasad pozycjonowania tego elementu. Zostaje dodane jeszcze jedno (dziesiąte) ograniczenie:
- Górna krawędź zewnętrzna elementu pływającego musi znajdować się pod dolną krawędzią zewnętrzną wszystkich wcześniejszych pól spływających w lewo (w przypadku własności ‚clear’ ustawionej na ‚left’) lub wszystkich elementów spływających w prawo (w przypadku własności ‚clear’ ustawionej na ‚right’) lub jednych i drugich (‚clear: both’).
Uwaga: Własność ta w CSS 1 miała zastosowanie do wszystkich elementów. Dlatego niektóre implementacje mogą obsługiwać ją w stosunku do wszystkich elementów. W CSS 2 i CSS 2.1 własność ‚clear’ ma zastosowanie tylko do elementów blokowych. Z tego powodu należy ją stosować wyłącznie wobec elementów blokowych. Jeśli dana implementacja nie obsługuje własności ‚clear’ dla elementów śródliniowych, zamiast ustawiać odstęp izolujący według powyższego opisu powinna wymuszać złamanie i w efekcie wstawić jedno lub więcej pól liniowych (lub przesunąć nowe pole liniowe w dół, tak jak opisano w podrozdziale 9.5). Miałoby to na celu zepchnięcie górnej krawędzi spychanego pola liniowego elementu śródliniowego pod odpowiednie pola pływające.
9.6 Pozycjonowanie bezwzględne
Model pozycjonowania bezwzględnego polega na ustalaniu położenia pola względem jego bloku zawierającego. Pole takie zostaje całkowicie wyjęte z układu normalnego (nie ma wpływu na dalsze pola). Pole pozycjonowane bezwzględnie ustanawia nowy blok zawierający dla swoich dzieci należących do układu normalnego i bezwzględnie (ale nie stale) pozycjonowanych potomków. Zawartość elementu pozycjonowanego bezwzględnie nie może otaczać żadnych innych pól. Może ona zasłaniać zawartość innych bloków (lub sama zostać zasłonięta). Zależy to od numeru na stosie nachodzących na siebie pól.
Odwołania w tej specyfikacji do elementu pozycjonowanego bezwzględnie (lub jego pola) implikują, że własność ‚position’ tego elementu ma wartość ‚absolute’ lub ‚fixed’.
9.6.1 Pozycjonowanie stałe
Pozycjonowanie stałe jest podkategorią pozycjonowania bezwzględnego. Jedyna różnica między nimi polega na tym, że dla pozycjonowania stałego blok zawierający jest ustanawiany przez obszar widoku. W mediach ciągłych pola pozycjonowane stale nie poruszają się przy przewijaniu dokumentu. Pod tym względem są podobne do stałych obrazów tła. W mediach stronicowanych pola pozycjonowane stale są prezentowane na każdej stronie. Dzięki temu można na przykład u dołu każdej strony umieścić podpis. Pola pozycjonowane stale, które są większe od obszaru strony są obcinane. Części pola pozycjonowanego stale, których nie widać we wstępnym bloku zawierającym nie są drukowane.
Za pomocą elementów pozycjonowanych stale można tworzyć prezentacje ramowe. Rozważmy poniższy układ ramowy:
Taki efekt można uzyskać za pomocą poniższego kodu HTML i CSS:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
<HEAD>
<TITLE>Dokument ramowy w CSS 2.1</TITLE>
<STYLE type="text/css" media="screen">
BODY { height: 8.5in } /* Wymagane dla dalszych wartości procentowych */
#header {
position: fixed;
width: 100%;
height: 15%;
top: 0;
right: 0;
bottom: auto;
left: 0;
}
#sidebar {
position: fixed;
width: 10em;
height: auto;
top: 15%;
right: auto;
bottom: 100px;
left: 0;
}
#main {
position: fixed;
width: auto;
height: auto;
top: 15%;
right: 0;
bottom: 100px;
left: 10em;
}
#footer {
position: fixed;
width: 100%;
height: 100px;
top: auto;
right: 0;
bottom: 0;
left: 0;
}
</STYLE>
</HEAD>
<BODY>
<DIV id="header"> ... </DIV>
<DIV id="sidebar"> ... </DIV>
<DIV id="main"> ... </DIV>
<DIV id="footer"> ... </DIV>
</BODY>
</HTML>
9.7 Zależności między własnościami ‚display’, ‚position’ i ‚float’
Trzy własności wpływające na generowanie pól i układ — ‚display’, ‚position’ oraz ‚float’ — współpracują w następujący sposób:
- Jeśli własność ‚display’ ma wartość ‚none’, własności ‚position’ i ‚float’ nie działają. W takim przypadku element nie generuje pola.
- Jeśli własność ‚position’ ma wartość ‚absolute’ lub ‚fixed’, pole jest pozycjonowane bezwzględnie, wartość obliczona własności ‚float’ wynosi ‚none’, a sposób wyświetlania zostaje ustawiony zgodnie z poniższą tabelą. Położenie pola zostanie określone przez własności ‚top’, ‚right’, ‚bottom’ oraz ‚left’ i blok zawierający pozycjonowane pole.
- Jeśli własność ‚float’ ma wartość inną niż ‚none’, pole jest pływające a własność ‚display’ jest ustawiana zgodnie z poniższą tabelą.
- Jeśli jest to element główny, wartość własności ‚display’ jest ustawiana zgodnie z poniższą tabelą.
- W pozostałych przypadkach są stosowane takie wartości własności ‚display’, jakie określono.
| Wartość określona | Wartość obliczona |
|---|---|
| inline-table | table |
| inline, run-in, table-row-group, table-column, table-column-group, table-header-group, table-footer-group, table-row, table-cell, table-caption, inline-Block | Block |
| inne | jak określono |
9.8 Porównanie normalnego układu, układu elementów pływających oraz pozycjonowania bezwzględnego
Różnice między układem normalnym, pozycjonowaniem względnym, pozycjonowaniem elementów pływających oraz pozycjonowaniem bezwzględnym zostaną zilustrowane serią przykładów opartych na poniższym dokumencie HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
<HEAD>
<TITLE>Porównanie systemów pozycjonowania</TITLE>
</HEAD>
<BODY>
<P>Początek treści dokumentu.
<SPAN id="outer"> Początek treści zewnętrznej.
<SPAN id="inner"> Treść wewnętrzna.</SPAN>
Koniec treści zewnętrznej.</SPAN>
Koniec treści dokumentu.
</P>
</BODY>
</HTML>
W dokumencie tym zastosowane zostały następujące reguły CSS:
body { display: block; font-size:12px; line-height: 200%;
width: 400px; height: 400px }
p { display: block }
span { display: inline }
Ostateczne położenie pól wygenerowanych przez elementy outer i inner będzie w każdym przykładzie inne. Liczby znajdujące się po lewej stronie każdej ilustracji określają położenie linii w układzie normalnym (dla przejrzystości zastosowano podwójny odstęp między liniami).
Uwaga: Rysunki w tym podrozdziale są ilustracjami i nie należy zmieniać ich rozmiaru. Ich celem jest ukazanie różnic między różnymi systemami pozycjonowania CSS 2.1. Nie należy ich traktować jako wzoru prezentowania przedstawionych przykładów.
9.8.1 Układ normalny
Dane są następujące deklaracje CSS dla elementów outer i inner, które nie wpływają na układ normalny pól:
#outer { color: red }
#inner { color: blue }
Element P zawiera samą treść śródliniową: Anonimowy tekst śródliniowy i dwa elementy SPAN. Oznacza to, że cała treść zostanie rozmieszczona w kontekście formatowania śródliniowego w bloku zawierającym ustanowionym przez element P. Efekt będzie następujący:
9.8.2 Pozycjonowanie względne
Efekt pozycjonowania względnego zilustrujemy przy użyciu następujących reguł:
#outer { position: relative; top: -12px; color: red }
#inner { position: relative; top: 12px; color: blue }
Tekst układa się normalnie do elementu outer. Tekst elementu outer jest następnie ustawiany w swoim miejscu w układzie normalnym w swoich normalnych wymiarach na końcu linii 1. Następnie pola śródliniowe zawierające ten tekst (podzielony na trzy wiersze) zostają przesunięte jako jedno o ‚-12px’ (do góry).
Treść elementu inner, będącego dzieckiem elementu outer, normalnie znalazłaby się bezpośrednio za słowami "of outer contents" (wiersz 1.5). Jednakże treść elementu inner została przesunięta względem elementu outer o ’12px’ (w dół), z powrotem do oryginalnego położenia w linii 2.
Należy zauważyć, że pozycjonowanie względne elementu outer nie ma wpływu na treść znajdującą się za tym elementem.
Należy również zauważyć, że gdyby element outer był przesunięty o ‚-24px’, jego tekst i treść dokumentu nałożyłyby się na siebie.
9.8.3 Pola pływające
Teraz przeanalizujemy wpływ spłynięcia tekstu elementu inner w prawo dzięki poniższym regułom:
#outer { color: red }
#inner { float: right; width: 130px; color: blue }
Tekst jest układany normalnie do pola elementu inner, które zostało wyjęte z układu normalnego i spływa w kierunku prawego marginesu (jego własność ‚width’ została określona bezpośrednio). Pola liniowe znajdujące się na lewo od tego pola pływającego zostały skrócone i został w nich umieszczony pozostały tekst dokumentu.
Aby pokazać efekt działania własności ‚clear’, dodamy element brata:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
<HEAD>
<TITLE>Porównanie systemów pozycjonowania II</TITLE>
</HEAD>
<BODY>
<P>Początek treści dokumentu.
<SPAN id=outer> Początek treści zewnętrznej.
<SPAN id=inner> Treść wewnętrzna.</SPAN>
<SPAN id=inner> Treść wewnętrzna.</SPAN>
Koniec treści zewnętrznej.</SPAN>
Koniec treści dokumentu.
</P>
</BODY>
</HTML>
Zastosujemy następujące reguły:
#inner { float: right; width: 130px; color: blue }
#sibling { color: red }
Dzięki nim pole elementu inner spływa w prawo jak poprzednio, a pozostały tekst dokumentu wpływa w pozostałe wolne miejsce:
Natomiast, gdyby własność ‚clear’ elementu sibling została ustawiona na ‚right’ (tzn. wygenerowane pole sibling nie mogłoby mieć elementu pływającego po swojej prawej stronie), treść tego pola zaczynałaby się pod elementem pływającym:
#inner { float: right; width: 130px; color: blue }
#sibling { clear: right; color: red }
9.8.4 Pozycjonowanie bezwzględne
Na koniec przedstawimy przykład pozycjonowania bezwzględnego. Dane są następujące reguły CSS dla elementów outer i inner:
#outer {
position: absolute;
top: 200px; left: 200px;
width: 200px;
color: red;
}
#inner { color: blue }
W wyniku ich działania górna krawędź pola elementu outer będzie pozycjonowana względem bloku zawierającego. Blok zawierający pola pozycjonowanego stanowi najbliższy mu pozycjonowany przodek (lub, jeśli żaden taki przodek nie istnieje, pierwotny blok zawierający — jak w naszym przykładzie). Górna krawędź pola elementu outer znajduje się w odległości ’200px’ pod krawędzią górną bloku zawierającego, a jego lewa krawędź — w odległości ’200px’ od lewej krawędzi bloku zawierającego. Położenie dziecka pola outer zostaje ustalone według normalnego układu względem rodzica.
Poniższy przykład przedstawia bezwzględnie pozycjonowane pole będące dzieckiem pola pozycjonowanego względnie. Mimo że będący rodzicem element outer nie jest przesunięty, ustawienie jego własności ‚position’ na wartość ‚relative’ oznacza, że jego pole może służyć jako blok zawierający dla pozycjonowanych potomków. Ponieważ pole outer jest polem śródliniowym podzielonym na kilka linii, za odniesienie dla własności ‚top’ i ‚left’ służą górna i lewa krawędź pierwszego z tych pól liniowych (oznaczonego grubą przerywaną linią na rysunku).
#outer {
position: relative;
color: red
}
#inner {
position: absolute;
top: 200px; left: -100px;
height: 130px; width: 130px;
color: blue;
}
Wynik wygląda mniej więcej tak:
Jeśli pole outer nie będzie pozycjonowane:
#outer { color: red }
#inner {
position: absolute;
top: 200px; left: -100px;
height: 130px; width: 130px;
color: blue;
}
blok zawierający pola inner stanie się pierwotnym blokiem zawierającym (w naszym przykładzie). Poniższy rysunek ilustruje, gdzie w takim przypadku znalazłoby się pole inner.
Pozycjonowanie względne i bezwzględne można wykorzystać do zaimplementowania symbolu modyfikacji, jak w poniższym przykładzie. Efekt poniższego fragmentu dokumentu:
<P style="position: relative; margin-right: 10px; left: 10px;">
Jako symbol modyfikacji zastosowano dwa myślniki. Będą
one spływały do lewej krawędzi linii zawierającej TO
<SPAN style="position: absolute; top: auto; left: -1em; color: red;">--</SPAN>
słowo.</P>
może być następujący:
Najpierw akapit (krawędzie zawierającego go bloku zostały pokazane na ilustracji) jest pozycjonowany w układzie normalnym. Następnie zostaje on przesunięty o ’10px’ od lewej krawędzi bloku zawierającego (dlatego zarezerwowano ’10px’ margines prawy). Dwa myślniki służące jako symbol modyfikacji zostały wyjęte z układu i ustawione w bieżącej linii (‚top: auto’), w odległości ‚-1em’ od lewej krawędzi bloku zawierającego (ustanowionego przez element P w swoim ostatecznym położeniu). Wynikiem jest złudzenie, że symbol modyfikacji "pływa" po lewej stronie bieżącej linii.
9.9 Prezentacja warstwowa
9.9.1 Określanie poziomu stosu: własność ‚z-index’
Własność ‚z-index’ zastosowana na rzecz pola pozycjonowanego określa:
- Poziom pola na stosie w bieżącym kontekście stosowym.
- Czy pole ustanawia lokalny kontekst stosowy.
Opis wartości:
- <integer>
- Jest to liczba całkowita określająca poziom wygenerowanego pola na stosie w bieżącym kontekście stosowym. Pole ustanawia również lokalny kontekst stosowy, w którym znajduje się na poziomie ’0′.
- auto
- Poziom wygenerowanego pola na stosie w bieżącym kontekście stosowym jest taki sam, jak poziom pola jego rodzica. Pole takie nie ustanawia nowego lokalnego kontekstu stosowego.
W tym podrozdziale słowo "przed" oznacza "bliżej użytkownika patrzącego na ekran".
W CSS 2.1 położenie każdego pola jest określone w trzech wymiarach. Poza położeniem w poziomie i pionie, pola mają określone położenie na "osi z" i są formatowane jedno na drugim. Położenie na osi z ma szczególne znaczenie, gdy pola nakładają się na siebie wizualnie. W tym podrozdziale opisano sposoby pozycjonowania pól na osi z.
Kolejność w jakiej elementy drzewa renderującego są rysowane na kanwie opisuje się przy użyciu kontekstów stosowych. Konteksty stosowe mogą zawierać dalsze konteksty stosowe. Kontekst stosowy jest niepodzielny z punktu widzenia nadrzędnego kontekstu stosowego. Pola z innych kontekstów stosowych nie mogą znajdować się między jego polami.
Każde pole należy do jednego kontekstu stosowego. Każde pole w danym kontekście stosowym ma określony za pomocą liczby całkowitej poziom stosowy, który określa jego położenie na osi z względem innych pól należących do tego samego kontekstu stosowego. Pola znajdujące się na wyższym poziomie stosowym są zawsze formatowane przed polami znajdującymi się na niższym poziomie. Poziomy pól mogą być ujemne. Pola znajdujące się na tym samym poziomie w kontekście stosowym są ustawiane odwrotnie niż w drzewie dokumentu.
Element główny stanowi główny kontekst stosowy. Pozostałe konteksty stosowe są generowane przez elementy pozycjonowane (także pozycjonowane względnie), których wartość obliczona własności ‚z-index’ jest inna niż ‚auto’. Konteksty stosowe nie muszą być związane z blokami zawierającymi. W przyszłych wersjach CSS mogą zostać dodane inne własności wprowadzające konteksty stosowe, np.: ‚opacity‚ [CSS3COLOR].
Każdy kontekst stosowy zawiera następujące poziomy stosowe (od dołu do góry):
- Tło i obramowanie elementu ustanawiającego kontekst stosowy.
- Konteksty stosowe potomków o ujemnych poziomach stosowych.
- Poziom stosowy zawierający nie-śródliniowych nie-pozycjonowanych potomków typu ‚run-in’.
- Poziom stosowy pływających elementów nie-pozycjonowanych i ich zawartości.
- Poziom stosowy zawierający śródliniowych nie-pozycjonowanych potomków typu ‚run-in’.
- Poziom stosowy dla potomków pozycjonowanych z własnością ‚z-index: auto’ i wszystkich potomnych kontekstów stosowych z własnością ‚z-index: 0′.
- Konteksty stosowe potomków o dodatnich poziomach stosowych.
Bardziej szczegółowy opis kolejności pól na stosie znajduje się w dodatku E.
Zawartość bloków i tabel śródliniowych jest ustawiana w stos, jakby elementy te generowały nowy kontekst rozmieszczenia stosowego. Różnica polega na tym, że wszelkie elementy pozycjonowane i elementy, które rzeczywiście tworzą nowy kontekst rozmieszczenia stosowego biorą udział w kontekście stosowym rodzica. Następnie są one rysowane niepodzielnie na śródliniowym poziomie stosowym.
W poniższym przykładzie pola (ich nazwy znajdują się w atrybucie "id") znajdują się na następujących poziomach stosu: "text2"=0, "image"=1, "text3"=2 oraz "text1"=3. Poziom "text2" został odziedziczony po polu głównym. Pozostałe zostały określone za pomocą własności ‚z-index’.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
<HEAD>
<TITLE>Pozycjonowanie na osi z</TITLE>
<STYLE type="text/css">
.pile {
position: absolute;
left: 2in;
top: 2in;
width: 3in;
height: 3in;
}
</STYLE>
</HEAD>
<BODY>
<P>
<IMG id="image" class="pile"
src="butterfly.png" alt="Zdjęcie motyla"
style="z-index: 1">
<DIV id="text1" class="pile"
style="z-index: 3">
Ten tekst zostanie nałożony na zdjęcie motyla.
</DIV>
<DIV id="text2">
Ten tekst będzie znajdował się na samym dole.
</DIV>
<DIV id="text3" class="pile"
style="z-index: 2">
Ten tekst znajdzie się pod text1, ale zostanie nałożony na zdjęcie motyla.
</DIV>
</BODY>
</HTML>
Ten przykład ilustruje pojęcie przezroczystości. Domyślnie tło nie zasłania znajdujących się za nim pól. W przykładzie tym każde pole nakładające się na inne pola jest przezroczyste. Można to zmienić przy użyciu jednej z istniejących własności tła.
9.10 Orientacja tekstu: własności ‚direction’ i ‚unicode-bidi’
Zgodne aplikacje klienckie nie obsługujące tekstu dwukierunkowego mogą ignorować opisane w tym podrozdziale własności ‚direction’ i ‚unicode-bidi’. Do tej grupy zaliczają się również aplikacje klienckie prezentujące znaki od prawej do lewej z tego powodu, że font znajdujący się w systemie nie obsługuje tekstu pisanego w kierunku od lewej do prawej.
Od prawej do lewej pisane są znaki należące do niektórych rodzajów pisma. W niektórych dokumentach, szczególnie w dokumentach w języku arabskim lub hebrajskim oraz w niektórych kontekstach języków mieszanych, tekst znajdujący się w pojedynczym (wyświetlonym wizualnie) bloku może być wyświetlany w mieszanych kierunkach. Zjawisko to nazywa się dwukierunkowością.
W standardzie Unicode ([UNICODE], podrozdział 3.11) zdefiniowano skomplikowany algorytm służący do określania właściwego kierunku tekstu. Algorytm ten składa się z niejawnej części wykorzystującej właściwości znaków oraz jawnych mechanizmów sterujących dla osadzeń (ang. embeddings) i przesłonięć (ang. overrides). CSS 2.1 wykorzystuje ten algorytm w celu uzyskania poprawnego renderowania dwukierunkowego. Własności ‚direction’ i ‚unicode-bidi’ umożliwiają określenie sposobu powiązania elementów i atrybutów języka dokumentu z tym algorytmem.
Aplikacje klienckie obsługujące tekst dwukierunkowy muszą stosować algorytm dwukierunkowy Unicode do każdej sekwencji pól śródliniowych nieprzerwanych przez wymuszone złamanie wiersza lub granicę bloku. Sekwencja taka stanowi w algorytmie dwukierunkowym jednostkę "akapitu". Poziom osadzenia akapitu jest ustawiany według wartości własności ‚direction’ bloku zawierającego, a nie poprzez heurystykę opisaną w krokach P2 i P3 algorytmu Unicode.
Ponieważ kierunek tekstu zależy od struktury i semantyki języka dokumentu, własności te powinny być głównie wykorzystywane przez projektantów dokumentów DTD i autorów specjalnych dokumentów. Jeśli własności te są określone w domyślnym arkuszu stylów, autorzy i użytkownicy nie powinni ich przesłaniać własnymi regułami.
Zachowanie elementów HTML w kontekstach dwukierunkowości opisuje specyfikacja HTML 4 ([HTML4], podrozdział 8.2). Reguły stylistyczne, które pozwoliłyby uzyskać efekt dwukierunkowości opisany w [HTML4] znajdują się w przykładowym arkuszu stylów. Specyfikacja HTML 4 zawiera bardziej szczegółowe informacje na temat dwukierunkowości.
- ‚direction’
-
Wartość: ltr | rtl | inherit Wartość domyślna: ltr Zastosowanie: wszystkie elementy, ale zobacz opis Dziedziczenie: tak Wartości procentowe: nie dotyczy Media: wizualne Wartość obliczana: jak określono
Własność ta określa podstawowy kierunek tekstu w blokach oraz kierunek osadzeń i przesłonięć (zobacz ‚unicode-bidi’) dla algorytmu dwukierunkowości Unicode. Ponadto pozwala określić kierunek układu kolumn tabeli, kierunek przepełnienia poziomego oraz położenie niepełnej ostatniej linii w bloku, gdy własność ‚text-align’ jest ustawiona na ‚justify’.
Opis wartości:
- ltr
- Kierunek od lewej do prawej.
- rtl
- Kierunek od prawej do lewej.
Aby własność ‚direction’ wpłynęła na zmianę kolejności w elementach śródliniowych, własność ‚unicode-bidi’ musi mieć wartość ‚embed’ lub ‚override’.
Uwaga: Własność ‚direction’ ustawiona dla elementów będących kolumnami tabeli nie jest dziedziczona przez komórki tych kolumn, ponieważ kolumny te nie są przodkami owych komórek w drzewie dokumentu. Zatem CSS nie może bez problemu zastosować zasad dziedziczenia atrybutu "dir" opisanych w specyfikacji [HTML4], w podrozdziale 11.3.2.1.
- ‚unicode-bidi’
-
Wartość: normal | embed | bidi-override | inherit Wartość domyślna: normal Zastosowanie: wszystkie elementy, ale zobacz opis Dziedziczenie: nie Wartości procentowe: nie dotyczy Media: wizualne Wartość obliczana: jak określono
Opis wartości:
- normal
- Element nie otwiera dodatkowego poziomu osadzania w odniesieniu do algorytmu dwukierunkowego. W przypadku elementów śródliniowych niejawne zmienienie kolejności działa w granicach elementu.
- embed
- Jeśli element jest śródliniowy, wartość ta otwiera dodatkowy poziom osadzania w odniesieniu do algorytmu dwukierunkowego. Kierunek tego poziomu osadzania jest określony przez własność ‚direction’. Wewnątrz elementu zmiana kolejności odbywa się niejawnie. Odpowiada to dodaniu znaków LRE (U+202A; dla ‚direction: ltr’) lub RLE (U+202B; dla ‚direction: rtl’) na początku elementu oraz PDF (U+202C) na końcu elementu.
- bidi-override
- W elementach śródliniowych wartość ta tworzy przesłonięcie. W elementach blokowych, komórkach tabeli, podpisach tabeli i śródliniowych elementach blokowych wartość ta tworzy przesłonięcie śródliniowych przodków nie znajdujących się w innym elemencie blokowym, komórce tabeli, podpisie tabeli lub blokowym elemencie śródliniowym. Oznacza to, że wewnątrz elementu zmiana kolejności odbywa się ściśle sekwencyjnie zgodnie z własnością ‚direction’. Niejawna część algorytmu dwukierunkowego zostaje zignorowana. Odpowiada to dodaniu znaków LRO (U+202D; dla ‚direction: ltr’) lub RLO (U+202E; dla ‚direction: rtl’) na początku elementu lub na początku każdego anonimowego bloku dziecka oraz PDF (U+202C) na końcu elementu.
Ostateczna kolejność znaków w każdym elemencie blokowym jest taka sama, jak gdyby kody sterujące dwukierunkowością zostały dodane zgodnie z powyższym opisem, znaczniki zostały usunięte a powstała w ten sposób sekwencja została przekazana do implementacji algorytmu dwukierunkowego Unicode dla czystego tekstu, która wytwarza te same złamania wiersza, co stylizowany tekst. W procesie tym obiekty nie będące tekstem takie jak obrazy są traktowane jako znaki neutralne, chyba że ich własność ‚unicode-bidi’ ma wartość inną niż ‚normal’, w którym to przypadku są traktowane jako silne znaki we własności ‚direction’ określonej dla elementu.
Należy zauważyć, że aby było możliwe puszczenie pól śródliniowych w jednym kierunku (albo wszystkie od lewej do prawej, albo odwrotnie) wcześniej może być konieczne utworzenie większej liczby pól śródliniowych (wliczając anonimowe pola śródliniowe) oraz podzielenie niektórych pól śródliniowych i zmianę w nich kolejności.
Ponieważ algorytm Unicode ma limit 61 poziomów osadzania, należy uważać, aby własności ‚unicode-bidi’ nie została nadana inna wartość niż ‚normal’, jeśli nie jest to uzasadnione. Ze szczególną ostrożnością należy używać wartości ‚inherit’. Jednakże w przypadku elementów, które, ogólnie rzecz biorąc, mają być wyświetlane jako bloki, ustawienie ‚unicode-bidi: embed’ jest preferowane, aby utrzymać element w całości na wypadek gdyby sposób prezentacji tego elementu został zmieniony na liniowy (zobacz przykład poniżej).
Poniżej znajduje się przykładowy dokument XML z tekstem dwukierunkowym. Ilustruje on ważną zasadę projektową: Projektanci dokumentów DTD powinni brać pod uwagę dwukierunkowość zarówno we właściwym języku (elementy i atrybuty) jak i dołączonym arkuszu stylów. Arkusz stylów powinien być tak zaprojektowany, aby reguły dwukierunkowości były oddzielone od innych reguł stylistycznych. Reguły dwukierunkowości nie powinny być przesłaniane przez inne arkusze stylów, aby zachowanie w tym zakresie języka dokumentu lub dokumentu DTD zostało zachowane.
W tym przykładzie małe litery oznaczają znaki, które powinny być pisane od lewej do prawej, a wielkie litery reprezentują znaki, które powinny być pisane od prawej do lewej:
<HEBREW>
<PAR>HEBREW1 HEBREW2 english3 HEBREW4 HEBREW5</PAR>
<PAR>HEBREW6 <EMPH>HEBREW7</EMPH> HEBREW8</PAR>
</HEBREW>
<ENGLISH>
<PAR>english9 english10 english11 HEBREW12 HEBREW13</PAR>
<PAR>english14 english15 english16</PAR>
<PAR>english17 <HE-QUO>HEBREW18 english19 HEBREW20</HE-QUO></PAR>
</ENGLISH>
Ponieważ jest to dokument XML, kierunek tekstu ustawiają reguły arkusza stylów. Oto zawartość tego arkusza:
Element HEBREW to blok, którego podstawowy kierunek tekstu to od prawej do lewej. Element English to blok, którego podstawowy kierunek tekstu to od lewej do prawej. PAR to bloki dziedziczące kierunek tekstu po swoich rodzicach. Dlatego dwa pierwsze elementy PAR należy czytać od prawej strony w lewo, a ostatnie trzy — od lewej w prawo. Należy nadmienić, że nazwy elementów HEBREW i ENGLISH zostały zastosowane dla przejrzystości. Ogólnie rzecz biorąc nazwy elementów powinny ukazywać strukturę bez odnoszenia się do języka.
EMPH jest elementem śródliniowym, a ponieważ wartość jego własności ‚unicode-bidi’ to ‚normal’ (wartość domyślna), nie ma żadnego wpływu na kierunek tekstu. Element HE-QUO natomiast tworzy osadzenie.
Jeśli linia byłaby wystarczająco długa, tekst ten mógłby zostać sformatowany następująco:
5WERBEH 4WERBEH english3 2WERBEH 1WERBEH
8WERBEH 7WERBEH 6WERBEH
english9 english10 english11 13WERBEH 12WERBEH
english14 english15 english16
english17 20WERBEH english19 18WERBEH
Należy zauważyć, że osadzenie HE-QUO powoduje, że HEBREW18 znajduje się po prawej stronie english19.
Gdyby linie musiały zostać podzielone, wynik mógłby być następujący:
2WERBEH 1WERBEH
-EH 4WERBEH english3
5WERB
-EH 7WERBEH 6WERBEH
8WERB
english9 english10 en-
glish11 12WERBEH
13WERBEH
english14 english15
english16
english17 18WERBEH
20WERBEH english19
Ponieważ tekst HEBREW18 musi zostać przeczytany przed english19, znajduje się on w wierszu nad english19. Zwykłe złamanie wiersza z poprzedniego formatowania by nie wystarczyło. Należy również zauważyć, że pierwsza sylaba ze słowa english19 mogłaby zostać wpasowana w poprzednim wierszu, ale stosowanie myślników w słowach pisanych od lewej do prawej w kontekstach od prawej do lewej, i odwrotnie, jest zwykle wyłączane w celu uniknięcia konieczności wyświetlania myślników w środku wiersza.

Dodaj komentarz