Professional Documents
Culture Documents
x
x
Ksigarnia internetowa
Lubi to! Nasza spoeczno
O autorze
Eric A. Meyer jest znanym na caym wiecie specjalist od jzykw HTML i CSS oraz
standardw sieciowych. Pracuje w tym zawodzie od 1993 roku. Jest zaoycielem firmy
Complex Spiral Consulting, ktrej klientami s m.in. takie firmy, jak America On-Line,
Apple, Adobe, Microsoft, Progressive Insurance, Sherwin-Williams i wiele innych.
Jest jednym z inicjatorw ruchu promujcego mikroformaty oraz wsporganizatorem
(razem z Jeffreyem Zeldmanem) An Event Apart, serii konferencji dla osb zajmujcych
si tworzeniem witryn internetowych. Meyer jest rwnie autorem piciu bestsellerw
powiconych tematyce kaskadowych arkuszy stylw i projektowaniu stron internetowych.
Podzikowania
Dzikuj Chrisowi Webbowi za zaangaowanie mnie w prace nad tym projektem i cierpliwe
przeczekiwanie wszystkich moich opnie i potkni. Byy chwile, kiedy wydawao si,
e ju nic z tego nie bdzie. Wtedy do akcji wkracza Chris ze swoim dobrym humorem
i stoickim spokojem, po czym wszystko wracao na waciwe tory. Podziwiam Ci i mam
nadziej, e ktrego roku uda nam si w kocu ustali czas wsplnego urlopu, abymy
mogli napi si razem daiquiri przy basenie.
Dzikuj take Debbye Butler i Brianowi Herrmannowi za przeprowadzenie mnie za rk
przez proces korekty i pokazanie mi, gdzie zapuciem si na manowce, gdzie le dobraem
sowa, a gdzie po prostu wyraziem si niejasno.
Dzikuj wszystkim, ktrzy czytaj moje publikacje, czy to papierowe, czy w internecie.
Dzikuj Wam z caego serca.
Dzikuj mojej onie i crkom. Nie potrafi znale sw, aby opisa, jak bardzo jestem
Wam wdziczny.
Eric A. Meyer
Cleveland Heights, Ohio
13 sierpnia 2010
Spis treci
CZ I
PODSTAWY
15
Rozdzia 1
Narzdzia
Firebug
Pasek narzdzi Web Developer
Pasek narzdzi Internet Explorer Developer Toolbar
Dodatek Dragonfly dla Opery
Dodatek WebInspector do przegldarki Safari
XRAY
Narzdzie Selectoracle
Diagnostyczny arkusz stylw
Zerowanie stylw
Skrypt IE9.JS
17
18
24
29
33
35
37
38
40
42
45
Rozdzia 2
Selektory
Pseudoco tam
Precyzyjne ldowanie
Precyzja selektorw
Regua wanoci
Co si dzieje, gdy zostanie pominita jaka warto
w zapisie skrconym?
Wybircze przesanianie wasnoci wzapisie skrconym
Selektor uniwersalny
Identyfikatory a klasy
czenie identyfikatorw z klasami
Przypisywanie jednego elementu dowielu klas
Selektory atrybutw
Selektor atrybutu class
Identyfikatory a selektory atrybutw
Selektor podacuchw wartociatrybutw
Selektor podacuchw wartociatrybutw cig dalszy
Selektory dzieci
Czciowa imitacja selektora elementw dzieci
Selektory elementw siostrzanych
Generowanie treci
47
48
50
51
52
53
55
57
58
61
61
62
64
65
66
68
70
72
73
75
SPIS TRECI
CZ II
NIEZBDNIK
79
Rozdzia 3
Porady
Sprawdzaj poprawno kodu!
Kolejno wasnoci pisma
Wysoko linii
Bezjednostkowe wartoci wasnociline-height
Okrelaj styl obramowania
Ustawianie koloru obramowania
Wyczanie wywietlania elementw
Wyczanie widocznoci elementu
Wyrzucanie elementw poza ekran
Obrazy zamiast tekstu
Style dla druku
Pisanie arkuszy stylw dla druku
cza blokowe
Margines czy dopenienie?
Wycinanie list
Definiowanie punktorw list
Punktory w tle
Generowanie markerw
Masz do dyspozycji wicej kontenerw, ni mylisz
Ta dokumentu
Arkusze serwerowe
81
82
83
83
84
86
86
88
89
90
92
94
95
96
97
99
100
102
105
107
110
111
Rozdzia 4
Ukady
Stosowanie obrysu zamiast obramowania
Ustawianie blokw na rodku
Kontenery elementw pywajcych przepenienie
Pywajce kontenery elementwpywajcych
Clearfix
Kliring elementw przylegajcych
Prosty ukad dwukolumnowy
Prosty ukad trzykolumnowy
Faszywe kolumny
Technika Liquid Bleach
One True Layout
wity Graal
Pynne siatki
Ukad oparty na jednostkach em
Ujemne marginesy w ukadzie normalnym
Pozycjonowanie w kontekcie
Wyjcie poza kontener
Pozycjonowanie na sztywno nagwkw i stopek
115
116
118
121
123
125
126
128
129
132
135
138
142
146
150
154
156
158
161
10
SPIS TRECI
Rozdzia 5
Efekty
Complexspiral
Menu podrczne w CSS
Menu CSS
Nieregularne ksztaty
Zaokrglanie rogw przed nastaniem CSS 3
Zaokrglanie rogw przy uyciu CSS 3
Sprajty CSS
Sliding Doors
Przesuwane drzwi z przycinaniem
Paralaksa CSS
Nieregularne ksztaty pywajce
Lepsze nieregularne ksztaty pywajce
Pola obrazw
Ograniczanie rozmiaru obrazw
Rozdzia 7
Skorowidz
165
166
170
172
174
177
181
183
185
189
191
193
197
201
202
205
Tabele
Nagwek, tre gwna i stopka tabeli
Nagwki wierszy
Formatowanie wedug kolumn
Tworzenie map z danych tabelarycznych
Wykresy z tabel
207
208
211
213
217
224
Pie przyszoci
Formatowanie elementw HTML 5
Imitacja elementw HTML 5 za pomoc nazw klas
Zapytania o media
Formatowanie wybranych elementw-dzieci
Formatowanie wybranych kolumn
Kolory RGB z kanaem alfa
Kolory HSL i HSL z kanaem alfa
Cienie
Definiowanie wielu obrazw w tle elementw
Przeksztacenia dwuwymiarowe
233
234
236
237
242
246
249
250
252
254
258
269
11
Wstp
Technologia CSS staa si tak niezwykle popularna dorwnaa ju prawie samemu
jzykowi HTML e czasami a trudno w to uwierzy. Mona j spotka ju wszdzie,
od przegldarek internetowych, przez sklepy internetowe, po aplikacje do czatowania,
iniewyglda na to, aby miao si cokolwiek w tej kwestii zmieni. W miar jak zakres
uyciajzyka staje si coraz szerszy, jego moliwoci coraz bardziej si powikszaj.
Niniejsza ksika zawiera opis okoo setki porad, technik, narzdzi i sztuczek dotyczcych
tworzenia najwyszej jakoci witryn internetowych przy uyciu CSS. Kady opis jest
niezaleny od pozostaych, tzn. moesz otworzy ksik na dowolnej stronie i przeczyta to,
co si na niej znajduje, bez obaw, e stracisz co wanego z poprzednich stron. Oznacza
to, e do zrozumienia tekstu potrzebna jest przynajmniej podstawowa znajomo technik
CSS oraz wiedza, do czego technologia ta suy. Potrzebny poziom umiejtnoci najlepiej
mona by okreli jako zaawansowany pocztkujcy lub rednio zaawansowany. Jeli
wic dopiero zaczynasz poznawa CSS albo wiesz na ten temat wicej ni twrcy samej
specyfikacji CSS, ta ksika raczej nie jest dla Ciebie. Wszyscy pozostali znajd tu mnstwo
cennych porad i duo si naucz.
W pierwszej czci przedstawiem krtki przegld najprzydatniejszych narzdzi i podstawowych
technik, wliczajc niektre najmniej znane selektory CSS. W czci drugiej opisuj rne
rzeczy, jakie mona zrobi przy uyciu CSS, tzn. rozmaite ciekawe efekty, rne sposoby
osignicia tego samego celu, ukady itp. W czci trzeciej zostay opisane najnowsze
zaawansowane techniki, ktrych moe nie uda Ci si realnie wykorzysta w cigu
najbliszych dni, ale z pewnoci bd nabieray znaczenia w niedugim czasie.
Przykady kodu mona pobra z serwera FTP wydawnictwa Helion pod adresem
ftp://ftp.helion.pl/przyklady/tfacss.zip.
Niecae 10 lat temu kady, kto myla, e jzyk CSS odchodzi do lamusa, mgby by w jaki
sposb usprawiedliwiony, lecz dzi, w roku 2011, technologia ta rozkwita jak nigdy dotd.
Licz na to, e spodoba Ci si tre tej ksiki tak samo, jak mnie podobao si jej pisanie!
I
CZ
PODSTAWY
Rozdzia 1. Narzdzia
Rozdzia 2. Selektory
1
ROZDZIA
PODRCZNIK CSS
NARZDZIA
CZ I: PODSTAWY
FIREBUG
Firebug (rysunek 1.1) to jedno z dwch moich ulubionych narzdzi pracy (drugie opisaem
dalej, w podrozdziale Pasek narzdzi Web Developer). Jest to cakowicie darmowe
rozszerzenie do cakiem darmowej przegldarki Firefox. Jeli korzystasz z innej aplikacji,
toczytaj dalej, bo w niej rwnie moesz korzysta z dodatku Firebug!
18
ROZDZIA 1: NARZDZIA
19
CZ I: PODSTAWY
20
Rysunek 1.3. Rozszerzenie Firebug dziaajce w osobnym oknie z zakadk Styl w penej krasie
Mimo i ten sposb prezentacji stylw nie jest zy przypomina nam, e skrcony
zapis wasnoci czsto mwi o wiele wicej, ni w istocie bymy chcieli to trzeba si
napocztku do niego przyzwyczai (wicej na temat skrconego zapisu wasnoci pisz
wrozdziale 2.).
Kolejna rzecz warta uwagi, to fakt, e reguy w okienku Styl s wywietlane w kolejnoci
od najprecyzyjniejszej. To znaczy na pocztku znajduje si regua o najwyszym poziomie
precyzji w zastosowaniu do badanego elementu, pod ni jest druga w tej kolejnoci itd.
(wicej na temat precyzji pisz w rozdziale 2., w podrozdziale Precyzja selektorw).
Kady element na stronie mona dokadnie zbada, klikajc go prawym przyciskiem myszy
i wybierajc w menu kontekstowym, ktre zostanie wywietlone, pozycj Zbadaj element
(rysunek 1.4). Tryb inspekcji rozszerzenia Firebug mona te wczy poprzez kliknicie
ikony przedstawiajcej prostokt i kursor, umieszczonej obok ikony Firebug. Gdy bdziesz
porusza si po stronie, wskazywane elementy bd zaznaczane, a kliknicie jednego z nich
spowoduje wywietlenie jego szczegw.
Kad deklaracj CSS mona wyczy, klikajc obok niej z lewej strony. Jest to bardzo
przydatna opcja, gdy chcemy sprawdzi, jak rne wasnoci wsppracuj ze sob, poprzez
wyczanie po jednej z nich. Na rysunku 1.5 natomiast widzimy, e najedajc kursorem
na warto koloru, mona zobaczy w maym okienku, jaki rzeczywicie kolor ona
reprezentuje.
ROZDZIA 1: NARZDZIA
21
CZ I: PODSTAWY
Ponadto na karcie Styl mona wywietli ostateczne wartoci kadej wasnoci CSS
zastosowanej do wybranego elementu (rysunek 1.6), a wic takie, ktre zostay
zastosowane do niego przez przegldark w ostatecznym wyniku, bez wzgldu na
to, czyco o nich wspominalimy w naszym arkuszu, czy nie. Pamitaj, e wszystkie
wasnoci CSS maj domylne wartoci i dziki tej opcji mona je wszystkie zobaczy.
Wtym widoku mona np.dowiedzie si, ile dokadnie pikseli wynosi wasno
line-height w naszym nagwku.
22
ROZDZIA 1: NARZDZIA
23
CZ I: PODSTAWY
Jeli nie uywasz przegldarki Firefox, a chcesz korzysta z podstawowych dobrodziejstw
rozszerzenia Firebug, wejd na stron getfirebug.com/lite.html (rysunek1.9). Znajdziesz tam
wskazwki na temat wczenia tego dodatku wprzegldarkach Internet Explorer, Opera
iSafari. Aby korzysta z dodatku, moeszgodoczy do testowanej przez siebie strony
albododa go jako zakadk doulubionych (polecam t drug opcj).
24
ROZDZIA 1: NARZDZIA
25
CZ I: PODSTAWY
26
ROZDZIA 1: NARZDZIA
Rysunek 1.13. Wywietlanie informacji o klasach i identyfikatorach za pomoc opcji z menu Informacje
Za pomoc opcji w menu Zaznacz (rysunek 1.14) mona zaznaczy na stronie wybrane
rodzaje elementw np. wszystkie elementy blokowe, rdliniowe, odnoniki,
pozycjonowane, komrki tabeli itd. jak rwnie okreli wasny zbir elementw
ikolorw. Ponadto mona ustali, czy na stronie wraz z obrysami maj by wywietlane
nazwy elementw. To menu oferuje znacznie wiksze moliwoci, ni mogoby si wydawa
na pierwszy rzut oka. Na swoje potrzeby nazywam je menu diagnostyki ukadu, poniewa
pozwala zaznaczy obrysem zestawy elementw i szybko oceni, jak s rozmieszczone
wzgldem siebie, oraz wykry potencjalne usterki.
W menu Narzdzia znajduj si opcje oferujce szybki dostp do kilku narzdzi do
sprawdzania poprawnoci kodu, znajdowania bdw i do konsol do wykrywania bdw.
Z tych wszystkich opcji najlepsze s Sprawd poprawno lokalnego pliku CSS i Sprawd
poprawno lokalnego pliku HTML (rysunek 1.15). Kada z nich serializuje kod otwartej
strony na posta acucha znakw i wysya go do odpowiedniego walidatora. Jeli wic
wybierzesz pierwsz z tych opcji, program wyle do walidatora CSS kod arkuszy stylw,
jelinatomiast wybierzesz drug do walidatora HTML zostanie wysany kod znacznikw,
po czym otrzymasz raport na temat stanu tego kodu. Opcja ta jest nieoceniona, gdy
pracujemy pod ochron zapory internetowej albo bezporednio na plikach zapisanych
na twardym dysku, ktre nie s dostpne w internecie, a wic te i dla walidatora.
Dzikilokalnemu sprawdzaniu poprawnoci kodu nie jest to ju problemem.
27
CZ I: PODSTAWY
28
ROZDZIA 1: NARZDZIA
PASEK NARZDZI
INTERNET EXPLORER DEVELOPER TOOLBAR
Uytkownicy przegldarki Internet Explorer 7 nie maj moliwoci korzystania z paska
narzdzi Web Developer (zobacz poprzedni podrozdzia), ale mog w zamian zainstalowa
dodatek Internet Explorer Developer Toolbar (IEDT).
Adres URL strony tego dodatku to jeden z tych klasycznych, nieskoczenie dugich
iniemoliwych do rozszyfrowania adresw Microsoftu. Dlatego otwrz swoj ulubion
wyszukiwark (np. na zo Microsoftowi wybierz Google) i w polu wyszukiwania
wpisz fraz Internet Explorer Developer Toolbar. Szukana strona powinna zosta
wywietlona na pierwszym miejscu. Wejd na ni i zainstaluj dodatek, jeli uywasz IE 7.
Nie jest on obsugiwany przez IE 8, ale do tej przegldarki wrcimy za chwil.
Po zakoczeniu instalacji rozwi menu Narzdzia znajdujce si w pobliu prawego
grnego rogu okna przegldarki, obok menu Strony (rysunek 1.16) nie chodzi tu o menu
Narzdzia po lewej stronie, midzy menu Ulubione i Pomoc. W wymienionym menu kliknij
pozycj Paski narzdzi, a nastpnie Paski eksploratora i w kocu IE Developer Toolbar.
29
CZ I: PODSTAWY
Gdy wczysz pasek IEDT, w dolnej czci okna Internet Explorera wywietli si specjalne
okno, podobne do tego, ktre znamy z dodatku Firebug (rysunek 1.17). W jego grnej czci
znajduj si rne menu. Dodatek mona uruchomi take w osobnym oknie. W tym celu
naley klikn ikon przedstawiajc dwa mae okienka, umieszczon w prawym grnym
rogu okna dodatku. Moliwo powikszenia okna w ten sposb najbardziej przydaje si
podczas pracy w rodowiskach o maej rozdzielczoci, takich jak netbooki czy projektory.
30
ROZDZIA 1: NARZDZIA
Rysunek 1.18. Pasek IE Developer Toolbar z wyczon opcj Show Default Styles
31
CZ I: PODSTAWY
Przegldarka IE 8 ma wbudowany zestaw narzdzi deweloperskich, a wic nie trzeba w niej
instalowa adnych dodatkw. Dokumentacja tego zestawu znajduje si w internecie,
ale niestety pod adresem niewiele atwiejszym do zapamitania ni adres wczeniej
opisywanego paska narzdzi dla IE 7. Dlatego lepiej skorzystaj z jakiej wyszukiwarki
internetowej, wpisujc w niej fraz Discovering Internet Explorer Developer Tools
(niestety, aktualnie dokumentacja dostpna jest tylko w jzyku angielskim przyp. tum.).
Odnonik do waciwej strony powinien si wywietli na samej grze.
Aby uruchomi dodatek Narzdzia deweloperskie, rozwi menu Narzdzia przegldarki
(rysunek 1.20) i kliknij opcj o tej samej nazwie albo nacinij klawisz F12. To wszystko,
co trzeba zrobi. Narzdzia deweloperskie przypominaj wygldem pasek IE Developer
Toolbar, a wic wygldaj jak krzywka dodatku Firebug z paskiem narzdzi Web
Developer. Ukad menu jest bardzo podobny do paska narzdzi IE 7, natomiast
znajdujcym si pod nimi zakadkom bliej do dodatku Firebug.
32
ROZDZIA 1: NARZDZIA
33
CZ I: PODSTAWY
34
ROZDZIA 1: NARZDZIA
DODATEK WEBINSPECTOR
DO PRZEGLDARKI SAFARI
Jeli Twoim gwnym narzdziem pracy jest przegldarka Safari, to musisz koniecznie
zapozna si z narzdziem inspektor WWW.
Aby je wczy, otwrz okno Preferencje, przejd na kart Zaawansowane, a nastpnie
zaznacz pole wyboru Pokazuj menu Programowanie w pasku menu (rysunek 1.24).
Po wykonaniu tych czynnoci rozwi menu Programowanie i wybierz w nim pozycj
Poka inspektora www lub nacinij kombinacj klawiszy Ctrl+Alt+I (Windows) albo
Option+Command+I (Mac). Skrt nie jest przecznikiem, tzn. jeli inspektor WWW jest
wczony, to nacinicie tej kombinacji klawiszy nie spowoduje jego zamknicia. Do tego
potrzebna jest mysz. Skrt Command+W (lub Ctrl+W w Windows) dziaa tylko wwczas,
gdy inspektor WWW jest uruchomiony we wasnym oknie. Jeli zastosuje si go, gdy
inspektor WWW jest zadokowany w oknie gwnym przegldarki, to zostanie zamknita
caa przegldarka.
35
CZ I: PODSTAWY
36
Na dole znajduj si zgrupowane reguy dotyczce badanego elementu. Kad z grup mona
rozwin i zwin. Jeszcze niej znajduje si podokienko Miary, w ktrym mona sprawdzi
wymiary pola tworzonego w ukadzie przez badany element (rysunek 1.26).
ROZDZIA 1: NARZDZIA
XRAY
Jeli potrzebujesz lekkiego narzdzia do inspekcji elementw, dziaajcego we wszystkich
przegldarkach, to widoczny na rysunku 1.27 XRAY jest stworzony dla Ciebie.
Maograniczony zakres zastosowania, ale jeli szukasz czego prostego, to naley t cech
traktowa jako zalet.
37
CZ I: PODSTAWY
38
Rysunek 1.28. Narzdzie XRAY w akcji
Podobnym narzdziem, cho o nieco innym przeznaczeniu, jest MRI (westciv.com/mri).
Umoliwia ono wpisanie dowolnego selektora i sprawdzenie, jaki to wywoa efekt.
NARZDZIE SELECTORACLE
Nazwa Selectoracle (rysunek 1.29) brzmi jak jaka reklama bazy danych, ale ni nie jest.
Jest to internetowe narzdzie zamieniajce selektory w tekst przypominajcy uproszczony
angielski (nazwa powstaa z poczenia angielskich sw Selector i Oracle).
Wejd na stron gallery.theopalgroup.com/selectoracle i wpisz jeden albo kilka dowolnych
selektorw CSS. Wybierz jzyk (dostpny jest jeszcze hiszpaski) i kliknij przycisk Explain
This! (wyjanij to). W odpowiedzi otrzymasz objanienie wszystkich wprowadzonych przez
siebie selektorw. Np. dla selektora:
ul li:nth-child(2n+3):not(:last-child)
ROZDZIA 1: NARZDZIA
39
Rysunek 1.29. Strona Selectoracle
otrzymamy nastpujce objanienie:
Selects any li element that is an odd numbered child starting with the third child and that is
not a last child that is a descendant of a ul element (wybiera wszystkie elementy li bdce
nieparzystym dzieckiem, zaczynajc od trzeciego dziecka, i niebdce ostatnim dzieckiem
elementu ul).
Moe na pocztku wydaje si to troch niejasne, ale po powtrnym przeczytaniu powoli
staje si zrozumiae. Poza tym nie przejmuj si zbytnio tym selektorem, poniewa w chwili,
gdy powstawa ten tekst, adna przegldarka nie potrafia go jeszcze w peni obsugiwa.
Pamitaj jednak, e jeli trafisz na jaki selektor, ktrego nie rozumiesz, to moesz
sprbowa znale pomoc na stronie Selectoracle.
Czy marzye kiedy o tym, aby Twoja przegldarka krzyczaa, gdy wczytujesz w niej strony
z przestarzaymi i niewygodnymi elementami, takimi jak font? Teraz jest to moliwe
w sensie wizualnym dziki diagnostycznym arkuszom stylw.
CZ I: PODSTAWY
40
Kod jest poprawny, wic walidator nie zgosi adnego problemu. A jednak, jeli kto
korzysta z przegldarki nieobsugujcej JavaScriptu, ten odnonik nie zadziaa. Takim
odnonikom powinno towarzyszy jakie alternatywne rozwizanie z uyciem normalnej
wartoci atrybutu href. Dlatego w innym miejscu mojego diagnostycznego arkusza stylw
znajduje si nastpujca regua:
a[href="#"] {background: lime;}
Pokae nam ona wszystkie odnoniki, ktre maj w atrybucie href tylko warto wstawian
za pomoc JavaScriptu (w regule wykorzystaem selektor atrybutu wicej na jego temat
pisz w rozdziale 2., w podrozdziale Selektory atrybutw).
Jak naley uywa diagnostycznego arkusza stylw? Mona go doda do arkuszy witryny
w czasie pracy nad ni i usun go po skoczeniu pracy albo ustawi jako arkusz stylw
uytkownika w przegldarce i wwczas bdzie mona go stosowa do kadej odwiedzanej
strony.
Poniej zamieszczono peny kod diagnostycznego arkusza stylw, ktry znajduje elementy
bez treci, obrazy bez atrybutw alt i title, puste elementy obrazw, tabele bez atrybutw
summary, nagwki tabel z niepoprawnymi wartociami atrybutu scope oraz odnoniki
z niepoprawnymi lub pustymi atrybutami title i href. Ta wersja arkusza nie dziaa
wprzegldarce IE 7 ze wzgldu na uyte w nim selektory atrybutw. W IE 8 te nie zadziaa
z powodu uycia pseudoklas :not() i :empty(). Na rysunku 1.30 wida stron testow tego
arkusza.
ROZDZIA 1: NARZDZIA
div:empty, span:empty,
li:empty, p:empty,
td:empty, th:empty {padding: 0.5em; background: yellow;}
*[style], font, center {outline: 5px solid red;}
*[class=""], *[id=""] {outline: 5px dotted red;}
img[alt=""] {border: 3px dotted red;}
img:not([alt]) {border: 5px solid red;}
img[title=""] {outline: 3px dotted fuchsia;}
img:not([title]) {outline: 5px solid fuchsia;}
table:not([summary]) {outline: 5px solid red;}
table[summary=""] {outline: 3px dotted red;}
th {border: 2px solid red;}
th[scope="col"], th[scope="row"] {border: none;}
a[href]:not([title]) {border: 5px solid red;}
a[title=""] {outline: 3px dotted red;}
a[href="#"] {background: lime;}
a[href=""] {background: fuchsia;}
41
CZ I: PODSTAWY
ZEROWANIE STYLW
Jedn z rzeczy, o ktr moe nigdy nie podejrzewae arkuszy CSS, jest to, e s one
stosowane do formatowania dokumentw HTML zawsze, nawet wtedy, gdy nie napiszesz
ani jednej reguy. W rzeczywistoci do kadego niestylizowanego dokumentu (przykad
na rysunku 1.31) stosowana jest caa masa arkuszy stylw, z ktrych wszystkie pochodz
bezporednio od przegldarki. Domylny rozmiar i grubo nagwkw, rozdzia elementw
od fragmentw tekstu, punktory obok elementw list, a nawet rozrnienie pl blokowych
irdliniowych pochodz od zestawu domylnych arkuszy stylw przegldarki.
42
ROZDZIA 1: NARZDZIA
W odpowiedzi na te niespjnoci zaczto tworzy arkusze stylw zerujce domylne
ustawienia (rysunek 1.32). Ich zadaniem jest zlikwidowanie jak najwikszej liczby rnic
midzy przegldarkami poprzez bezporednie ustawienie rnych wasnoci. Najprostsza
ztakich regu znajduje si poniej:
* {margin: 0; padding: 0;}
43
CZ I: PODSTAWY
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-size: 100%;
vertical-align: baseline;
}
body {
line-height: 1;
}
Wow! To caa masa elementw. Chodzi o to, aby wybra wszystkie elementy niebdce
kontrolkami formularza (input, select, textarea) i ujednolici ich formatowanie.
Pierwsza regua zeruje marginesy, dopenienie, obramowanie i obrys wszystkich elementw
oraz ustawia im jednakowy rozmiar pisma i takie same wyrwnanie poziome. Druga
natomiast zmniejsza wysoko linii elementu body. Warto ta zostanie odziedziczona
przez wszystkie elementy potomne tego elementu.
44
W arkuszu tym znajduje si wicej regu stylistycznych tego rodzaju. Niektre np. usuwaj
wypunktowanie z elementw list i cudzysowy automatycznie wstawiane w elementach
blockquote i q. Ma to na celu ujednolicenie wygldu dokumentu we wszystkich
przegldarkach przed rozpoczciem pisania arkuszy, ktre zamieni go w dzieo sztuki.
Teraz moe sobie mylisz: Chwileczk, to znaczy, e musz cofn wszystko, co do tej pory
zrobiem! Nigdy bym nie ustawi wysokoci linii na jeden, bo tekst byby za bardzo cinity
w pionie! Nie mam te ochoty bawi si w pionowe wyrwnywanie elementw indeksu
grnego i dolnego!.
To s uzasadnione wtpliwoci. Dlatego kady powinien wzi taki arkusz stylw
idostosowa go do swoich potrzeb. Jeli np. wasnoci line-height zawsze nadajesz
warto 1.4, aby uzyska przejrzysty tekst, wystarczy, e zmienisz odpowiedni deklaracj
warkuszu zerujcym:
body {
line-height: 1.4;
}
Przy okazji moesz doda swoje standardowe kolory ta i tekstu oraz okreli krj pisma,
ktrego zawsze uywasz:
body {
font: smaller/1.4 Helvetica, sans-serif;
background: #ABACAB;
color: #444;
}
ROZDZIA 1: NARZDZIA
Jeli nie planujesz zmienia wygldu list, moesz wyeliminowa regu usuwajc punktory
(ja akurat bym j zostawi, ale przecie wszyscy si jako rnimy). Dodaj reguy precyzyjnie
okrelajce sposb i gboko wcicia list, oddzielajce akapity od elementw listy, zdefiniuj
wasny sposb interpretacji elementu strong itd.
Po wykonaniu tych wszystkich dziaa otrzymasz ju nie zerujcy, lecz raczej
przebudowujcy arkusz stylw. Za jego pomoc cakowicie zmienisz podstawow
konstrukcj dokumentw, ktra bdzie stanowia Twj punkt wyjcia do dalszej pracy.
Oprcz tego, e za pomoc arkuszy CSS moesz przestawi kad przegldark na inny tryb
dziaania, moesz je ulepsza za pomoc JavaScriptu. Nie artuj.
SKRYPT IE9.JS
Dziki skryptowi IE9.js Deana Edwardsa moesz sprawi, aby przegldarki od IE 5 do IE
8 obsugiway HTML i CSS w sposb bardzo podobny do (jeszcze oficjalnie niewydanej)
przegldarki IE 9. Skrypt ten mona pobra pod adresem code.google.com/p/ie7-js (rysunek
1.33) ta sidemka na kocu to nie pomyka, zostaa w nazwie jako relikt przeszoci,
poniewa projekt pocztkowo mia nazw IE7.js, pniej IE8.js, a teraz jest ju IE9.js.
45
CZ I: PODSTAWY
IE9.js to zestaw procedur w jzyku JavaScript, ktre jeli strona jest przegldana za pomoc
innej przegldarki ni Internet Explorer 9 analizuj cay kod HTML i CSS w celu
sprawdzenia, ktre elementy i wasnoci nie s obsugiwane przez uywan przegldark.
Nastpnie skrypt wykonuje kilka magicznych sztuczek za kulisami i naprawia to, co jest
popsute.
Wemy np. selektory atrybutw, ktre nie s obsugiwane przez IE 5 i IE 6. Gdybymy
napisali tak regu:
a[href] {text-decoration: none; color: red;}
46
Oczywicie nic z tego nie bdzie, jeli przegldarka bdzie miaa wyczon obsug
JavaScriptu. Po prostu trzeba rozway potencjalne korzyci i to, czego moemy si
spodziewa po grupie docelowej uytkownikw strony. Czy wielu z nich uywa jeszcze IE 6?
Czy jest due prawdopodobiestwo, e wyczyli oni obsug JavaScriptu? Tak naprawd te
same pytania trzeba sobie zada przed rozpoczciem pracy nad kadym projektem, a wic
nie przysporzy nam to wiele dodatkowej pracy.
Najczciej zalecan technik doczania skryptu IE9.js do stron jest zamknicie elementu
script w komentarzu warunkowym:
<!--[if lt IE 9]>
<script src="/code/IE9.js" type="text/javascript"></script>
<![endif]-->
Skrypt jednak sam decyduje, czy istnieje potrzeba jego uruchomienia, a wic pod tym
wzgldem komentarz ten jest zbdny. W takim przypadku jednak bdzie pobierany przez
kadego uytkownika, bez wzgldu na uywan przez niego przegldark. Jeli zastosujemy
komentarz warunkowy, skrypt bdzie pobierany tylko przez te przegldarki, ktre go
potrzebuj.
Jak ju wspomniaem, istniej wersje skryptu uaktualniajce starsze wersje IE do wersji 7.
i 8. Jeli wic stwierdzisz, e IE9.js nie spenia Twoich oczekiwa, moesz wyprbowa te
jedn z poprzednich wersji.
2
ROZDZIA
PODRCZNIK CSS
SELEKTORY
CZ I: PODSTAWY
PSEUDOCO TAM
W technologii CSS wystpuj dwa rodzaje pseudoczego tam pseudoklasy
ipseudoelementy. W CSS 2.1 dostpne s nastpujce pseudoklasy:
:link: nieodwiedzone cze
:visited: odwiedzone cze
:hover: element, nad ktrym znajduje si kursor
:focus: element z fokusem
:active: aktywny element (np. odnonik w czasie, gdy element jest klikany)
:first-child: element bdcy pierwszym dzieckiem innego elementu
:lang(): element o okrelonej wartoci atrybutu lang
48
ROZDZIA 2: SELEKTORY
Ta regua ma takie samo dziaanie, jakbymy napisali:
h1 pierwsza-litera {font-size: 250%;}
<h1><pierwsza-litera>C</pierwsza-litera>ze, dzieciaki!</h1>
Czy wanie to dzieje si wewntrz mechanizmu przegldarki? Kto wie? Jedyne, co mona
stwierdzi na pewno, to fakt, e tak to dziaa. Std nazwa pseudoelement.
Natomiast pseudoklasy dziaaj tak, jakby dynamicznie doczay do elementw klasy.
Wyobramy sobie, e przegldarka przypisuje kademu elementowi w dokumencie
bdcemu pierwszym dzieckiem jakiegokolwiek innego elementu klas pierwsze-dziecko.
Wwczas moglibymy przypisa styl tym elementom, stosujc nastpujc regu:
li.pierwsze-dziecko{border-left: none;}
Wystarczy, e zamienisz tylko kropk na rednik, tzn. li:first-child, i uzyskasz taki sam
efekt bez koniecznoci zamiecania swojego kodu ca mas klas.
Zapewne ciekawi Ci te, dlaczego na pocztku pseudoelementw znajduj si dwa
dwukropki. Taki standard zapisu zosta wprowadzony poza specyfikacj CSS 2.1 i jak na
razie adna przegldarka nie zmusza do jego stosowania. Rwnie dobrze mona stosowa
tylko jeden dwukropek.
Na marginesie warto doda, e w CSS 3 wprowadzono sporo nowych pseudoklas,
ktrewchwili obecnej nie s zbyt szeroko rozpoznawane przez przegldarki:
:target
:root
:nth-child()
:nth-of-type()
:nth-last-of-type()
:first-of-type
:last-of-type
:only-of-type
:only-child
:last-child
:empty
:not()
:enabled
:disabled
:checked
49
CZ I: PODSTAWY
PRECYZYJNE LDOWANIE
Czsto bardzo przydatna jest moliwo wskazania w dokumencie identyfikatora fragmentu.
C to takiego? spytasz. Nic strasznego. Spjrz niej:
<a href="http://przyklad.pl/law.html#podr2-7">Podrozdzia 2.7</a>
Kady, kto kliknie takie cze, zostanie przeniesiony nie tylko na odpowiedni stron, lecz
wylduje dokadnie w miejscu wskazywanym przez identyfikator fragmentu strony (#podr2-7).
Ten sam efekt mona uzyska za pomoc kotwicy, ale lepiej jest uywa identyfikatorw.
Otoobie moliwoci:
<h3><a name="podr2-7">Wyjtki</a></h3>
<h3 id="podr2-7">Wyjtki</h3>
50
ROZDZIA 2: SELEKTORY
Oczywicie mona te zastosowa specjalne formatowanie do kadego elementu bdcego
punktem docelowym. Wwczas selektor h3 naley zastpi selektorem uniwersalnym,
jakwida poniej:
*:target {color: 20689a;
background: #ffff66;}
PRECYZJA SELEKTORW
Precyzja selektorw, mimo i dla niektrych trudna do pojcia, jest kluczem do zrozumienia
interakcji zachodzcych midzy rnymi reguami CSS.
Jest to liczbowa reprezentacja dokadnoci selektora. Okrela si j na podstawie trzech
czynnikw:
Kady selektor elementu wnosi precyzj rzdu 0,0,0,1.
Kada klasa, pseudoklasa i kady selektor atrybutu ma precyzj 0,0,1,0.
Kady identyfikator ma precyzj 0,1,0,0.
0,0,0,4
div.aside ul li
0,0,1,3
a:hover
0,0,1,1
#title em
0,1,0,1
h1#title em
0,1,0,2
51
CZ I: PODSTAWY
To powinno Ci pomc zrozumie sposb konstrukcji wartoci okrelajcych precyzj.
Doczego su te wszystkie przecinki? Ot kady poziom precyzji jest jakby samodzieln
wartoci. Tak wic selektor skadajcy si z jednego selektora klasy ma wiksz precyzj ni
skadajcy si z 13 selektorw elementw. Ich wartoci byyby nastpujce:
.aside /* 0,0,1,0 */
div table tbody tr td div ul li ol li ul li pre /* 0,0,0,13 */
Jedynka na trzeciej pozycji w wartoci pierwszego selektora bije zero na tej samej pozycji
w wartoci drugiego selektora. To oznacza, e trzynastka na czwartej pozycji drugiego
selektora w tym przypadku jest bez znaczenia. Przecinki sprawiaj, e atwiej jest rozpozna,
do czego nale poszczeglne liczby. Gdyby ich nie byo, otrzymalibymy wartoci 10 i 13
iwycignlibymy bdny wniosek, e drugi selektor jest precyzyjniejszy od pierwszego
(wewczeniejszych wersjach CSS, zanim wprowadzono zapis z przecinkami, rzeczywicie
byo z tym mnstwo problemw).
Wiele osb apie si te na tym, e myli, i na precyzj selektorw ma wpyw strukturalny
ukad elementw HTML. Wemy np. ponisze dwie reguy:
ul li {font-style: normal;}
html li {font-style: italic;}
52
Ktra z nich wemie gr? Obie zawieraj po dwa selektory elementw, a wic obie maj
precyzj 0,0,0,2. Dlatego zastosowana zostanie ta, ktra zostaa wpisana ostatnia, a wic
html li. Nie ma adnego znaczenia, e element ul jest skadniowo bliszy elementowi li.
Precyzja selektorw to prosta warto liczbowa. Nie bierze si w niej pod uwag w aden
sposb struktury dokumentw. W tym przypadku wszystkie elementy listy zostan
napisane pismem pochyym, poniewa jeli dwie reguy maj tak samo precyzyjne selektory,
zastosowana zostaje ostatnia z nich.
Zapewne zastanawiasz si, jak rol odgrywa to pierwsze zero w zapisie precyzji, skoro
napisaem, e pod uwag brane s tylko trzy czynniki. Dotyczy ono stylw rdliniowych,
awic w poniszym kodzie to elementu div bdzie niebieskie.
div#header {background: purple;} /* 0,1,0,0 */
<div id="header" style="background: blue;"> <!-- 1,0,0,0 -->
REGUA WANOCI
Regua wanoci ma posta !important i przewysza si reguy precyzji. Jeli jeste
programist, to musz Ci od razu poratowa dodatkowym objanieniem !important
wcale nie oznacza nie important.
Notacja ta suy do oznaczania wybranych deklaracji jako wane. Oto prosty przykad:
a:hover {color: red !important; text-decoration: none;}
ROZDZIA 2: SELEKTORY
Jako wana zostaa tu oznaczona tylko deklaracja color: red. Aby tak samo oznaczy inne
deklaracje, trzeba kad z nich opatrzy osobnym dopiskiem !important.
Mwic najprociej, kada deklaracja oznaczona jako !important jest waniejsza
od wszystkich deklaracji bez takiego oznaczenia koniec i kropka. W przypadku
przedstawionym poniej cze bdzie zielone:
div#gohome a#home {color: red;}
div a {color: green !important;}
<div id="gohome"><a id="home" href="/">Strona gwna</a></div>
Pierwszej regule nie pomoga nawet bardzo wysoka precyzja selektora (0,2,0,2), poniewa
regua !important i tak jest waniejsza.
Oczywicie, jeli dodamy oznaczenie !important take do pierwszej reguy, sytuacja zmieni si
diametralnie.
div#gohome a#home {color: red !important;}
div a {color: green !important;}
Poniewa obie deklaracje kolorw s oznaczone jako !important, konflikt zosta rozwizany
wedug typowych zasad kaskadowoci. Innymi sowy, znowu do gosu dosza precyzja
selektorw i cze bdzie czerwone.
Z tego wynika, e regu !important naley stosowa z rozwag. Jeli zaczniesz jej naduywa
do przesaniania rnych deklaracji, to w kocu moesz doprowadzi do tego, e bdziesz
musia jedne deklaracje !important przesania innymi, te kolejnymi itd., a w kocu
wszystkie zostan oznaczone w ten sposb i adna nie bdzie specjalnie wana.
53
CZ I: PODSTAWY
Teraz uzyskamy tekst redniego rozmiaru napisany Verdan (lub innym bezszeryfowym
krojem pisma, jeli Verdana bdzie niedostpna) i o normalnej gruboci. Na rysunku 2.4
wida, e pogrubienie rzeczywicie znikno.
54
Rysunek 2.4. Przypadkowe usunicie pogrubienia
Wynik taki uzyskalimy dlatego, e w skrconym zapisie wasnoci wszystkie wartoci, ktre
nie zostan bezporednio zdefiniowane, przyjmuj okrelon warto domyln. Dlatego nie
okrelajc gruboci, stylu i wariantu pisma, napisalimy regu rwnoznaczn z ponisz:
strong {font: normal normal normal small/normal Verdana, sans-serif;}
Tak, nawet wasnoci line-height jest przypisywana domylna warto, ktra moe
przesoni ewentualn warto odziedziczon.
Jeli nie zaplanujemy swojego arkusza stylw bardzo starannie, to moemy mie z tym
powane kopoty. Wemy pod rozwag dwie ponisze reguy. Pierwsza z nich pochodzi
zoglnego arkusza dla caej witryny, a druga z arkusza osadzonego na stronie.
body {background: #FCC url(/i/pagebg.gif) 10px 25% no-repeat fixed;}
body {background: url(i/body-bg.gif);}
Te dwie reguy sprawi, e na naszej stronie zostanie wywietlony nowy obraz zwielokrotniony
w tle. Jego pocztek bdzie znajdowa si w lewym grnym rogu i bdzie on przewijany wraz
z treci strony. Jest to efekt tego, e druga regua jest rwnoznaczna z ponisz:
body {background: transparent url() 0 0 repeat scroll;}
ROZDZIA 2: SELEKTORY
Jeli tego wanie chcielimy, to tak powinnimy wanie napisa. Ale bardziej
prawdopodobne wydaje si, e chcielimy zamieni jeden obraz na inny. W takim
przypadku powinnimy zastosowa konkretn wasno:
body {background-image: url(i/body-bg.gif);}
Kolejno okrelania wartoci jest nastpujca: gra, prawa strona, d i lewa strona.
55
CZ I: PODSTAWY
Pierwsza deklaracja ustawia wasnoci wszystkich krawdzi, a druga zmienia tylko t jedn,
ktra nas interesuje. Co ciekawe, obie te deklaracje moemy zamieci w jednej regule.
Innym dobrym przykadem, kiedy trzeba wybirczo przesania niektre ustawienia
skrconego zapisu wasnoci, s style nagwkw, ktre czsto rni si midzy sob tylko
rozmiarem tekstu. Jeli odpowiadaj Ci domylne rozmiary przypisywane nagwkom,
wystarczy napisa regu podobn do poniszej:
h1, h2, h3, h4, h5, h6 {font-weight: normal;
font-style: italic;
font-family: Helvetica, sans-serif;
line-height: 1.5;}
Jeli jednak masz zamiar ustawi wasne rozmiary nagwkw, jak na rysunku 2.6, zastosuj
nastpujc technik:
h1, h2, h3, h4, h5, h6 {font: italic 100%/1.5 Helvetica, sans-serif;}
h1 {font-size: 225%;}
h2 {font-size: 185%;}
h3 {font-size: 140%;}
/* itd. */
56
ROZDZIA 2: SELEKTORY
Kiedy korzystasz z tej techniki, pamitaj, aby konkretne wasnoci byy zadeklarowane
za wasnoci w zapisie skrconym. Poniewa selektory bd miay tak sam precyzj,
zastosowane zostan te, ktre zostay zapisane jako ostatnie.
SELEKTOR UNIWERSALNY
Teraz nauczysz si stosowa znak gwiazdki jako selektor (*). Nie ekscytuj si jednak zbytnio,
bo nie jest on a tak uniwersalny, jak Ci si wydaje. Oto prosty przykad jego uycia:
* {color: blue;}
Nic atwiejszego:
div * {border: 1px solid red;}
No, moe prawie taki sam. Wizualnie nie ma rnicy (co wida na rysunku 2.7), ale jest
rnica, jeli chodzi o precyzj selektorw. Selektor uniwersalny do wartoci precyzji caego
selektora nie wnosi nic, tzn. ma precyzj 0,0,0,0. To znaczy, e selektor div * ma precyzj
0,0,0,1, a div h1 i wszystkie pozostae w tej grupie 0,0,0,2. Poza tym szczegem wszystko
pozostae jest w obu przypadkach takie same.
Jeli masz nadziej, e za pomoc gwiazdki moesz odwoa si do wszystkich nagwkw
naraz, stosujc zapis w rodzaju h*, zamiast wylicza h1, h2, h3, h4, h5, h6, to musz
Ci rozczarowa tak si nie da. Selektor uniwersalny mona stosowa do elementw tylko
wsposb pokazany powyej i w aden inny.
57
CZ I: PODSTAWY
IDENTYFIKATORY A KLASY
Jednym z pierwszych powanych dylematw, przed jakimi staje kady adept aspirujcy do
miana programisty CSS jest: uywa klas (atrybut class) czy identyfikatorw (atrybut id)?
58
Jak to zwykle w yciu bywa, na to pytanie istnieje jedna prosta odpowied i kilka
innych, bardziej skomplikowanych. Prosta wersja brzmi nastpujco: Uywaj klas do
oznaczania wszystkich elementw, ktre mog wystpi na stronie wicej ni jeden raz,
aidentyfikatorw do elementw, ktre mog wystpi tylko raz. Przez sowo oznacza
rozumiem uywanie wyrazw, ktre dobrze opisuj zastosowanie oznaczanych elementw.
Ten sposb wykorzystania klas i identyfikatorw stanowi 99,44% ich cakowitego uycia.
Typowymi, czsto spotykanymi przykadami identyfikatorw s header (nagwek)
ifooter (stopka), poniewa zakada si, e kady z tych elementw wystpuje na kadej
stronie tylko w jednym egzemplarzu. Nazwy klas s bardziej zrnicowane i mog to by
np. more (dooznaczenia odnonikw prowadzcych do dodatkowych informacji), tabs
(dooznaczania kart w nawigacji) czy odd (do oznaczania co drugiego wiersza w tabeli).
W wersji bardziej skomplikowanej musimy wzi pod uwag nie tylko to, czy nasza etykieta
ma by niepowtarzalna, czy nie, lecz rwnie wpyw, jaki nasza klasa lub identyfikator
wywrze na precyzj caego selektora. Poniewa selektory z identyfikatorami maj wysz
precyzj od tych z klasami, niewykluczone, e nie bdzie mona przesoni jakiej reguy.
Oto prosty przykad. Wyobramy sobie, e mamy w arkuszu ponisze dwie reguy:
#header {background: black;}
#header a {color: white;}
ROZDZIA 2: SELEKTORY
Niestety, cza nawigacyjne w nagwku pozostan biae, co bdzie efektem wysokiej
precyzji selektora #header a (rysunek 2.8).
Albo nawet:
#header .navlinks a, .navlinks a {color: #257000;}
Oba dziaaj, lecz aden z nich nie jest zbyt elegancki (ale i tak jest lepszy ni dodanie sowa
!important do reguy .navlinks a). Innym rozwizaniem tego problemu jest zamiana
identyfikatora nagwka na klas:
<div class="header">
59
CZ I: PODSTAWY
60
Innym argumentem jest to, e nigdy nie wiadomo, kiedy jaki element na stronie
przestanie by niepowtarzalny. Doskonaym przykadem jest tu nagwek, poniewa na
stronie nagwkw moe by kilka. Jeli uwaasz, e to dziwne, to pomyl np. o portalach
informacyjnych. Kada sekcja i kade pole w pasku bocznym moe mie wasny nagwek
i wasn stopk. Nadanie wszystkim tym elementom spjnych klas wydaje si bardzo
rozsdnym rozwizaniem.
Mona oczywicie si spiera, e to nie s prawdziwe nagwki strony tylko nagwki
prasowe czy co tam jeszcze innego. Jest to kwestia semantyki, ktrej nie da si atwo
rozstrzygn. To, co jedni nazywaj pierwszym wierszem, inni mog nazwa nagwkiem.
Chodzi mi tylko o to, e element, ktry kiedy oznaczylimy jako niepowtarzalny, ktrego
dnia moe okaza si nie tak unikatowy, jak si nam wydawao. Najlepszym sposobem na
zabezpieczenie si na wypadek wystpienia tego problemu jest uywanie tylko klas.
Czy w takim razie uywanie identyfikatorw ma w ogle sens? Istniej elementy na stronie,
co do ktrych moemy mie absolutn pewno, e zawsze pozostan niepowtarzalne w obrbie
jednej strony. Czasami zastosowanie identyfikatora moe by podyktowane wanie chci
wykorzystania jego zwikszonej precyzji w stosunku do innych identyfikatorw. Oprcz
tego identyfikatory mog odgrywa wan rol w skryptach, tworzeniu czy do wybranych
miejsc na stronie i innych technikach bdcych poza zakresem zastosowania CSS. Trzeba
tylko pamita, aby na nie uwaa.
Problem z precyzj selektorw z identyfikatorami mona rozwiza jeszcze w inny sposb,
ktry zosta opisany dalej, w podrozdziale Identyfikatory a selektor atrybutw.
ROZDZIA 2: SELEKTORY
Do kadego z tych elementw moemy si odwoa w arkuszu stylw tak, jak nam pasuje:
.panel {
border: 1px solid silver;
background: #EEE top left no-repeat;
color: #333;
font: x-small sans-serif;}
#weather {
background-image: url(/pix/panel-weather.jpg);}
#stocks {
background-image: url(/pix/panel-stocks.jpg);}
#latest {
background-image: url(/pix/panel-latest.jpg);}
61
CZ I: PODSTAWY
Nastpnie musimy odpowiednio zmieni selektory CSS, aby odwoyway si do klas zamiast
identyfikatorw:
.panel {
border: 1px solid silver;
background: #EEE top left no-repeat;
color: #333;
font: x-small sans-serif;}
.weather {
background-image: url(/pix/panel-weather.jpg);}
.stocks {
background-image: url(/pix/panel-stocks.jpg);}
.latest {
background-image: url(/pix/panel-latest.jpg);}
.panel.weather {font-weight: bold;}
.latest.panel {color: #511;}
Kolejno zapisu klas w atrybucie HTML nie ma znaczenia dla ich kolejnoci w arkuszu
stylw. Dlatego zapis .panel.weather jest rwnoznaczny z zapisem .weather.panel, jeli
chodzi o precyzj. Nie ma te znaczenia, czy midzy nimi w rdle HTML znajduj si
jeszcze jakie inne nazwy klas, np.:
62
SELEKTORY ATRYBUTW
Selektory atrybutw wprowadzono w CSS 2 i rozszerzono w CSS 3. Aktualnie s one
obsugiwane przez wszystkie najwaniejsze przegldarki (nie obsuguje ich przegldarka IE
6, wic jeli jest to dla Ciebie problem, wr do podrozdziau Skrypt IE9.js w rozdziale 1.).
Oglna zasada dziaania tego typu selektorw opiera si na posiadaniu przez elementy
okrelonych atrybutw lub okrelonych cech wartoci atrybutw. Przy ich uyciu mona np.
odwoa si do wszystkich elementw a, ktre s czami:
a[href]
ROZDZIA 2: SELEKTORY
Powyszy selektor wybiera wszystkie elementy a majce atrybut href, a pomija takie,
ktre tego atrybutu nie maj, czyli najczciej nazwane kotwice (np. <a name="top">).
Wpewnym sensie selektor ten jest zwilejsz wersj selektorw a:link i a:visited, np.:
a[href] {color: green;}
63
CZ I: PODSTAWY
Technika ta nie jest moe najprzydatniejsza w przypadku hiperczy, ale mona j np.
wykorzysta do wybierania rnych obrazw w celu zdefiniowania stylu np. logo firmy.
Jeli korzystasz z systemu zarzdzania treci, ktry wstawia logo w grnej czci strony
zapomoc nastpujcego elementu img:
<img src="/img/2010/mainlogo.png" alt="ConHugeCo Inc." />
Nie trzeba dodawa adnych klas ani identyfikatorw wystarczy wykorzystanie jako
punktu zaczepienia wartoci atrybutu elementu, oczywicie przy zaoeniu, e warto ta
zawsze bdzie taka sama (jeli interesuje Ci mniej dokadne dopasowywanie wartoci,
zobacz dalej podrozdzia Selektory wyboru podacuchw w atrybutach).
Jeszcze jedn rzecz wart uwagi jest nastpujcy zapis w specyfikacji CSS: to, czy w nazwach
i wartociach atrybutw s rozrniane wielkie i mae litery, zaley od jzyka dokumentu
(www.w3.org/TR/CSS2/selector.html#matching-attrs). To znaczy, e w niektrych jzykach
znacznikw wielko liter w nazwach atrybutw ma znaczenie, a w innych nie. W jzyku
XHTML wielko liter ma znaczenie i oglnie lepiej jest przyj zaoenie, e tak samo jest
we wszystkich innych jzykach.
64
Zauwaye tyld znajdujc si w tym kodzie przed znakiem rwnoci? W tym przypadku
jest ona bezwzgldnie potrzebna, poniewa oznacza, e ten selektor wybiera podane sowo
zlisty sw oddzielanych spacjami. Taki may zawijas, a taki wany!
Aby nie byo wtpliwoci, zobaczmy, co si stanie, jeli tyld usuniemy. Nasz selektor
wygldaby wwczas nastpujco:
div[class="panel"]
Selektor ten wybiera wszystkie elementy div z atrybutem class o wartoci panel licz
si tylko takie, ktre maj warto dokadnie panel. Jeli w atrybucie class byoby wpisane
panel weather, to selektor bez tyldy nie zadziaa, poniewa panel to nie jest dokadnie
tosamo co panel weather. Natomiast selektor div.panel wybierze element
<div class="panel weather"> bez problemu.
ROZDZIA 2: SELEKTORY
Dodanie tyldy sprawia, e selektor zachowuje si dokadnie tak, jak w przypadku skadni
z uyciem kropki. W zwizku z tym dwa ponisze selektory s identyczne pod kadym
wzgldem oprcz liter, z ktrych si skadaj:
div[class~="panel"]
div.panel
Teraz pewnie sobie mylisz: wietnie, zawsze chciaem pozna dug i zawi skadni
selektora do wybierania klas. Dlatego zaznaczam, e selektory atrybutw nie su tylko do
wyboru elementw na podstawie wartoci ich atrybutw id i class. Przedstawionej notacji
mona uywa w stosunku do wszystkich atrybutw dopuszczajcych w wartociach listy
wyrazw oddzielanych spacjami (przez wyraz rozumiem tu cig znakw).
Oto kilka innych przykadw uycia tego rodzaju selektora:
img[alt~="figura"]
table[summary~="data"]
*[title~="2009"]
Wszystko w porzdku, ale spjrzmy na wynik zastosowania kadej z tych dwch regu.
Akapit o identyfikatorze lead-in bdzie mia tekst pogrubiony i jednoczenie pochylony
(rysunek 2.12).
Jest to spowodowane tym, e selektor atrybutw ma precyzj 0,0,1,0 tak sam jak klasy
i pseudoklasy. W zwizku z tym precyzja pierwszej reguy wynosi 0,1,0,1, a drugiej 0,0,1,1.
T bitw o zastosowanie wasnoci font-weight wygrywa pierwsza regua, ktra jest
precyzyjniejsza.
Jest to jedna z zawioci precyzji selektorw, ktra moe spowodowa powstanie
cakiem nowych rodzajw formatowania. Moe pamitasz z jednego z wczeniejszych
podrozdziaw, e identyfikatory maj wysz precyzj od klas i mog je przesania,
z ktrego to powodu czasami moe by korzystniejsze uywanie tylko klas. Jeli grupa
docelowa Twojego serwisu skada si wycznie z internautw uywajcych przegldarek
obsugujcych selektory atrybutw, moesz bez przeszkd stosowa atrybuty class i id,
do tych drugich odwoujc si tylko za pomoc selektora atrybutw. W ten sposb pozbdziesz
si problemu zwizanego z tym, e selektor #ID przesania wszystkie inne selektory.
65
CZ I: PODSTAWY
66
SELEKTOR PODACUCHW
WARTOCIATRYBUTW
Gdy zakoczono prace nad specyfikacj CSS 2, natychmiast rozpoczto prace nad kolejn
wersj technologii, ktr moemy nazywa CSS 3, chocia nie ma ona ju formy pojedynczej
specyfikacji (mona by dugo o tym opowiada). Jednym z obszarw, ktrym powicono
najwicej uwagi, byy selektory, a wic te i selektory atrybutw. Zdefiniowano niezwykle
przydatny w codziennej pracy zestaw wzorcw dopasowujcych podacuchy.
Najprostszy z nich dopasowuje podacuchy w zwyky sposb. Aby lepiej zrozumie istot
jego dziaania, spjrzmy na poniszy stary przykad:
a[href="http://w3.org/"]
Ten selektor jest doskonay, jeli chcemy odwoa si do odnonika prowadzcego pod
konkretny adres URL. Wyobramy sobie jednak, e na swojej stronie mamy du liczb
odnonikw do rnych stron witryny W3C i wszystkie chcemy sformatowa w taki sam
sposb. Najlepiej by byo, gdybymy mogli dokona wyboru odnonikw na podstawie
czci w3.org adresu (rysunek 2.13). Oto sposb realizacji tego zadania:
a[href*="w3.org"] {font-weight: bold;}
ROZDZIA 2: SELEKTORY
Rysunek 2.13. Wybr wszystkich czy, ktre w adresie URL zawieraj podacuch w3.org
Do uzyskania danego efektu wystarczya nam tylko gwiazdka przed znakiem
rwnoci. Nie naley jednak myli jej w tym zastosowaniu z selektorem uniwersalnym
ani symbolem wieloznacznym z Uniksa czy narzdzia grep. Umieszczenie jej przed
znakiem rwnoci oznacza tylko, e ten cig znakw musi wystpowa w ktrym
miejscu w wartoci atrybutu.
Technik t mona oczywicie stosowa w odniesieniu do kadego elementu i atrybutu.
Wracajc do przykadu wyboru logo firmy, moglibymy napisa taki selektor:
img[src*="mainlogo.png"]
Ten selektor wybierze wszystkie elementy img wskazujce obraz o nazwie mainlogo.png
lub majcy cig znakw mainlogo.png gdziekolwiek w wartoci atrybutu src. W zwizku
z tym wybraby oba ponisze elementy:
<img src="/img/2010/mainlogo.png.gif" alt="ConHugeCo Inc." />
<img src="/img/2010/mainlogo.pngdir/big.png" alt="ConHugeCo Inc." />
Pamitaj, aby wartoci atrybutw zawsze traktowa tak, jakby wielko liter miaa w nich
znaczenie (tak jest po prostu atwiej). Wwczas dwa pierwsze elementy przedstawione
poniej zostan dopasowane, a trzeci nie.
67
CZ I: PODSTAWY
img[alt*="Figure"] {border: 1px solid gray;}
<img src="fig1.gif" alt="Rysunek 1. Modrzew." />
<img src="fig2.gif" alt="Rysunek 2. Prezydent Kowalski, bardzo wany polityk." />
<img src="digg.gif" alt="Kilku mczyzn zastanawiajcych si, co przedstawia
rysunek." />
Ostatni obraz nie zostanie sformatowany, poniewa rysunek i Rysunek to dwa rne sowa.
W tym przypadku rozrnienie to wydaje si przydatne, poniewa (biorc pod uwag
zawarto atrybutu alt) trzeci obraz nie jest rysunkiem w formalnym sensie. Tak si tylko
zoyo, e jego atrybut alt zawiera to sowo. Nie znaczy to jednak, e nie musimy uwaa,
bo poniszy element rwnie zostaby sformatowany przez nasz regu:
<img src="lost.gif" alt="Techniki kryminalistyczne. Rysunek linii papilarnych." />
68
Ten selektor wybierze wszystkie wystpienia podanego cigu znakw, a wic zarwno
rysunek, jak i Rysunek, a take wszelkie inne acuchy znakw, w ktrych pojawi si podany
podacuch.
To jeszcze nie wszystko na temat wyboru podacuchw. Czytaj dalej, aby dowiedzie si
szczegw.
SELEKTOR PODACUCHW
WARTOCIATRYBUTW CIG DALSZY
Podczas gdy moliwo wyboru podacucha w dowolnym miejscu wartoci atrybutu
bardzo si przydaje (zobacz poprzedni podrozdzia), czasami wolelibymy ograniczy
zakres poszukiwania tylko do pocztku lub koca wartoci atrybutu. Da si to zrobi.
Jeli chcesz dokona wyboru podacucha na pocztku wartoci atrybutu,
uyjnastpujcego wzorca:
a[href^="http"]
Dziki daszkowi (^) powyszy selektor sformatuje wszystkie elementy a, ktrych atrybut
href ma warto zaczynajc si od cigu znakw http. W ten sposb mona atwo wybra
wszystkie cza do zewntrznych stron, jeli przyj, e wszystkie cza wewntrzne s
reprezentowane przez adresy wzgldne i e adnemu folderowi w swoim systemie plikw
nienadalimy nazwy http. Oto przykadowa prosta regua z uyciem opisywanego selektora:
a[href^="http"] {font-weight: bold;}
ROZDZIA 2: SELEKTORY
A poniej mamy co nieco bardziej skomplikowanego:
a[href^="http"] {padding-right: 18px;
background: url(/pix/external.png) 100% 50% no-repeat;}
Znak dolara ($) powoduje, e selektor wybierze wszystkie elementy a, ktrych atrybut href
koczy si podacuchem .pdf. W ten sposb mona bardzo atwo oznaczy wszystkie
odnoniki prowadzce do plikw PDF (jak na rysunku 2.15). Na przykad:
a[href$=".pdf"] {padding-right: 18px;
background: url(/pix/pdf.png) 100% 50% no-repeat;}
69
CZ I: PODSTAWY
Znakomicie! Oto kilka innych pomysw na wykorzystanie selektorw atrybutw
doformatowania czy:
a[href^="https"]
cza szyfrowane
a[href^="mailto"]
a[href^="aim"]
a[href$=".doc"]
a[href$=".xls"]
a[href$=".zip"]
archiwa ZIP
Teraz wybieramy tylko te elementy img, ktrych atrybut alt ma warto zaczynajc si
od acucha Rysunek, i nie przejmujemy si tym, e wyraz ten moe wystpi take gdzie
dalej w tekcie. Te bd przez nasz selektor pomijane.
70
SELEKTORY DZIECI
Jednym z najczstszych sposobw, w jakie odwoujemy si do elementw HTML za pomoc
CSS, jest wykorzystanie ich miejsca w hierarchii dokumentu. Do tego celu zwykle
wykorzystujemy selektor potomkw, np.:
div#header a {color: #DEFACE;}
Powysza regua sformatuje wszystkie elementy a bdce potomkami kadego elementu div
o identyfikatorze header.
Bardzo czsto wanie takiego selektora nam potrzeba chcemy wybra wszystkie cza
znajdujce si w nagwku bez wzgldu na to, w ktrym konkretnie jego miejscu si
znajduj i czy co jest jeszcze przed nimi.
Czasami jednak potrzebny jest dostp do elementu bdcego bezporednim potomkiem
(dzieckiem) innego elementu. Wyobramy sobie, e chcemy wybra elementy listy bdce
dziemi (nie potomkami) elementu ol (rysunek 2.16). Jeli w tej uporzdkowanej licie
znajdowayby si jakie listy nieuporzdkowane, ich elementy nie zostayby wzite pod
uwag. Do tego potrzebny jest selektor dzieci.
ol > li {list-style-type: upper-alpha;}
ROZDZIA 2: SELEKTORY
71
CZ I: PODSTAWY
CZCIOWA IMITACJA
SELEKTORA ELEMENTW DZIECI
Jeli Twoja strona musi by zgodna ze starszymi przegldarkami, takimi jak IE 6, ktre nie
obsuguj kombinatora wyboru elementw dzieci, a nie chcesz rozwiza tego problemu
przy uyciu JavaScriptu (zobacz podrozdzia Skrypt IE9.js w rozdziale 1.), to moesz
posuy si selektorem uniwersalnym.
Zamy, e chcemy otoczy obramowaniem kady element div bdcy dzieckiem elementu
div o identyfikatorze main (rysunek 2.18). Przy uyciu normalnego selektora dzieci
napisalibymy co takiego:
div#main > div {border: 1px solid gray;}
72
Rysunek 2.18. Podrbka selektora dzieci
Jak wic robi si imitacj tego efektu? Tak:
div#main div {border: 1px solid gray;}
div#main * div {border: 0;}
Druga z tych regu wybiera wszystkie elementy div bdce potomkami dowolnego
elementu bdcego potomkiem elementu div o identyfikatorze main. W istocie cofa ona
efekt pierwszej reguy. Obie te reguy dotycz elementw div bdcych najwyej wnukami
elementu div#main i obie ustawiaj waciwoci obramowania, a wic s w konflikcie.
Poniewa maj tak sam precyzj, ostatecznie zostanie zastosowana druga z nich. Jednake
elementy div znajdujce si w elemencie div#main s wybierane tylko przez pierwsz regu,
a wic te bd miay obramowanie.
Trzeba jednak pamita o jednej wanej rzeczy ta technika dobrze dziaa tylko
zwasnociami niedziedzicznymi. Jeli uyjemy jej do wasnoci dziedzicznych,
moemyotrzyma niezamierzone efekty. Wemy np. ponisze dwie reguy:
ol li {font-weight: bold;}
ol * li {font-weight: normal;}
ROZDZIA 2: SELEKTORY
Teraz zamy, e chcemy, aby tekst list nieuporzdkowanych, znajdujcych si w listach
uporzdkowanych przypisanych do pewnej klasy, by pogrubiony (rysunek 2.19):
ol.urgent ul {font-weight: bold;}
background, border, display, margin, padding itd. Jeli nie wiesz, ktre wasnoci s
73
CZ I: PODSTAWY
Oczywistym przykadem elementw siostrzanych s elementy nalece do tej samej listy,
ale relacja ta czy wszystkie rodzaje elementw, ktre maj wsplnego rodzica.
W CSS istnieje kombinator pozwalajcy dokona wyboru elementu w zalenoci od tego,
jaki jest jego poprzedni element siostrzany. Gdybymy np. chcieli usun grny margines ze
wszystkich elementw p znajdujcych si bezporednio pod nagwkiem h1 (rysunek 2.21),
to wystarczyoby napisa tak regu:
h2 {margin-bottom: 0;}
h2 + p {margin-top: 0;}
74
Rysunek 2.21. Wybr akapitw znajdujcych si bezporednio za nagwkami drugiego stopnia
Selektory elementw siostrzanych umoliwiaj formatowanie elementw wystpujcych
wpewnych specyficznych kombinacjach. Przy ich uyciu mona np. zwikszy odstp
midzy list a wystpujc bezporednio przed ni tabel albo midzy nagwkiem
aelementem div wystpujcym bezporednio po nim.
Dostpny jest te drugi tego samego rodzaju kombinator, sucy do wybierania elementu
siostrzanego, znajdujcego si za wybranym elementem, ale nie bezporednio do niego
przylegajcego. Ma on posta tyldy:
h1 ~ ul {list-style-type: lower-alpha;}
ROZDZIA 2: SELEKTORY
<h2>Wstp</h2>
<p>Mamy kilka przemyle na ten temat.</p>
<ul></ul>
</body>
GENEROWANIE TRECI
Ruchem, ktry zatar nieco wyran granic midzy warstw treci a warstw prezentacji,
byo dodanie do CSS moliwoci generowania treci i wstawiania jej do dokumentw.
Su do tego pseudoelementy :before i :after oraz wasno content.
Oto prosty przykad (zilustrowany na rysunku 2.22) zastosowania tych technik w celu
umieszczenia krtkiego tekstu przed treci kadego elementu listy:
li:before {content: "Punkt: "; border-bottom: 1px solid gray;}
75
CZ I: PODSTAWY
76
ROZDZIA 2: SELEKTORY
Tre generowana daje spore pole do popisu, ale trzeba uwaa na to, co si generuje. Co si
stanie ze stron, jeli arkusze CSS nie zostan wczytane albo nie s w ogle obsugiwane
(dotyczy to niektrych urzdze przenonych)? Jeli w postaci treci generowanej
wstawiasz tekst o kluczowym znaczeniu dla zrozumienia zawartoci strony, to w przypadku
wystpienia problemw z CSS moesz mie powane kopoty. Dlatego zaleca si, aby treci
generowanej uywa wycznie w ramach technik zwanych stopniowym ulepszaniem (ang.
progressive enhancement), polegajcych na dodawaniu zaawansowanych funkcji w postaci
rozszerze, ktre nie s niezbdne do funkcjonowania strony.
wietnym przykadem zastosowania techniki stopniowego ulepszania jest wstawianie
hiperczy do wersji stron przeznaczonych do druku (rysunek 2.25). W tym celu naley
doda do swojego arkusza stylw przeznaczonego dla druku nastpujc regu:
a[href]:after {content: " [" attr(href) "]"; font-size: smaller;}
77
II
CZ
II
NIEZBDNIK
Rozdzia 3. Porady
Rozdzia 4. Ukady
Rozdzia 5. Efekty
3
ROZDZIA
PODRCZNIK CSS
PORADY
CZ II: NIEZBDNIK
82
ROZDZIA 3: PORADY
Chodzi o to, e obie te wartoci musz by podane w takiej, a nie innej kolejnoci najpierw
rozmiar, potem rodzina. Jeli zmienisz ich kolejno albo pominiesz ktr z nich, kada
nowoczesna przegldarka z mety tak deklaracj zignoruje.
Ponadto, jeli chcesz uy jeszcze innych sw kluczowych w deklaracji, musisz je (oprcz
jednego, ktre jest tematem nastpnego podrozdziau) wpisa przed tymi, ktre s wymagane:
font: bold italic 100% sans-serif;
font: italic small-caps 125% Georgia, serif;
font: italic bold small-caps 200% Helvetica, Arial, sans-serif;
WYSOKO LINII
Jeli opisane wczeniej zasady dotyczce stosowania wasnoci font wydaway Ci si dziwne,
to to, co zobaczysz teraz, jest czystym wariactwem.
Wczeniej napisaem, e minimalna warto wasnoci font skada si z dwch wartoci
wcile okrelonej kolejnoci rozmiar i rodzina. To prawda, ale okazuje si, e do wartoci
rozmiaru mona doczepi warto wysokoci linii (wasnoci line-height rysunek 3.2):
font: 100%/2.5 Helvetica, sans-serif;
83
CZ II: NIEZBDNIK
84
BEZJEDNOSTKOWE WARTOCI
WASNOCILINE-HEIGHT
Wasnoci line-height mona przypisywa wartoci bez jednostki. Nie jest zabronione
rwnie stosowanie jednostek, ale oglnie rzecz biorc, jest to niezalecane.
Jaka jest rnica? Jeli zdefiniujemy warto z jednostk, np. 1em lub 100%, zostanie ona
poobliczeniu przekazana elementom potomnym. Zamy np., e zastosowalimy
poniszy arkusz CSS do dokumentu zawierajcego nastpujcy urywek kodu HTML:
ul {font-size: 15px; line-height: 1em;}
li {font-size: 10px;}
small {font-size: 80%;}
<ul>
<li>Jestem list z <small>maym tekstem</small>.</li>
</ul>
ROZDZIA 3: PORADY
Po obliczeniu wasno line-height elementu ul bdzie miaa warto 15px, poniewa
wartoci wasnoci line-height wyraone za pomoc jednostek em (i procentw) s obliczane
na podstawie obliczonej wartoci wasnoci font-size elementu. Warto wasnoci font-size
zadeklarowaem bezporednio, wic wiemy, e jest wyraona w pikselach.
Teraz najciekawsze do elementw potomnych zostanie przekazana obliczona warto
15px. Innymi sowy, elementy li i small odziedzicz warto 15px. Koniec. Nie zmieni
jej, gdy zmieni si ich wasny rozmiar pisma. Po prostu bior te 15px i uywaj ich, co jest
rwnoznaczne z sytuacj, w ktrej bymy napisali:
ul {font-size: 15px; line-height: 1em;}
li {font-size: 10px; line-height: 15px;}
small {font-size: 80%; line-height: 15px;}
Teraz elementom potomnym (li i small) przekazywana jest sama liczba, ktr wykorzystuj
one jako wspczynnik skali mnonik, jeli wolisz a nie jako obliczony wynik.
Kady element, ktry odziedziczy t warto 1, pomnoy j przez obliczon warto
wasnoci font-size. Element listy, ktry ma deklaracj font-size: 10px, bdzie mia
obliczon warto line-height: 10px. Nastpnie przekae t jedynk do elementu small,
ktry pomnoy j przez swoj obliczon warto font-size. To da w wyniku osiem pikseli,
a wic wysoko linii wyniesie rwnie osiem pikseli.
Ostateczny wynik bdzie rwnowany z poniszym:
ul {font-size: 15px; line-height: 1;}
li {font-size: 10px; line-height: 10px;}
small {font-size: 80%; line-height: 8px;}
To dua rnica (rysunek 3.3). Dlatego wanie zaleca si, aby wasnoci line-height, ktra
ma zosta zastosowana na rzecz elementw typu html lub body (i wszystkich innych, ktre
mog mie potomkw), nadawa wartoci bez jednostek.
Rysunek 3.3. Rnica midzy wartociami wasnoci line-height z jednostk i bez jednostki
85
CZ II: NIEZBDNIK
wietnie, tylko e formularze nie zostan objte adnym obramowaniem. Powd jest
prosty pominlimy warto wasnoci border-style, przez co zostaa uyta jej warto
domylna. Co to za warto? Ta warto to none. W zwizku z tym powysza regua jest
rwnowana poniszej:
form {border: 2px gray none;}
86
Nic nadzwyczajnego, prawda? Ale spjrz, jak ta regua zostanie zinterpretowana w rnych
przegldarkach (rysunek 3.4).
ROZDZIA 3: PORADY
To nie jest bd i adna z tych przegldarek nie interpretuje zdefiniowanych wasnoci
le. Po prostu w specyfikacji CSS nie okrelono jednoznacznie, jak przegldarki maj
modyfikowa kolory w celu uzyskania iluzji wklsoci bd wypukoci obramowania.
Oto, co jest w niej napisane:
Kolor obramowania w stylu groove, ridge, inset i outset zaley od
wasnoci koloru obramowania elementu, ale aplikacje klienckie mog
rzeczywiste kolory oblicza przy uyciu dowolnego algorytmu
(www.w3.org/TR/CSS21/box.html#border-style-properties).
Zwr szczegln uwag na drug cz tej wypowiedzi: aplikacje klienckie mog rzeczywiste
kolory oblicza przy uyciu dowolnego algorytmu. W wiecie przegldarek od zawsze jest
tak, e jeli zezwoli si na wybr rnych opcji, to kada przegldarka wybierze inn. I tak
jest te w tym przypadku.
Moe nie przeszkadzaj Ci te rnice w interpretacji stylu obramowania i w porzdku.
Moim zadaniem nie jest ferowanie wyrokw. Jeli jednak wolisz, aby obramowanie w kadej
przegldarce wygldao tak samo (jak na rysunku 3.5), musisz zadeklarowa zwyke
obramowanie i wasnorcznie ustawi kolory:
#innie {border-color: #800 #F88 #F88 #800;}
#outie {border-color: #F88 #800 #800 #F88;}
87
CZ II: NIEZBDNIK
To oczywicie dotyczy tylko stylw inset i outset obramowania. Aby utworzy jednolite
kolory dla groove i ridge (rysunek 3.6), trzeba te elementy umieci w kontenerach (albo
wstawi kontenery do elementw), obramowanie kadego z nich ustawi na normalne
(solid) i zastosowa kolory, ktre utworz dany efekt, np.:
#innie {border-color: #800 #F88 #F88 #800;}
form {border: 3px solid; border-color: #F88 #800 #800 #F88;}
<form>
<div class="wrap">
(tre, elementy formularza itp.)
</div>
</form>
88
Ta regua sprawi, e na stronie nie zostanie wywietlony aden element przypisany do klasy
hide. Oznacza to, e elementy te nie wygeneruj w ukadzie strony adnego pola, ktre
by zajmoway, a wic nie bd miay adnego wpywu na ukad. To tak, jakby elementy te
wogle nie istniay, s jak nieuchwytny ninja.
Z uywaniem wasnoci display: none wi si jednak potencjalne problemy. Jeden z nich
jest tylko potencjalny, ale drugi wystpuje zawsze. Potencjalny problem polega na tym,
e jeli za pomoc JavaScriptu ustawimy warto wasnoci display elementu na none,
tonie wiadomo, jak j pniej przywrci. To jest trudniejsze, ni si wydaje. Zamy,
enapisalimy poniszy kod:
var obj = document.getElementById('linker');
obj.style.display = 'none';
ROZDZIA 3: PORADY
Jeli pniej zechcemy ten element przywrci do widoku za pomoc JS, to jakiej wartoci
uyjemy? To oczywicie zaley od elementu, o ktry nam chodzi. Jeli bdzie to span,
tonadalibymy mu warto inline, gdyby to by p to warto block. A moe nie,
przecie elementy span mona zamienia na blokowe, a elementy div na rdliniowe.
Istnieje jedno bardzo dobre rozwizanie tego problemu nie przypisywa adnej wartoci:
obj.style.display = ;
Dziki temu element zostanie przywrcony do odpowiedniej wartoci display, jaka bdzie
potrzebna w dalszej czci arkusza lub w arkuszach wbudowanych przegldarki.
Innym czsto stosowanym rozwizaniem jest nieustawianie wasnoci display
bezporednio, lecz przypisanie elementu do jakiej klasy, np. hide. Aby go wywietli,
wystarczy pniej tylko usun t klas. To rozwizanie jest o tyle bardziej skomplikowane,
e wymaga napisania (albo znalezienia w wyszukiwarce Google) skryptu JavaScript
usuwajcego i dodajcego wartoci atrybutu class, niemniej jednak jest ono bardzo dobre.
Drugi problem, ktry wystpuje zawsze, jest zwizany z tym, e jak na razie elementy
zwasnoci display ustawion na none s niewidoczne dla technologii pomocniczych,
takich jak np. czytniki ekranu. Poniewa elementu nie wida na ekranie, czytnik go nie
zobaczy i o to zazwyczaj chodzi, ale nie zawsze.
Wyobra sobie, e wstawiasz na stron specjalne odnoniki pozwalajce przej bezporednio
do gwnej treci strony. Chcesz, aby cza te suyy osobom korzystajcym z czytnikw
ekranu, pozwalajc im przeskoczy szybko do odpowiedniego miejsca w dokumencie, ale
nie chcesz, aby byy wywietlane na ekranie, bo osobom przegldajcym stron wzrokowo
s niepotrzebne. Jeli dla kontenera tych odnonikw zdefiniujemy wasno display:
none, to znajd si one poza zasigiem wszystkich uytkownikw, zarwno widomych,
jakiniewidomych. Osoby, ktre ich potrzebuj, nie usysz nic o ich istnieniu.
Analogicznie jest z menu rozwijanymi (bez obsugi zdarze myszy) ukrytymi przed
widomymi uytkownikami jeli ustawimy im wasno display: none, to take
czytniki ekranu ich nie znajd.
89
CZ II: NIEZBDNIK
90
Co dobrego oprcz zajmowania wolnego miejsca moe nam przyj z uycia niewidocznego
elementu? Nie ma z nim kontaktu za pomoc myszy, nie da si do niego dosta przy uyciu
klawiatury i nie wida go. Czemu w takim razie ma to suy?
Rozwizanie to wietnie nadaje si do formatowania elementw pozycjonowanych
bezwzgldnie, ktre i tak nie bior udziau w normalnym ukadzie elementw na stronie
(le na wierzchu i nie s uwzgldniane przy rozmieszczaniu pozostaych elementw).
Mona wic wcza i wycza ich widoczno bez zmieniania ukadu strony. Dodatkowo
mona je ukrywa i wywietla z powrotem bez koniecznoci zabawiania si z wasnoci
display, co pozwala unikn problemw opisanych w poprzednim podrozdziale.
Niestety, problemy z dostpnoci pozostaj te same elementy z wasnoci visibility:
hidden s cakowicie ignorowane przez prawie wszystkie czytniki ekranu. Take menu
rozwijane ukryte t technik pozostaj dla nich niewidoczne.
Dziki tej regule trzeci akapit (ten, ktry powodowa wystpienie pustego miejsca
narysunku 3.7) zostanie jakby usunity ze strony, co wida na rysunku 3.8.
ROZDZIA 3: PORADY
Przy zastosowaniu tej metody nie trzeba przywraca wartoci wasnoci top i left,
poniewa w pozycjonowaniu statycznym s one i tak ignorowane. Czy je zmienisz, czy nie,
to i tak nie bdzie miao adnego znaczenia.
91
CZ II: NIEZBDNIK
Jest jeszcze trzecia moliwo, ktra wchodzi w gr wwczas, gdy chcemy przywrci
element do ukadu i musi on odgrywa rol blokowego kontenera dla elementw, ktre
zawiera. Sytuacja taka ma miejsce np. wwczas, gdy chcemy pozycjonowa bezwzgldnie
elementy znajdujce si w przywracanym elemencie. W takim przypadku element ten
mona pozycjonowa wzgldnie, ale trzeba zadeklarowa wartoci przesunicia.
.show {position: relative; top: 0; left: 0;}
Gdybymy nie podali ustawie top: 0; i left: 0;, to element zostaby przesunity
wzgldem swojego normalnego pooenia w ukadzie normalnym. To spowodowaoby
powstanie luki w miejscu, w ktrym by by, gdyby nie zosta przesunity o te 10000 em.
Oczywicie przesunicie nie musi wynosi 10000 em. Moe to by dowolna warto, nie
wiksza od 65 535 w nielicznych starszych przegldarkach lub 16777271 w Safari 3 albo
2147483647 w pozostaych. Ponadto mona uy dowolnej jednostki dostpnej w CSS,
a wic np. pikseli, cycerw czy cali. Oglnie rzecz biorc, chodzi o to, aby uy bardzo
duej wartoci, by mie pewno, e element nie pojawi si na stronie, jeli go celowo
nieprzywoamy z powrotem.
Jedn z najstarszych technik projektowych stosowanych przy uyciu CSS jest tzw.
zastpowanie tekstu (ang. image replacement IR). Jest to w istocie zbir technik
polegajcych na uyciu obrazw w miejscu, w ktrym powinien znajdowa si tekst, tak
aby napisany na grafice tekst by widoczny, dostpny w druku itd. Techniki te stosuje si
najczciej do zastpowania krtkich porcji tekstu, takich jak np. logo firmowe, nagwki
stron (rysunek 3.9) itp. Nie nadaj si one natomiast do zastpowania caych akapitw.
ROZDZIA 3: PORADY
Najpopularniejsza (tak popularna, e niektrzy robili sobie koszulki ze zwizanymi z ni
napisami) technika IR znana jest pod dwiema nazwami: Phark i Rundle Method. Jej zasada
jest prosta i polega na zwyczajnym przesuniciu tekstu w lewo za pomoc ujemnego wcicia,
jak najdalej si da.
h1 {height: 140px; text-indent: -9999px;
background: url(page-header.gif);}
Jest to wic metoda bardzo podobna do sztuczki z ukrywaniem poza ekranem caych
elementw przy uyciu pozycjonowania bezwzgldnego. W tym przypadku jednak poza
ekran usuwamy tylko zawarto tekstow elementu, pola samego elementu nie ruszajc.
W druku to elementw jest domylnie nieuwzgldniane. Mimo i istnieje moliwo
zmiany tego, to jednak bardzo rzadko si z niej korzysta. W zwizku z tym w arkuszu stylw
do druku (szczegy na ten temat znajdziesz w kolejnym podrozdziale) mona po prostu
napisa tak:
h1 {text-indent: 0; background: none;}
93
CZ II: NIEZBDNIK
Istnieje kilkanacie rozmaitych technik zastpowania tekstu, z ktrych kada rozwizuje
problem w inny sposb. Niektre polegaj na umieszczeniu treci elementu w elemencie
span i wyczeniu jego wywietlania bd wyrzuceniu go poza ekran. Inne natomiast
polegaj na dodaniu obrazu jako treci odzwierciedlajcej obraz w tle.
Warto take wspomnie o jeszcze jednej bardzo prostej technice zastpowania tekstu,
ktr jest po prostu wstawienie obrazu w treci. Na przykad:
<h1><img src="page-header.gif" alt="Dive Into Fishing"></h1>
Ten obraz bdzie widoczny zarwno na ekranie, jak i na wydruku, poniewa przegldarki
drukuj obrazy znajdujce si w treci stron. Ponadto technika ta jest bardzo przyjazna
dla czytnikw ekranu, ktre wiedz, e w przypadku napotkania obrazu naley przeczyta
zawarto ich atrybutu alt. Oczywicie, jeli uytkownik wyczy wywietlanie obrazw,
to nic z tego nie bdzie. Jeli jednak obraz nie zostanie wczytany z jakiego innego powodu,
to zamiast niego zostanie wywietlony przynajmniej tekst zastpczy z atrybutu alt.
Jeli nie tworzysz stylw dla druku w swojej witrynie, to moe nadszed czas, aby to jeszcze
raz przemyle. Nawet jeli chcesz, aby Twoje strony po wydrukowaniu wyglday tak samo
jak na ekranie, moesz skorzysta z okazji i zoptymalizowa kontrast kolorw (najpewniej
odcieni szaroci), pamitajc, e nie bdzie koloru ani obrazw ta.
To nic trudnego. Arkusz stylw dla druku moemy doczy do strony na jeden z trzech
sposobw:
<style type="text/css" media="print"></style>
<link type="text/css" rel="stylesheet" media="print" href="print.css">
@import url(print.css) print;
ROZDZIA 3: PORADY
Mona to zrobi ruchem zamaszystym:
* {background: transparent; color: black;}
Mimo i nie jest to nigdzie bezporednio napisane, oba te arkusze maj zastosowanie do
wszystkich typw mediw. Innymi sowy, powyszy zapis jest rwnoznaczny z dodaniem
atrybutu media="all".
<link type="text/css" rel="stylesheet" href="basic.css" media="all">
<link type="text/css" rel="stylesheet" href="theme.css" media="all">
Czy na pewno chcesz, aby te wszystkie style zostay zastosowane w druku? Jeli nie,
towarto all lepiej zmieni na screen.
<link type="text/css" rel="stylesheet" href="basic.css" media="screen">
<link type="text/css" rel="stylesheet" href="theme.css" media="screen">
Mamy ju obsuon domyln sytuacj. Teraz musimy jeszcze doda arkusz stylw
dladruku:
<link type="text/css" rel="stylesheet" href="basic.css" media="screen">
<link type="text/css" rel="stylesheet" href="theme.css" media="screen">
<link type="text/css" rel="stylesheet" href="print.css" media="print">
95
CZ II: NIEZBDNIK
(rysunek 3.11). Ja np. uywam typu medium tty, poniewa jest chyba najmniej podobne
do ekranu zewszystkich moliwych, a ponadto ma krtk nazw. Oto przykad:
<link type="text/css" rel="stylesheet" href="basic.css" media="tty">
<link type="text/css" rel="stylesheet" href="theme.css" media="tty">
<link type="text/css" rel="stylesheet" href="print.css" media="screen">
96
CZA BLOKOWE
Podstawow technik pozwalajc uzyska wiele ciekawych opcji ukadu elementw
nastronie przy niewielkim nakadzie kodu rdowego s zabawy z wasnoci display.
Dokerem w tym rozdaniu jest moliwo zamiany czy, ktre s rdliniowe, na elementy
blokowe.
Aby zrozumie, dlaczego tak jest, wyobra sobie list odnonikw w pasku bocznym strony.
Najczciej umieszcza si je na licie nienumerowanej, w ktrej kade cze zawiera si
wjednym elemencie tej listy. Porwnajmy wic dwie identyczne listy czy. Jedyna rnica
ROZDZIA 3: PORADY
midzy nimi bdzie polegaa na tym, e jedna bdzie utworzona na bazie odnonikw
blokowych, a druga nie (rysunek 3.12). Specjalnie oznaczyem kolorem to odnonikw,
aby pokaza, na czym polega rnica.
97
CZ II: NIEZBDNIK
98
To rozwie problem w kadej znanej przegldarce (moe oprcz Netscape 4, ale kogo to
obchodzi).
Analogicznie wcicia w listach zostay w niektrych przegldarkach utworzone za pomoc
marginesw, a w innych przy uyciu dopenienia. Jeli wic napiszemy
ul, ol {margin-left: 0;}
to usuniemy wcicie list tylko w niektrych przegldarkach. Jeli chcemy uzyska ten sam
efekt wszdzie, musimy te usun lew stron dopenienia.
ul, ol {margin-left: 0; padding-left: 0;}
Oczywicie wcicia nie musimy wcale usuwa. Gdy ju usuniesz ustawienia zarwno lewego
marginesu, jak i dopenienia w celu zmiany wcicia list, moesz pniej ustawi dowolne ich
wartoci. Moesz np. definiowa wcicie list za pomoc dopenienia. Wwczas wystarczy napisa:
ul, ol {margin-left: 0; padding-left: 2.5em;}
ROZDZIA 3: PORADY
Moesz te rozoy t warto na obie wasnoci:
ul, ol {margin-left: 1.25em; padding-left: 1.25em;}
99
WYCINANIE LIST
W poprzednim podrozdziale bya mowa o wcinaniu list, a teraz bdzie o wycinaniu.
Czy pojcie wycinanie list w ogle funkcjonuje? Moe i nie, ale i tak jest lepsze ni
wiszce wcicie, ktre rwnie mona czasami spotka w opisach tego typu rzeczy, a ktre
jest kompletnie bez sensu.
To, o czym teraz mwimy, to technika wysuwania pierwszego wiersza elementu listy w lewo,
tak e wisi po lewej stronie reszty treci elementu (rysunek 3.15).
Ten przyjemny dla oka efekt pozwala wyrni wizualnie listy bez zamiecania strony
niepotrzebnymi punktorami czy czym podobnym. Ponadto naprawd atwo mona go
uzyska:
ul {text-indent: -2em; list-style: none;}
CZ II: NIEZBDNIK
100
To wszystko. Zwr uwag na deklaracj list-style: none. Gdybym jej nie wpisa,
to pierwszy wiersz kadego elementu listy byby wycity, ale jego tekst nachodziby
napunktory. Dlatego nie naley miesza wycinania list z markerami.
Wycina mona oczywicie wszystko, co si chce, a wic take akapity, nagwki, elementy div
i pre czy komrki tabeli. Tylko e w listach technika ta znajduje najczstsze zastosowanie.
atwizna. Potencjalny problem z tym zwizany polega na tym, e nie mamy adnej kontroli
nad pooeniem tych obrazw. Ich odlego od lewego brzegu tekstu i wyrwnanie w pionie
wzgldem pierwszego wiersza cakowicie zale od przegldarki i nie mamy tu nic do powiedzenia.
Teraz zamy, e chcemy uy zwykych markerw listy powiedzmy typu disc ale chcemy,
aby miay inny kolor ni tre elementw (rysunek 3.17).
ROZDZIA 3: PORADY
101
CZ II: NIEZBDNIK
To niestety wymaga zastosowania pewnej sztuczki. Kady element listy musimy umieci
wjakim elemencie np. div albo span. Zademonstruj to na przykadzie tego pierwszego
elementu.
ul.stars {color: red; list-style: disc;}
ul.stars div {color: black;}
<ul class="stars">
<li><div>Soce</div></li>
<li><div>V645 Centauri (Proxima Centauri)</div></li>
<li><div>Alpha Centauri A</div></li>
...
</ul>
W tym konkretnym przypadku moglibymy zamieni element div na span bez wpywu na
ostateczny efekt. Ale gdybymy chcieli doda jeszcze jakie obramowanie albo to, to rnice
w zastosowaniu tych dwch elementw byyby ogromne (zgoda, mona by je zlikwidowa
przy uyciu wasnoci display).
Jeli sdzisz, e w CSS powinny by jakie sposoby zmieniania stylu samych markerw list
bez koniecznoci wstawiania dodatkowych znacznikw do dokumentw, to poinformuj
Ci, e one istniej, tylko e nie zaimplementowano ich w adnej przegldarce.
102
PUNKTORY W TLE
Chcemy zatem zastosowa wasne markery do elementw listy, ale nie podoba nam si to,
e przegldarka umieci je, gdzie zechce. Nie ma problemu. Moesz wyczy standardowe
wywietlanie markerw i umieci swoje obrazki w tle elementw listy (rysunek 3.18).
ul.stars {list-style: none;}
ul.stars li {background: url(star.gif) 0 0.1em no-repeat; padding-left: 16px;}
Dziki temu, e nad pooeniem obrazu w tle elementu mamy o wiele wiksz kontrol, ta
technika daje znacznie wiksze moliwoci ni uycie standardowej wasnoci list-style-image.
Oczywicie trzeba pamita o dodaniu dopenienia z lewej strony, aby tre elementu nie
zostaa wywietlona na obrazie punktora!
Wielk sztuk jest wyrwnanie obrazu z pierwszym wierszem tekstu elementu. W zasadzie
nie mona mie 100% pewnoci, e obraz pozostanie idealnie wyrwnany co do jednego
piksela np. z lini podstawow pisma pierwszej linii tekstu. Mona uzyska efekt bardzo
zbliony do ideau i w wielu przypadkach uda si go osign, ale nigdy nie mona by tego
pewnym. Jest to jeden z przypadkw, kiedy musimy zaakceptowa moliwo wystpienia
drobnych usterek albo zastosowa inne rozwizanie.
Najwiksz zalet tej metody jest to, e wcale nas ona nie ogranicza do pierwszego wiersza
tekstu. Markery bdce w tle mona wyrwna w pionie wzgldem caego elementu, nawet jeli
jego tre skada si z wielu wierszy. Jeli t technik poczy si z odpowiednio zdefiniowanymi
krawdziami obramowania, to mona uzyska naprawd bardzo fajne efekty (rysunek 3.19).
ROZDZIA 3: PORADY
103
CZ II: NIEZBDNIK
Jeli chcesz rne rodzaje elementw listy oznaczy rnymi rodzajami markerw (jak
na rysunku 3.20), to wystarczy, e oznaczysz je odpowiednimi klasami i dla kadej klasy
zdefiniujesz inny obraz.
ul.stars {list-style: none;}
ul.stars li {background: 0 0.1em no-repeat;
padding-left: 16px;}
ul.stars li.m {background-image: url(star-m.gif);}
ul.stars li.k {background-image: url(star-k.gif);}
<ul class="stars">
<li class="g">Soce</li>
<li class="m">V645 Centauri (Proxima Centauri)</li>
<li class="g">Alpha Centauri A</li>
<li class="k">Alpha Centauri B</li>
...
</ul>
104
ROZDZIA 3: PORADY
GENEROWANIE MARKERW
Istnieje jeszcze jeden bardziej zaawansowany sposb na utworzenie wasnych markerw list,
ale nie dziaa on w starszych przegldarkach. W technice tej wykorzystuje si poczenie
wycinania z generowaniem treci (rysunek 3.21).
105
To wszystko. Nie trzeba dodawa adnych nowych elementw, gdy s one dodawane
na pocztku kadego elementu listy automatycznie w postaci treci generowanej. Tre
generowana oznacza, e obrazy s wstawiane jako elementy rdliniowe, a wic mona je
wyrwnywa pionowo wzgldem linii podstawowej pisma itp.
Oczywicie mona zastosowa rne ikony, odwoujc si do rnych klas (rysunek 3.22).
ul.stars li.m:before {content: url(star-m.gif);}
ul.stars li.k:before {content: url(star-k.gif);}
CZ II: NIEZBDNIK
106
ul.stars
ul.stars
ul.stars
ul.stars
ROZDZIA 3: PORADY
Ta technika nie daje tak duej kontroli nad markerami jak obrazy w tle, przez co istnieje
ryzyko, e tekst w pierwszej linii nie bdzie idealnie wyrwnany z tekstem w dalszych
linijkach. Oglnie jednak rzecz biorc, mona uzyska bardzo dobry efekt, a poza tym
problem ten dotyczy tylko elementw list zawierajcych wicej ni jeden wiersz tekstu.
MASZ DO DYSPOZYCJI
WICEJ KONTENERW, NI MYLISZ
Bardzo czsto stosowanym zabiegiem jest umieszczanie caej treci strony
w elemencie-kontenerze div w taki sposb:
<body>
<div class="wrapper">
</div>
</body>
To klasyczny kod ustawiajcy projekt na rodku okna przegldarki i dziaajcy nawet w starych
przegldarkach IE, ktre nie rozpoznaway wartoci auto marginesw i mylay, e wasno
text-align suy do wyporodkowywania blokw.
Ale przecie tre strony ju przed dodaniem elementu div znajdowaa si w dwch
kontenerach elementach body i html. Tak, element html rwnie mona formatowa.
Czemu by nie? Dla CSS jest to zwyky element, jak wszystkie inne. Nie ma w nim nic
niezwykego oprcz faktu, e stoi na najwyszym poziomie hierarchii w drzewie
dokumentu, a wic jest jego korzeniem.
W zwizku z tym powysze dwie reguy moemy zmodyfikowa nastpujco:
html {background: #ABACAB; text-align: center;}
body {width: 800px; margin: 0 auto; text-align: left;)
Teraz ten sam efekt (rysunek 3.24) uzyskalimy bez dodatkowego elementu div,
ktrymoemy usun.
107
CZ II: NIEZBDNIK
108
Gdy ju zdasz sobie spraw, e za pomoc CSS mona formatowa take elementy html
i body, otworz si przed Tob nowe interesujce moliwoci. Zamy np. e chcemy
zaprojektowa stron z dwoma kolorowymi paskami wzdu grnej krawdzi okna
ilogo umieszczonym na dolnym pasku. Pewnie daoby si to jako zrobi przy uyciu
dodatkowego elementu div, ale poniej przedstawiam alternatywne rozwizanie, ktre
niewymaga dodawania tego elementu (rysunek 3.25):
html {border-top: 5px solid navy;}
body {border-top: 55px solid silver; margin: 0; padding: 0;}
img.logo {position: absolute; top: 10px; left: 10px;}
Podobny efekt mona oczywicie uzyska przy uyciu zwielokrotniania obrazw w tle
(rysunek 3.26).
html {background: url(stars-m.png) 14px 41px repeat-y;}
body {background: url(stars-k.png) 54px -20px repeat-x;}
img.logo {position: absolute; top: 10px; left: 10px;}
ROZDZIA 3: PORADY
109
CZ II: NIEZBDNIK
TA DOKUMENTU
Wszyscy przyzwyczailimy si do tego, e aby wypeni tem cae okno przegldarki,
ustawiamy to elementu body. Ale nie zgadniesz, co si stanie, gdy dodatkowo ustawisz to
elementu html.
html {background: #ABACAB;}
body {background: #DED;}
110
Rysunek 3.27. Element body nie zawsze wypenia widoczny obszar okna
Jeli usuniemy z arkusza stylw regu definiujc to elementu html, to cae okno zapeni si
kolorem elementu body.
Dzieje si tak dlatego, e w specyfikacji jzyka HTML zapisano, i kanwa, czyli obszar,
wktrym rysowana jest strona internetowa, pobiera swoje to z elementu html. Jeli element
html nie ma zdefiniowanego ta, to jest ono pobierane z elementu body. Jeli element body
rwnie nie ma ta, to zostaje zastosowany jaki domylny kolor.
ROZDZIA 3: PORADY
Jest to specjalny przypadek, ktrego opis znajduje si w specyfikacji. W przypadku innych
elementw nie jest tak, e to (lub jakakolwiek inna wasno CSS) jest przekazywane w gr
drzewa dokumentu. Pamitaj o tym, gdy bdziesz ustawia to dla elementu html.
ARKUSZE SERWEROWE
Ile razy zdarzya Ci si nastpujca sytuacja:
1. Wprowadzasz zmiany w arkuszu stylw na swoim komputerze.
2. Wysyasz zmodyfikowany arkusz na serwer testowy.
3. Przechodzisz do okna przegldarki i odwieasz je.
4. Nic si nie zmienia.
5. Robisz twarde odwieenie i dalej nic.
6. Sprawdzasz, czy wysyanie plikw zakoczyo si powodzeniem.
7. Jeszcze raz odwieasz i nadal nic.
8. Dodajesz kilka regu !important. Wysyasz plik na serwer, odwieasz, nic.
9. Zaczynasz przeklina swj komputer.
10. Sprawdzasz w Firebugu, co przesania Twoje nowe style. Spostrzegasz, e w ogle nie
zostay zastosowane.
11. Szukasz przyczyn jeszcze kilka minut, a w kocu odkrywasz, e odwieae stron
na serwerze produkcyjnym, a nie testowym.
12. Przeczasz si na serwer testowy i widzisz wszystkie zmiany.
13. Klniesz ze zoci, e jeste taki gupi.
Takie sytuacje przydarzay mi si tak czsto, e a wstyd si przyzna. Ostatnim razem,
gdy to miao miejsce, w kocu zdaem sobie spraw, e mgbym przecie na serwerze
testowym serwowa specjalny arkusz stylw, taki, ktry pozwalaby od razu si zorientowa,
e jestem na tym serwerze, bez potrzeby demolowania caego projektu. To pozwolioby mi
zaoszczdzi mnstwo nerww.
html {background: url(staging-bg.png) 100% 50% repeat-y;}
Teraz musisz jeszcze tylko zapisa w katalogu gwnym swojego serwera testowego plik
staging.css i gotowe. Oczywicie plik ten moesz zapisa w dowolnym innym miejscu, tylko
pamitaj, aby odpowiednio zmieni ciek w nawiasach ostroktnych w swojej dyrektywie.
Mona take stosowa adresy bezwzgldne, typu http://example.com/staging.css. Nie zapomnij
tylko o nawiasach ostroktnych, bo s wymagane.
111
CZ II: NIEZBDNIK
Zawsze istnieje ryzyko, e przeniesiesz pliki staging.css i .htaccess na serwer produkcyjny.
Jeli si tego obawiasz, zrezygnuj z pliku .htaccess i zamiast tego wysyaj plik staging.css
zapomoc odpowiednich dyrektyw w pliku httpd.conf:
<Directory /cieka/do/katalogu/gwnego/witryny>
Header add Link "</staging.css>;rel=stylesheet;type=text/css"
</Directory>
112
Uytkownicy serwera IIS mog wysya arkusze stylw poprzez nagwki HTTP,
korzystajc ze wskazwek podanych na stronie http://technet.microsoft.com/en-us/library/
cc753133(WS.10).aspx. Mona to zrobi zarwno z poziomu interfejsu IIS Managera,
jakiwiersza polece.
Jeli wszystkie swoje strony zapisujesz w formacie PHP, to nie musisz bawi si
wkonfiguracj serwera, ale na kadej stronie, na ktrej chcesz wczy swj arkusz
stylw, musisz umieci odpowiedni dyrektyw PHP. Ta metoda dziaa we wszystkich
przegldarkach:
Najprociej jest doda poniszy kod do kadej strony PHP:
<?php if ($_SERVER['HTTP_HOST'] == "staging.example.com") { ?>
<link rel="stylesheet" href="/staging.css" type="text/css" />
<?php } ?>
Ten kod wpisuje do dokumentu cze do arkusza stylw, a jeli jaka przegldarka go
nieobsuguje, to i tak nie pokae adnego stylu.
Ta metoda dziaa doskonale w przypadku serwowania plikw z domeny staging.example.
com. Lepszym rozwizaniem, ktre bdzie dziaa z kadego serwera z okrelonym
acuchem w nazwie domeny, a nawet z serwera lokalnego, dziaajcego na naszym
komputerze osobistym, jest:
<?php
if(preg_match("/staging|test|dev|localhost|127\.0\.0\.1/", $_SERVER[HTTP_HOST])){ ?>
<link rel="stylesheet" href="/staging.css" type="text/css" />
<?php } ?>
ROZDZIA 3: PORADY
Mona te zastosowa warunkowe wysyanie nagwkw HTTP przy uyciu PHP, ale jeli na
kadej stronie chcesz stosowa wykrywanie serwera, to rwnie dobrze moesz zastosowa
wstawianie cza do arkusza stylw.
Na pewno podobne rozwizania mona zaprogramowa przy uyciu innych jzykw
programowania uywanych do tworzenia stron internetowych. Przedstawione urywki kodu
pokazuj, czego naley szuka.
Za powyszy kod PHP dzikuj dwm uczonym dentelmenom: Zacharyemu Johnsonowi
(http://www.zachstronaut.com/) i Alanowi Hoganowi (http://alanhogan.com/), natomiast
trzeciemu, Peterowi Wilsonowi (http://peterwilson.cc/) za pokazanie mi strony
zewskazwkami dotyczcymi serwera IIS.
113
4
ROZDZIA
PODRCZNIK CSS
UKADY
CZ II: NIEZBDNIK
116
ROZDZIA 4: UKADY
117
CZ II: NIEZBDNIK
118
ROZDZIA 4: UKADY
Dziaanie tej techniki jest zgodne ze specyfikacj CSS, w ktrej zapisano, e jeli element ma
okrelon szeroko, a jego marginesy lewy i prawy s ustawione na warto automatyczn,
to przegldarka powinna obliczy rnic szerokoci tego elementu i jego kontenera, wynik
podzieli na p i uzyskan warto przypisa marginesom z obu stron elementu. W ten
sposb element zostaje wyrodkowany.
To oczywicie nie spowoduje wyrwnania do rodka treci elementu. Aby to zrobi,
naleaoby napisa (rysunek 4.6):
div#main {width: 55em; margin: 0 auto; text-align: center;}
Jeli element div byby szerszy od swojego kontenera, to w przypadku jzykw pisanych
od lewej do prawej strony przegldarka wyrwna go (nie jego tre) do lewej krawdzi,
awprzypadku jzykw pisanych od prawej do lewej wyrwna go do prawej.
119
CZ II: NIEZBDNIK
120
ROZDZIA 4: UKADY
Widzisz t przerywan lini nad kolumnami na rysunku 4.7? To jest cae obramowanie
wok elementu div#main. Element ten ma zerow wysoko, przez co pywajce w nim
kolumny wystaj poza niego (to nie jest bd ani usterka w CSS; jeli chcesz wiedzie
dlaczego, przeczytaj tekst pod podanym wczeniej adresem1).
121
Rysunek 4.7. Zoony kontener, ktry wizualnie nie otacza zawartych w nim kolumn
Element div#main mona zmusi do otoczenia pywajcych w nim kolumn na kilka
sposobw. Najprociej jest wykorzysta wasno overflow (rysunek 4.8).
div#main {border: 2px dashed gray; background: #9AC;
overflow: auto;}
CZ II: NIEZBDNIK
Rysunek 4.8. Rozcignicie kontenera na elementy pywajce przy uyciu wasnoci overflow
122
Tak, to dziaa i tak, ma to swoje przyczyny, ale nie bdziemy tego tu roztrzsa (jeli jednak
Ci to ciekawi, przeczytaj paragraf 10.6.7 specyfikacji CSS 2.1). Jeli chcesz mie pewno,
e stare wersje przegldarki IE nie narobi Ci kopotw, zastosuj dodatkowo okrelenie
szerokoci:
div#main {border: 2px dashed gray; background: #9AC;
overflow: auto; width: 100%;}
Wasno width moe mie dowoln warto oprcz auto i przypominam, e jest tu
potrzebna tylko po to, by zmusi stare wersje przegldarki IE do poprawnego dziaania. Jeli
nie obchodz Ci te programy, moesz t deklaracj szerokoci usun.
Zalet tego podejcia jest to, e element odgrywajcy rol kontenera (div#main) pozostaje
wnormalnym ukadzie dokumentu. To oznacza, e wszystko, co znajdzie si za nim w kodzie
rdowym, zostanie wywietlone pod nim na stronie w przegldarce, nawet jeli element
ten bdzie od tego wszy. Dziki temu dalsza tre nie wypynie obok naszych kolumn.
Ponadto kontener ten bdzie automatycznie przyjmowa szeroko swojego elementu
zawierajcego, a wic jeli napiszemy deklaracj width: 100%, nasz kontener rozcignie si
jak kady inny zwyky element.
Zauwamy jednak, e w przykadzie zdefiniowalimy dla elementu div#main dwupikselowe
obramowanie z wszystkich stron. To oznacza, e jeli ustawimy szeroko na 100%, to element
ten bdzie szerszy od swojego elementu zawierajcego o cztery piksele. Problemu tego
unikniemy, jeli ustawimy szeroko na auto, co spowoduje dopasowanie szerokoci elementu
do jego kontenera, ale wwczas mog pojawi si problemy ze starymi przegldarkami IE.
ROZDZIA 4: UKADY
To jeszcze nie koniec zmartwie. Jeli uyjemy wartoci auto dla wasnoci overflow,
to przegldarka moe, jeli uzna to za stosowne, doda do elementu div#main paski
przewijania. Wydaje si, e w praktyce to si nie zdarza, ale syszaem o nielicznych
przypadkach, kiedy to miao miejsce, a wic warto na to uwaa, tak na wszelki wypadek.
PYWAJCE KONTENERY
ELEMENTWPYWAJCYCH
Innym sposobem na poradzenie sobie z problemem zawierania elementw pywajcych
wkontenerze jest ustawienie samego kontenera rwnie jako elementu pywajcego.
div#main {border: 2px dashed gray; background: #9AC;
float: left;}
div.column {float: left; width: 28%;
padding: 0 1%; margin: 0 1%;}
123
CZ II: NIEZBDNIK
Rysunek 4.9 wyglda identycznie jak 4.8, prawda? A jednak kady z nich powsta przy
uyciu innego kodu CSS. Jest to jeden z obszarw kaskadowych arkuszy stylw, w ktrych
mona ten sam wynik uzyska na wiele sposobw, a wybr konkretnego to kwestia
preferencji i uwarunkowa projektowych.
Element div#main znowu bdzie wysunity w prawo o cztery piksele z powodu obramowania.
Poniewa jednak elementy pywajce nie nale do normalnego ukadu, problemu tego nie
moemy rozwiza poprzez zastosowanie deklaracji width: auto. W przypadku elementw
pywajcych taka deklaracja oznacza, e o ich szerokoci decyduje przegldarka.
Ponadto, gdy tworzymy taki element pywajcy jak ten, ryzykujemy, e tre naleca do
ukadu normalnego, znajdujca si za nim w kodzie rdowym, zostanie wywietlona obok
niego. Aby temu zapobiec, mona zdefiniowa wasno clear. Jeli wiemy, jaki element
bdzie reprezentowa t dalsz tre, to moemy napisa co w tym rodzaju (przyjmuj tu
zaoenie, e po naszym elemencie div#main zawsze bdzie wystpowa element #footer):
div#footer {clear: left;}
Jeli nie ma pewnoci, e za elementem div#main bdzie wystpowa zawsze ten sam
element, mona uy selektora przylegajcego elementu siostrzanego z selektorem
uniwersalnym (rysunek 4.10):
div#main + * {clear: left;}
124
Rysunek 4.10. Wykorzystanie selektora przylegajcego elementu siostrzanego i wasnoci clear do zepchnicia stopki
pod pywajce kolumny
ROZDZIA 4: UKADY
CLEARFIX
Mianem clearfix okrela si pewn star technik, ktra zostaa ju w duym stopniu
wyparta przez dwie opisane wczeniej, ale s sytuacje, w ktrych jej zastosowanie jest
dogodniejsze. Dotyczy to w szczeglnoci starszych wersji przegldarki Internet Explorer,
ktre w niektrych sytuacjach le interpretuj wspomniane ju metody.
Najprostszym wariantem metody clearfix jest wstawienie do dokumentu jakiego elementu
izdefiniowanie dla niego wasnoci clear, np.:
div#main + * {clear: left;}
<div class="column one">...</div>
<div class="column two">...</div>
<div class="column three">...</div>
<br class="clearfix">
<p>...</p>
Kluczowym elementem tego kodu jest br. Element ten zejdzie pod umieszczone przed nim
pywajce kolumny i pocignie za sob wszystko, co znajduje si za nim. Aby si tak stao,
trzeba zdefiniowa nastpujc regu CSS (rysunek 4.11):
.clearfix {display: block; clear: both;}
125
Rysunek 4.11. Zepchnicie stopki pod pywajce kolumny za pomoc techniki clearfix
CZ II: NIEZBDNIK
Ta regua CSS sprawi, e element br znajdzie si pod pywajcymi kolumnami. W starszych
przegldarkach element ten moe te spowodowa pojawienie si pustego wiersza, a wic
przed zastosowaniem tej metody warto j przetestowa. Jeli bdziesz mie problem z pustym
wierszem, sprbuj nastpujcej modyfikacji arkusza stylw:
.clearfix {display: block; clear: both;
font-size: 0; height: 0;}
126
Wynik zastosowania tej reguy powinien by taki sam jak w przypadku poprzedniej,
ale powinno si j dla pewnoci przetestowa. Poza tym, jeli chcesz kontrolowa
pooenie elementw z dokadnoci co do jednego piksela, to ten wariant metody nie
jest najszczliwszym wyborem. W takim przypadku lepiej na tym wyjdziesz, jeli uyjesz
elementu br.
Istnieje jeszcze inny wariant tej metody, w ktrym uywa si treci generowanej, ale
wnajnowszych wersjach przegldarek jej stosowanie jest utrudnione ze wzgldu na zmiany
w obsudze tego rodzaju treci, a poza tym pojawiy si nowe moliwoci uzyskania tego
samego efektu, ktre zostay opisane nieco wczeniej. Jeli interesujesz si histori, zajrzyj
pod adres http://positioniseverything.net/easyclearing.html (pomi tylko pierwsz uwag).
ROZDZIA 4: UKADY
Midzy ostatnim kolumnowym elementem div a znajdujcym si za nim akapitem nie ma
adnego innego elementu. Jak w takim razie zepchn ten akapit pod kolumny (rysunek 4.12)?
Nic prostszego:
div.three + p {clear: both;}
127
Rysunek 4.12. Wykorzystanie selektora przylegajcego elementu siostrzanego i wasnoci clear do zepchnicia stopki
pod pywajce kolumny
Poniewa kolumny i akapit maj wsplnego rodzica, s elementami siostrzanymi. Dziki
temu do elementu p moemy si dobra przy uyciu kombinatora + (przylegajcego
elementu siostrzanego).
Regu t mona te uoglni, jeli selektor p zastpi si selektorem uniwersalnym:
div.three + * {clear: both;}
Dziki temu w d zostanie zepchnity kady element, bez wzgldu na to, czy bdzie to
akapit, lista, tabela, element pre, czy cokolwiek innego.
Pamitaj, e mona bardzo atwo zepsu t metod. Wystarczy umieci kolumny
wdodatkowym elemencie div.
<div class="columns">
<div class="column one">...</div>
<div class="column two">...</div>
<div class="column three">...</div>
</div>
<p>...</p>
CZ II: NIEZBDNIK
Teraz akapit nie zostanie zepchnity pod kolumny, poniewa nie ma ju wsplnego rodzica
z nimi (a wic nie jest ich elementem siostrzanym). Taki obrt rzeczy spowodowa cakowite
wyczenie naszego selektora. W przypadku takiej struktury dokumentu naley uy jednej
z metod opisanych wczeniej, np. z wykorzystaniem wasnoci overflow: auto.
Jedyne, co musimy z tym zrobi, to ustawi te dwie kolumny obok siebie. Pozostaje tylko
zdecydowa, ktra ma by po lewej stronie, a ktra po prawej. eby byo ciekawiej, zamy,
e chcemy pierwsz kolumn (column one) ustawi z prawej strony. Nic trudnego:
128
To wystarczy, aby kolumny znalazy si obok siebie. Na razie bd stamszone prawie jedna
na drugiej i bd wyglda paskudnie, ale znajd si obok siebie!
Wprowadzajc proste modyfikacje do arkusza, moemy sprawi, e efekt stanie si nieco
znoniejszy (co podobnego wida na rysunku 4.13):
.column {float: right; width: 30%; margin: 0 10%;}
Oczywicie w tej chwili mamy jeszcze problem ze stopk, ktrej grna krawd znajduje
si na rwni z grnymi krawdziami kolumn. Rozwizanie jest proste i polega na uyciu
wasnoci clear:
.footer {clear: both;}
To jest prosty ukad dwukolumnowy, ktry ma dwie wielkie zalety. Po pierwsze, umoliwia
ustawienie kolumn w dowolnej kolejnoci bez wzgldu na ich kolejno w kodzie
rdowym. Jak wiemy, pierwsza kolumna nie musi pywa po lewej stronie, rwnie dobrze
moe by po prawej. Po drugie, jeli zmienimy zdanie i uznamy, e kolumny powinny by
w odwrotnej kolejnoci, wystarczy, e zmienimy deklaracj float: right na float: left.
Buka z masem!
ROZDZIA 4: UKADY
class="column one">...</div>
class="column two">...</div>
class="column three">...</div>
class="footer">...</div>
129
CZ II: NIEZBDNIK
130
ROZDZIA 4: UKADY
Rysunek 4.15. Separatory kolumn w postaci bocznych krawdzi obramowania rodkowej kolumny
Dziki temu, e rodkowa kolumna jest najwysza, jej boki mog suy jako separatory.
Trzeba byo dostosowa marginesy i dopenienie kolumn, aby odsun troch te separatory
od treci kolumn, ale to nic wielkiego. Moglibymy nawet zmieni tylko definicje stylw
kolumny rodkowej, a style reguy .column pozostawi w spokoju:
.column {width: 20%; margin: 0 5%; float: left;}
.two {width: 30%; border: 1px solid gray; border-width: 0 1px;
margin: 0; padding: 0 4%;}
131
CZ II: NIEZBDNIK
132
Jak wida, trzecia kolumna spada pod dwie pozostae. Stao si to dlatego, e zabrako
dla niej miejsca obok dwch pozostaych kolumn. A miejsca zabrako, poniewa suma
szerokoci, marginesw, dopenie i krawdzi obramowania wynosi wicej ni 100%
100%+2 piksele, mwic dokadnie. Nawet jeden piksel ponad 100% to o jeden za duo.
Rozwizanie tego problemu jest tylko jedno dokadnie sprawdzaj swoje obliczenia.
Jelinatomiast chodzi o pionowy separator kolumn, przeczytaj dwa kolejne podrozdziay.
FASZYWE KOLUMNY
Jedn z najlepszych metod uzyskiwania kolumn o rwnej wysokoci w CSS jest tzw. technika
faszywych kolumn, ktr spopularyzowa Dan Cederholm (http://simplebits.com/) w swoim
artykule opublikowanym w A List Apart w 2004 roku.
Aby z niej skorzysta, trzeba najpierw utworzy zwyke kolumny.
<div class="column one">...</div>
<div class="column two">...</div>
<div class="column three">...</div>
ROZDZIA 4: UKADY
Musimy zrobi jeszcze dwie rzeczy. Po pierwsze, trzeba zmusi kontener do rozcignicia si
na kolumnach.
div.contain {width: 960px; overflow: auto;}
Po drugie, potrzebny nam bdzie obraz graficzny, ktry wstawimy w to kontenera w celu
uzyskania rysunku separatorw (rysunek 4.18).
133
CZ II: NIEZBDNIK
Wysoko tego obrazu wynosi tylko kilka pikseli, poniewa zostanie on i tak pionowo
zwielokrotniony (rysunek 4.19).
div.contain {width: 960px; margin: 0 auto; overflow: auto;
background: url(separators.png) 0 0 repeat-y;}
134
T technik mona obsuy dowoln liczb kolumn, trzeba tylko odpowiednio zmieni
obraz w tle.
Dopki szeroko kolumn bdzie ustawiana w pikselach (trzyma si tego wiele osb),
wszystko bdzie w porzdku. Wiele potencjalnych problemw zwizanych z t metod
mona atwo przezwyciy przy uyciu opcji powikszania dostpnej we wszystkich
nowoczesnych przegldarkach. Nie oznacza to jednak, e wszystkie. Jeli okno przegldarki
bdzie miao mniejsz szeroko od naszej strony, to zostan wywietlone poziome paski
przewijania, a jeli okno przegldarki bdzie duo szersze od naszej strony, po bokach
zostan due obszary pustego miejsca. Moe nie martwi Ci te problemy, ale naprawd
warto te sprawy przemyle.
ROZDZIA 4: UKADY
135
CZ II: NIEZBDNIK
W tej metodzie potrzebny jest jeden kontener dla kadej luki midzy kolumnami, a wic
innymi sowy, potrzeba o jeden kontener mniej, ni jest kolumn. Poniewa tu zajmujemy
si ukadem trzykolumnowym, potrzebujemy dwch kontenerw. Ponadto dla kadego
kontenera potrzebujemy jednego wzoru separatora lub ta.
Zaczniemy od napisania kilku deklaracji dotyczcych pynnej szerokoci kolumn.
.column {width: 20%; margin: 0 5%; float: left;}
.two {width: 30%;}
Nastpnie utworzymy tylko jeden obraz dla ta. Na rysunku 4.21 wida tylko kawaek tego
obrazu, poniewa ma on szeroko a 3000 pikseli!
136
ROZDZIA 4: UKADY
Po pierwsze, z powyszego rysunku wynika, e separator znajduje si w odlegoci rwnej
25% szerokoci 3000-pikselowego obrazu od jego lewej krawdzi, a wic jego rodek wypada
na 750. pikselu, liczc od lewej strony obrazu.
Po drugie, potrzebujemy poniszej reguy CSS:
.inner {background: url(lb01.png) 25% 0 repeat-y; overflow: auto;}
Jak wida, punkt znajdujcy si na 750. pikselu obrazu (25%) pokrywa si z punktem pooonym
w odlegoci 25% szerokoci kontenera od lewej krawdzi tego kontenera. Dopki 25%
szerokoci kontenera bdzie wartoci mniejsz od 750 pikseli, wszystko bdzie w porzdku!
Do wstawienia drugiego separatora bdzie nam potrzebny drugi obraz o konstrukcji
podobnej do pierwszego. Ten separator ma si znajdowa midzy kolumnami rodkow
i praw, jak na rysunku 4.23. Szeroko prawej kolumny wynosi 30% 20% realnej
szerokoci i po 5% na boczne marginesy. To oznacza, e separator musi znajdowa si
wodlegoci rwnej 70% szerokoci naszego obrazu od jego prawej krawdzi, czyli 2100
pikseli, jeli obraz ten ma szeroko 3000 pikseli. Na lewo od separatora znajduje si
przezroczysty obszar, a na prawo kolorowe wypenienie. Do jego ustawienia na miejscu
wystarczy krtka regua CSS:
.contain {background: url(lb02.png) 0 70% repeat-y; overflow: auto;}
137
CZ II: NIEZBDNIK
Ostatnia uwaga jeli chcesz wypeni kolorem rodkow kolumn (rysunek 4.24),
tonie musisz ju dodawa adnych znacznikw HTML. Wystarczy, e zdefiniujesz kolor
ta zewntrznego kontenera.
.contain {background: #DECADE url(lb02.png) 70% 0 repeat-y; overflow: auto;}
138
To wszystko, co jest potrzebne. Jeli separatory bd przesunite o piksel czy dwa w ktr
stron, dodaj do nich przezroczysty obszar o odpowiedniej szerokoci.
ROZDZIA 4: UKADY
zaoenie brzmi: pywajce kolumny mona rozmieszcza na stronie niezalenie od ich
umiejscowienia w kodzie rdowym dokumentu. Jest to spory postp w stosunku do
przedstawionych wczeniej prostych ukadw, w ktrych rozmieszczenie kolumn byo
zwizane z ich miejscem w rdle.
Realizacja tej techniki wymaga tylko kolumn w postaci elementw div i niewielkiej
iloci kodu CSS. Nie trzeba stosowa adnych dodatkowych kontenerw, tak jak to byo
wprzypadku wczeniejszych prb.
Jak zwykle na pocztek potrzebny jest zestaw trzech kolumn. W tym wypadku gwna tre
strony bdzie si znajdowaa w pierwszej kolumnie, a pozostaa w dwch nastpnych.
<div class="column one">...</div>
<div class="column two">...</div>
<div class="column three">...</div>
139
CZ II: NIEZBDNIK
Teraz przyjmujemy zaoenie, e pierwsza kolumna ma by w rodku, druga po prawej,
atrzecia po lewej stronie, jak wida na rysunku 4.26. Do tego potrzebne s dwie
dodatkowe reguy:
.one {width: 300px; margin-left: 300px;}
.three {margin-left: -920px;}
140
Zasada dziaania tej techniki jest taka sama jak wczeniej. Wszystko sprowadza si do tego,
aby po lewej stronie zapewni wystarczajc ilo miejsca dla kolumny, ktr chcemy tam
umieci, a nastpnie do przesunicia tej kolumny w to miejsce.
ROZDZIA 4: UKADY
Trzy kolumny nie s ograniczeniem w tej metodzie. Moesz onglowa czterema, picioma
kolumnami lub wiksz ich liczb, jak tylko sobie yczysz. Im wicej kolumn, tym sprawy
staj si bardziej skomplikowane, ale przecie gdyby to byo atwe, to kady mgby sobie
ztym poradzi, prawda?
Aby ustawi wszystkie kolumny na rodku okna, trzeba je umieci w dodatkowym
kontenerze, np.:
.contain {width: 1000px; margin: 0 auto;}
<div class="contain">
<div class="column one">...</div>
<div class="column two">...</div>
<div class="column three">...</div>
</div>
141
CZ II: NIEZBDNIK
Jak ju wspominaem, uywam w przykadach pikseli, bo wtedy atwiej jest zrozumie
wykonywane obliczenia. Nie oznacza to jednak, e jest to jedyna dozwolona jednostka.
Tosamo mona robi z pynnymi kolumnami o szerokociach zdefiniowanych w procentach
(rysunek 4.28):
column {float: right; padding: 0 2.5%; margin: 0 2.5%;}
.two, .three {width: 20%;}
.one {width: 30%; margin-right: 32.5%;}
.two {margin-right: -70%;}
142
WITY GRAAL
Rozwiniciem techniki jedynego susznego ukadu jest technika o rwnie skromnej
nazwie wity Graal. Jako pierwszy opisa j Matthew Levine kilka miesicy po debiucie
jedynego susznego ukadu. Metoda ta opiera si na wymienionej poprzedniczce
ima pewne dodatki wniesione przez skromnego czowieka, jakim jest autor tej ksiki.
Umoliwia tworzenie hybryd ukadw pynnych i sztywnych przy zachowaniu niezalenoci
od kolejnoci kolumn (oryginalny artyku opisujcy t metod mona znale pod adresem
http://alistapart.com/articles/holygrail).
W tym podejciu mamy trzy kolumny, z ktrych dwie zewntrzne s sztywne, a rodkowa
pynna, czyli zmienia rozmiar w zalenoci od iloci dostpnego miejsca. Wszystko jak
zwykle zaczyna si od trzech elementw div reprezentujcych kolumny i kontenera:
ROZDZIA 4: UKADY
<div class="contain">
<div class="column one">...</div>
<div class="column two">...</div>
<div class="column three">...</div>
</div>
Pierwsz kolumn tak jak poprzednio umiecimy w rodku. Drug kolumn przesuniemy
na lew stron, a trzeci na praw. Kolumny druga i trzecia musz mie sta szeroko,
tzn. zdefiniowan za pomoc innej jednostki ni procenty (gdybymy chcieli, aby wszystkie
kolumny miay szeroko wyraon w procentach, uylibymy oryginalnej metody
jedynego susznego ukadu, opisanej w poprzednim podrozdziale). Moglibymy uy
jako jednostki pikseli, ale dodamy troch pieprzu i uyjemy jednostki em. Zatem drugiej
kolumnie nadamy szeroko 13 em, a trzeciej 15 em.
OK, tak wic po lewej stronie mamy 13 em, a po prawej 15 em (rysunek 4.29).
Najpierw sformatujemy kontener:
.contain {padding: 0 15em 0 13em;}
143
CZ II: NIEZBDNIK
Niebawem wyjani, o co chodzi z deklaracj position: relative. Na razie ustawimy
szeroko pozostaych kolumn i umiecimy je na odpowiednim miejscu (rysunek 4.30).
.two {width: 13em; margin-left: -100%;}
.three {width: 15em; margin-right: -15em;}
144
ROZDZIA 4: UKADY
Zwr uwag, e po bokach mamy grube krawdzie obramowania. To wanie one tworz
miejsca dla kolumn bocznych. Natomiast dopenienie odsunie tre rodkowej kolumny
nieco dalej od krawdzi, a wic rwnie od kolumn bocznych.
To pociga za sob konieczno zmiany stylw kolumn bocznych. W drugiej kolumnie
(czyli lewej w tym przykadzie) musimy tylko zwikszy warto wasnoci right do
poziomu jej szerokoci (ktra jest rwna gruboci lewej krawdzi obramowania rodkowej
kolumny) powikszonej o lewe dopenienie rodkowej kolumny.
.two {width: 13em; margin-left: -100%; right: 15em;}
Jeli chodzi o praw kolumn, to pewnie korci Ci, eby zwikszy ujemn warto prawego
marginesu. Niestety, tak nie zawsze si da. Lepiej zostaw margines w spokoju, a dodaj
wasno przesunicia left.
.three {width: 15em; margin-right: -15em; left: 2em;}
Oczywicie rwnie dobrze mona by zastosowa ujemne przesunicie w prawo. Bez wzgldu
na to, ktr metod wybierzemy, wynik bdzie taki jak na rysunku 4.32.
145
CZ II: NIEZBDNIK
Rysunek 4.32. Jeszcze inny sposb ustawienia prawej kolumny na swoim miejscu
146
Drobn korzyci z zastosowania tego podejcia jest to, e jeli kiedy zechcemy zastosowa
kolor w tle ktrejkolwiek z kolumn bocznych, to wystarczy, e ustawimy na ten kolor
odpowiedni krawd obramowania rodkowej kolumny.
Jest jeszcze jedna rzecz, o ktrej nie powinnimy zapomina nie pozwlmy, aby projekt
zrobi si zbyt wski. Do tego wystarczy prosta regua dla elementu body:
body {min-width: 50em;}
Teraz element body nie bdzie mg by szerszy ni 50 em, a wic wystarczy w nim miejsca
dla obu kolumn bocznych i jeszcze zostanie 22 em dla kolumny rodkowej. Oczywicie t
warto mona ustawia dowolnie, chocia gdybymy zastosowali jak inn jednostk,
niemoglibymy by tak pewni wyniku.
PYNNE SIATKI
Technika o nazwie Fluid Grids (pynne siatki) zostaa po raz pierwszy szczegowo
opisana przez Ethana Marcottea (na stronie http://alistapart.com/articles/fluidgrids).
Jest to metoda pozwalajca zmieni ukad oparty na strukturze siatkowej w pynniejsz
kompozycj, w ktrej budowie wykorzystana jest mieszanina wartoci wyraonych
wjednostkach em i procentach. Co ciekawsze, jednostk em mona w kadej chwili
zastpi dowoln inn.
Prac zaczniemy jednak od pikseli.
ROZDZIA 4: UKADY
No moe nie cakiem. Piksele s najwygodniejsz jednostk, gdy zaczyna si prac od
gotowego projektu ukadu np. w Photoshopie. Tam pomiarw dokonuje si w pikselach,
alepniej si ich pozbdziemy. Ale bez obaw, wszystko bdzie dobrze.
Na rysunku 4.33 wida projekt ukadu z zaznaczonymi podstawowymi dugociami.
147
Rysunek 4.33. Wizualizacja wymiarw ukadu strony
Jeli zsumujemy wszystkie szerokoci, to otrzymamy liczb 1010 pikseli. Aby uzyska
procentowy udzia kadego z elementw w tej oglnej liczbie, szeroko kadego z nich
musimy podzieli przez 1010.
Ale chwileczk! Jak rozdzielimy puste obszary i czy zdefiniujemy je w postaci marginesu,
czy dopenienia? Czy cae 70 pikseli przypiszemy jednemu elementowi, czy raczej
rozdzielimy t warto midzy dwa elementy?
Trudno jednoznacznie odpowiedzie na to pytanie, poniewa decyzja czsto zaley od
potrzeb konkretnego projektu, a niejednokrotnie po prostu od osobistego gustu projektanta.
Na potrzeby tego przykadu zastosujemy samo dopenienie, na wypadek gdybymy kiedy
chcieli zdefiniowa kolory ta. Ponadto szeroko luki rozdzielimy po rwno na dwa
elementy.
Przy uyciu pikseli napisalibymy nastpujcy kod:
#contain {width: 1010px;}
#main, #extra {float: left;}
#main {width: 715px; padding: 20px 35px 20px 25px;}
#extra {width: 190px; padding: 20px 10px 20px 35px;}
CZ II: NIEZBDNIK
Przypominam jednak, e wszystkie te wartoci musimy podzieli przez 1010. W zwizku
ztym otrzymujemy nastpujcy rezultat (rysunek 4.34):
#contain {width: 1010px;}
#main, #extra {float: left;}
#main {width: 70.792%; padding: 1.98% 3.465% 1.98% 2.475%;}
#extra {width: 18.812%; padding: 1.98% 9.9% 1.98% 3.465%;}
148
Mona zauway, e nie brakuje jakiejkolwiek definicji oddzielajcej elementy .info i .main.
Nie jest to potrzebne, gdy elementy te spywaj w przeciwne strony, a wic pozostan
oddzielone, gdy uciekaj w przeciwnych kierunkach. Teraz wszystkie wartoci wyraone
w pikselach dzielimy przez 715, bo tyle wynosi szeroko elementu #main. Otrzymamy
nastpujcy wynik w CSS, ktrego ekranowy odpowiednik przedstawia rysunek 4.36.
ROZDZIA 4: UKADY
149
CZ II: NIEZBDNIK
Trzeba jeszcze kolumny wyrwna w pionie, ale do tego wystarczy tylko odpowiednie
dostosowanie grnych marginesw.
Pewnie si zastanawiasz, po co wykonywa te wszystkie obliczenia, skoro mamy bardzo
dobre piksele? Poniewa dziki wartociom procentowym moemy dowolnie zmienia
szeroko kontenera, a nasza siatka si do tego dostosuje, np.:
#contain {width: 70em;}
Albo nawet:
#contain {width: 90%; margin: 0 5%;}
Cay wiat stoi przed Tob otworem. Uwaaj tylko, eby Ci si w tym wiecie nie zrobio
zaciasno, np.:
#contain {width: 90%; min-width: 960px; margin: 0 5%;}
150
ROZDZIA 4: UKADY
wietnie. Pora na arytmetyk. Tym razem wszystkie wartoci bdziemy dzieli przez
podstawowy rozmiar pisma zastosowany na stronie. Najczciej wykorzystuje si do
tego celu rozmiar pisma elementu body lub html. Gdyby przypadkowo zapomnia uy
wasnoci font-size, to w wikszoci przegldarek domylny rozmiar pisma wynosi
16pikseli i prawie nikt go nie zmienia. Jeli w takim razie masz w arkuszu zdefiniowan
regu typu body {font-size: 0.8215em;}, to podstawowy rozmiar pisma na Twojej
stronie wynosi 13 pikseli.
Po znalezieniu podstawowego rozmiaru pisma naley przez niego podzieli wszystkie
wartoci pikselowe. Uzyskane wyniki bd wyraone w jednostce em. Oto przykadowe
obliczenia dla podstawowego rozmiaru pisma wynoszcego 13 pikseli:
#contain {width: 77.692em;}
#main, #extra {float: left;}
#main {width: 55em; padding: 1.538em 2.692em 1.538em 1.923em;}
#extra {width: 14.615em; padding: 1.538em 0.769em 1.538em 2.692em;}
151
CZ II: NIEZBDNIK
Zapewne zauwaye brak deklaracji dla elementu h2 zawierajcego tytu wpisu na stronie.
Musiaem to zrobi, gdy rozmiar tego elementu jest wikszy od domylnego, a wic nie
moemy zastosowa w jego przypadku dzielenia przez 13. Zobaczmy, jaki rozmiar zosta mu
nadany w innym miejscu arkusza stylw.
h2 {font-size: 1.6em;}
W takim razie jego rozmiar wynosi 13 razy 1,6, a wic 25,6. W zwizku z tym wartoci tego
elementu musimy podzieli przez 25,6 (rysunek 4.39).
#main h2 {width: 27.644em; padding-left: 6.731em;}
152
ROZDZIA 4: UKADY
W takim przypadku moe si jednak zdarzy, e ukad stanie si szerszy od okna
przegldarki, co wida na rysunku 4.40. To jedna z potencjalnych wad ukadw
opartych na jednostce em i nie bardzo da si j obej. Oglnie rzecz biorc,
najwaniejsz cech tego rodzaju ukadw jest to, e zachowuj poprawne wysokoci
wiersza i rozmieszczenie elementw wzgldem siebie bez wzgldu na rozmiar okna
przegldarki. Jeli nie potrzebujesz tego, to nie potrzebujesz te ukadu opartego
najednostce em.
153
Rysunek 4.40. Gdy okno przegldarki jest zbyt wskie, pojawia si poziomy pasek przewijania
W metodzie tej moliwe jest nawet sprawienie, aby wraz z tekstem zmienia si rozmiar
obrazw. Zamy, e mamy obraz o szerokoci 88 pikseli. Dzielimy t warto przez
rozmiar znajdujcego si wok niego tekstu (niech bdzie dla przykadu 16) i wynik
stosujemy jako szeroko obrazu:
<img src="btn07.png" alt="XFN Friendly" style="width: 5.5em;">
Teraz obraz ten bdzie zmienia rozmiar wraz ze zmian rozmiaru tekstu. Oczywicie nie
robi si tego z kadym obrazem, ale zastosowanie tej techniki moe by bardzo pomocne
wnagwkach sekcji lub przy innych zintegrowanych obrazach.
CZ II: NIEZBDNIK
UJEMNE MARGINESY
W UKADZIE NORMALNYM
Kady wie, e marginesy su do odsuwania od siebie elementw, ale nie kady wie, e za
pomoc ujemnych marginesw mona zmniejsza odstpy, a nawet cakiem je likwidowa.
Wemy np. prost stron chcemy, aby element znajdujcy si za elementem h2 by
umieszczony bardzo blisko jego dolnej krawdzi. Taki sposb formatowania najczciej
stosuje si do pierwszego akapitu pod tytuem artykuu. Mona to zrobi przy uyciu
selektora przylegajcego elementu siostrzanego (zobacz podrozdzia Selektory elementw
siostrzanych w rozdziale 2.). Jest te inny sposb, ktry polega na zdefiniowaniu dla
elementu h2 ujemnego marginesu (rysunek 4.41).
h2 {border-bottom: 1px solid; font-size: 150%; margin-bottom: -0.67em;}
p {margin: 1em 0;}
154
Rysunek 4.41. Zblienie nagwka do znajdujcego si za nim elementu
Moe si wydawa, e akapit nie ma marginesu, ale to tylko iluzja. W rzeczywistoci
margines akapitu pokrywa si czciowo z treci nagwka, ktrego dolna krawd
marginesu z kolei znajduje si teraz w pobliu grnej krawdzi jego tekstu. Akapit i jego
margines znajduj si pod marginesem elementu h2, a nie pod jego doln krawdzi.
T technik mona uoglni w celu umieszczania fragmentw treci w jednej linii.
Napisaem to w cudzysowie dlatego, e wyrwnanie jest tylko wizualne. Spjrzmy:
<ul class="jump">
<li class="prev"><a href="ch03.html">Salaries</a></li>
<li class="next"><a href="ch05.html">Punching the Clock</a></li>
</ul>
Chcielibymy, aby te elementy listy znalazy si w jednej linii, tak jak wida na rysunku 4.42.
Jedn z moliwoci jest zastosowanie pywania, ale jest te inna metoda.
ul.jump {list-style: none; line-height: 1; width: 25em;
margin: 0 auto; padding: 0.25em 1em; border: 1px solid;}
li.next {text-align: right; margin-top: -1em;}
ROZDZIA 4: UKADY
</div>
155
</div>
CZ II: NIEZBDNIK
Jeszcze tylko maa poprawka kodu CSS i gotowe (rysunek 4.44):
.entry h2 {margin-top: -0.67em; text-align: center;}
.entry h2 span {background: #FFF; border: 1px solid gray; padding: 0.25em 1em;}
156
Wszystko bdzie w porzdku, dopki tekst nie bdzie zajmowa wicej ni jeden wiersz.
Jeli tak by si stao, zwisaby poza lini rodkow nie wycentrowaby si automatycznie
a pole zostaoby podzielone midzy dwie linijki. Problemu tego przy uyciu ujemnych
marginesw nie da si dobrze rozwiza. Mona by byo ewentualnie usun obramowanie
izachowa biae to. To byoby w miar dobre rozwizanie, chocia nie idealne.
POZYCJONOWANIE W KONTEKCIE
Do tej pory praktycznie nie zosta jeszcze poruszony temat pozycjonowania elementw. Jest
to spowodowane tym, e pozycjonowanie mam tu na myli pozycjonowanie bezwzgldne
najczciej jest bardzo zym wyborem, jeli chodzi o technik do projektowania
wielkoskalowych ukadw. Nie zawsze, ale bardzo czsto.
Element pozycjonowany bezwzgldnie jest wyjmowany z normalnego ukadu elementw na
stronie, co oznacza, e gdziekolwiek zostanie umieszczony, to znajdujce si w tym miejscu
elementy bd si zachowywa tak, jakby go tam nie byo. Dlatego czstym rezultatem
pozycjonowania bezwzgldnego jest wystpowanie pokrywajcych si fragmentw treci.
Troch szkoda, e tak jest, bo szczerze mwic, gdyby bya moliwo pozycjonowania np.
kolumn bez martwienia si, czy nie zasoni stopki, byoby nam znacznie atwiej.
Nie tramy jednak zapau pozycjonowania bezwzgldnego moemy z powodzeniem
uywa w pewnych ograniczonych kontekstach, takich jak obszar stopki czy nagwka.
Przestudiujmy poniszy kod HTML:
ROZDZIA 4: UKADY
<div class="header">
<a href="/"><img src="logo.png" alt="ConHugeCo Inc."></a>
<ul class="nav">
<li><a href="index.html">Gwna</a></li>
<li><a href="products.html">Produkty</a></li>
<li><a href="buy.html">Kup</a></li>
<li><a href="contact.html">Kontakt</a></li>
</ul>
<form method="get" action="/search">
<fieldset>
<legend>Szukaj</legend>
<input type="text" name="terms" id="terms">
<input type="submit" value="Szukaj">
</fieldset>
</form>
</div>
157
CZ II: NIEZBDNIK
Oczywicie nie pokazalimy caego kodu CSS, ktry ma tu zastosowanie (np. bez niego
cza nawigacyjne znajdowayby si w nieuporzdkowanej licie), ale to nie przeszkadza
w zrozumieniu oglnej idei. Za pomoc pozycjonowania elementy w nagwku moemy
umieszcza w dowolnym miejscu. Wolisz, aby wyszukiwarka bya na grze, a cza
nawigacyjne na dole? Zastp wasno top wasnoci bottom w regule czy i zrb
odwrotnie w regule formularza i gotowe (rysunek 4.46).
.nav {position: absolute; bottom: 0; right: 0;}
.header form {position: absolute; top: 0; right: 0;}
158
Oczywicie trzeba uwaa, aby elementy si nam nie zaczy pokrywa. Moe si tak
zdarzy, gdy np. zwikszymy liczb czy nawigacyjnych o tyle, e bd zajmowa trzy
linijki. Wwczas mog naj na pole wyszukiwarki. To midzy innymi z tego powodu
dotworzenia ukadw wykorzystuje si elementy pywajce zamiast pozycjonowanych
elementy pywajce z natury nie mog na siebie nachodzi. Jeli jednak bdziemy korzysta
z tej techniki z rozwag, to pozycjonowanie bezwzgldne moe nam bardzo uatwi rozmieszczenie
elementw w ograniczonych kontenerach, takich jak np. nagwek czy stopka.
ROZDZIA 4: UKADY
159
<hr>
<ul class="datetime">
<li>Tuesday, 18 May 2010</li>
<li>15:26:37 -0400</li>
</ul>
</div>
CZ II: NIEZBDNIK
Mamy tu tre wpisu oraz dat i godzin publikacji. Mogoby by tego wicej, np. jeszcze
jakie kategorie, znaczniki itp., ale pozostaniemy przy tych dwch porcjach danych, aby
byo prociej. Dziki pozycjonowaniu bezwzgldnemu moemy dat i godzin umieci
wdowolnym miejscu poza obszarem wpisu.
Zaczniemy jak zwykle od utworzenia bloku zawierajcego i tym samym otwarcia
przestrzeni dla informacji o dacie i godzinie:
.entry {position: relative; margin-left: 10em;}
160
ROZDZIA 4: UKADY
POZYCJONOWANIE NA SZTYWNO
NAGWKW I STOPEK
Pamitasz jeszcze ramki? Przy ich uyciu mona byo umieci na grze lub na dole strony
pasek nawigacyjny albo stopk i mie pewno, e nigdy si stamtd nie rusz. Mimo i
sam pomys nie by zy, moliwo t bardzo czsto wykorzystywano do niewaciwych
celw. Teraz przy uyciu CSS mona nie tylko imitowa ramki, lecz rwnie tworzy obiekty
podobne do ramek, ktre jednak w istocie nimi nie s. Kluczem do tego jest pozycjonowanie
stae (ang. fixed positioning).
Zamy, e chcemy, aby nagwek zawsze znajdowa si na samej grze, a tre moga by
przewijana pod nim (rysunek 4.51). atwo to zrobi:
.header {position: fixed; top: 0; left: 0; width: 100%; z-index: 1;}
161
CZ II: NIEZBDNIK
162
Jednym ze sposobw na osignicie tego celu jest dodanie dopenienia do elementu body
o wysokoci nie mniejszej ni wysoko nagwka (rysunek 4.52).
body {padding-top: 100px;}
Rysunek 4.52. Zepchnicie gwnej treci w d, aby nie bya zasaniana przez nagwek
ROZDZIA 4: UKADY
Z tym zwizany jest jeszcze inny problem. Klawisze Page Up i Page Down przewijaj
tre strony o jedn wysoko okna przegldarki. W tej wartoci nie jest uwzgldniony
pozycjonowany na stae nagwek. Jeli zatem kto uyje tych klawiszy, to przy kadym
przewiniciu straci kilka linijek tekstu.
Niestety, nie da si w atwy sposb nakaza przegldarce, aby przewijaa troch mniej. Mona
natomiast zmieni definicj okna, w ktrym jest wywietlana tre (rysunek 4.53). W tym
celu trzeba zastosowa pozycjonowanie stae do elementu div zawierajcego ca tre strony.
Wwczas naley usun dopenienie z elementu body i zastosowa nastpujc regu CSS:
.contain {position: fixed; top: 100px; bottom: 0; width: 100%;}
163
5
ROZDZIA
PODRCZNIK CSS
EFEKTY
CZ II: NIEZBDNIK
COMPLEXSPIRAL
Jest to jeden ze starszych, ale i (moim zdaniem) ciekawszych efektw. Sztuczka ta nosi nazw
complexspiral demo, poniewa tak j nazwaem po jej opracowaniu w 2001 roku. Nawet
teraz, gdy mona j z powodzeniem zastpi przezroczystymi obrazami PNG i kolorami
RGBA, moja technika wci ma swoje zastosowania.
Do jej realizacji potrzeba przynajmniej dwch obrazw (rysunek 5.1).
166
W tej technice najwaniejsz rol odgrywa uycie sowa kluczowego fixed. Oba obrazy
ta zostay umieszczone w lewym grnym rogu obszaru widoku (w tym przypadku okna
przegldarki) i s tam unieruchomione na stae. Nie mog si porusza, nawet gdy tre
dokumentu bdzie przewijana. W zwizku z tym le w jednym miejscu jeden na drugim.
ROZDZIA 5: EFEKTY
167
CZ II: NIEZBDNIK
Na tym polega efekt complexspiral demo. Potrzebne s do tego dwa obrazy o jednakowym
rozmiarze i uzupeniajcej si treci. Jeden z tych obrazw przesania cz drugiego w miejscu,
w ktrym nachodz na siebie obrazy, w ktrych tle si znajduj. Dlatego wanie w tle elementu
div wida przymiony obraz muszli, a w tle elementu body normalny. Obraz w tle elementu
div nie jest wyrwnany z lewym grnym rogiem tego elementu, lecz z lewym grnym rogiem
elementu body. Jak wida na rysunku 5.4, widoczne s tylko te jego czci, ktre krzyuj si
z treci elementu div.
168
Rysunek 5.4. Efekt przymionego obrazu muszli po przewiniciu czci treci strony
Teraz zamy, e chcemy uzyska jeszcze trzeci rodzaj efektu dla nagwkw w treci.
Dotego potrzebny jest jeszcze tylko jeden obraz (rysunek 5.5).
ROZDZIA 5: EFEKTY
Gdy dodamy go do dokumentu za pomoc poniszej reguy, wszystkie nagwki h2 bd
wyglda jak na rysunku 5.6:
div#main h2 {background: url(shell-traced.jpg) top left no-repeat;}
169
CZ II: NIEZBDNIK
Przy okazji warto wspomnie, e w swojej pierwotnej wersji technika complexspiral
demo suya do uzyskiwania efektu przezroczystoci ta. W 2001 roku bya ona wielkim
osigniciem, gdy mao ktra przegldarka obsugiwaa format PNG z kanaem alfa, a ju
adna nie obsugiwaa kolorw z tym kanaem, takich jak np. RGBA. Teraz, gdy format PNG
jest ju szeroko obsugiwany, to zastosowanie opisywanej techniki stracio sens (wicej na jej
temat mona przeczyta na stronie http://meyerweb.com/eric/css/edge/complexspiral/demo.
html). Natomiast jej wykorzystanie opisane w tym podrozdziale jest jak najbardziej aktualne.
170
<ul class="toc">
<li><a href="1.html">Rozdzia 1 <i>W ktrym pojawia si smok</i></a></li>
<li><a href="2.html">Rozdzia 2 <i>W ktrym pojawia si rycerz</i></a></li>
<li><a href="3.html">Rozdzia 3 <i>W ktrym ksiniczka przeywa rozczarowanie</
i></a></li>
</ul>
ROZDZIA 5: EFEKTY
171
CZ II: NIEZBDNIK
MENU CSS
Jeli chcesz, to technik opisan w poprzednim podrozdziale mona wykorzysta do
tworzenia wielopoziomowych menu rozwijanych (osobicie nie cierpi menu rozwijanych,
ale nie znosz te czekolady, kawy, zbyt wysokiego poziomu dwutlenku wgla w atmosferze
i prawie wszystkich alkoholi, a wic co ja tam wiem). Jedn z wielkich zalet tego przykadu
jest to, e doskonale pokazuje, jak bardzo myl si Ci, ktrzy myl, e efekt :hover jest
zarezerwowany wycznie dla hiperczy.
Oto podstawowa struktura HTML (z bardzo uproszczonymi adresami URL dla zachowania
przejrzystoci rysunek 5.10):
172
<ul class="menu">
<li class="sub"><a href="/s1/">Sekcja 1</a>
<ul>
<li><a href="/s1/ss1/">Podsekcja 1</a></li>
<li><a href="/s1/ss2/">Podsekcja 2</a></li>
<li><a href="/s1/ss3/">Podsekcja 3</a></li>
</ul>
</li>
<li class="sub"><a href="/s2/">Sekcja 2</a>
<ul>
<li><a href="/s2/ss1/">Podsekcja 1</a></li>
<li><a href="/s2/ss2/">Podsekcja 2</a></li>
</ul>
</li>
(itd)
</ul>
ROZDZIA 5: EFEKTY
Zrobione. Oczywicie te podmenu bdziemy musieli w odpowiednim momencie wywoa
zpowrotem. Najprostszym i najmniej efektownym wizualnie sposobem na to jest
nastpujca regua:
li.sub:hover > ul {display: block;}
173
CZ II: NIEZBDNIK
NIEREGULARNE KSZTATY
Czasami potrzebujemy na naszych stronach elementw o nieregularnych ksztatach. Mona
to atwo zrobi, stosujc technik (o angielskiej nazwie boxpunch) polegajc na wizualnym
likwidowaniu fragmentw pl elementw. Dziaa ona tylko w elementach o jednolitym
kolorze z obrazami ustawionymi w tle na stae, ale to pozostawia nam i tak due pole
dodziaania.
Najatwiej jest uzyska nieregularny ksztat poprzez umieszczenie w rogu jednego elementu
innego elementu (rysunek 5.13) i ustawienie dla niego ta takiego samego jak to treci
otaczajcej.
body {background: #C0FFEE;}
div.main {background: #BAD;}
.punch {background: #C0FFEE; font-size: 500%; float: left; margin: 0 0.1em 0.1em 0;
padding: 0.1em;}
<div class="main">
<h1 class="punch">Wow.</h1>
(tre)
</div>
174
ROZDZIA 5: EFEKTY
175
CZ II: NIEZBDNIK
176
ROZDZIA 5: EFEKTY
ZAOKRGLANIE ROGW
PRZED NASTANIEM CSS 3
Stosujc kombinacj opisanej powyej techniki boxpunch i sprajtw CSS (opisanych
dalej w tym rozdziale), mona uzyska efekt zaokrglonych rogw, do ktrego realizacji
potrzebny jest tylko jeden obraz i cztery dodatkowe elementy. Zalet tej metody jest to,
ebardzo dobrze wsppracuje z przegldarkami nieliczne problemy maj z ni starsze
przegldarki, takie jak IE 6 czy Safari 2. Wad natomiast jest potrzeba uycia dodatkowych
elementw i obrazu.
Efekt jej zastosowania wida na rysunku 5.18.
177
CZ II: NIEZBDNIK
Przejdmy do kodu CSS. Najpierw zdefiniujemy to, aby widzie, co dokadnie si dzieje
nastronie:
b.c {background: red;} /* regua tymczasowa */
Dziki temu bdziemy dobrze widzie miejsce zaokrgle rogw. Teraz umiecimy
wodpowiednim miejscu naroniki (rysunek 5.19):
b.c {background: red;} /* regua tymczasowa */
.rounded {position: relative; border: 2px solid black; background: white;}
b.c {position: absolute; height: 20px; width: 20px;}
b.tl {top: 0; left: 0;}
b.tr {top: 0; right: 0;}
b.bl {bottom: 0; left: 0;}
b.br {bottom: 0; right: 0;}
178
Rysunek 5.19. Umieszczenie elementw b w naronikach
Jak wida, kady element b znajduje si w odpowiednim naroniku i ma format pola
o wymiarach 20 na 20 pikseli. To ukazuje nam pewien problem elementy znajduj si
wewntrz swoich naronikw, a nam potrzeba, aby ich to przesaniao obramowanie
elementu div, jak na rysunku 5.20:
b.tl
b.tr
b.bl
b.br
{top: 0;
{top: 0;
{bottom:
{bottom:
ROZDZIA 5: EFEKTY
Te dodatkowe deklaracje przesun elementy b na zewntrz, na odlego wystarczajc do
przesonicia obramowania elementu div. Gdyby element ten mia grubsze obramowanie,
trzeba by ustawi oczywicie wiksze wartoci przesunicia.
Teraz potrzebujemy jeszcze tylko obrazu do wstawienia w naroniki. W poprzednim zdaniu
nie ma bdu potrzebny nam bdzie tylko jeden obraz, ktry wida na rysunku 5.21.
179
CZ II: NIEZBDNIK
180
aden problem!
ROZDZIA 5: EFEKTY
Zapewne zauwaye, e elementy b umieciem za treci elementu, ktrego rogi
s zaokrglane. S one pozycjonowane bezwzgldnie, a wic tak naprawd nie ma
znaczenia, gdzie je zapiszemy w tym elemencie. Mog by na pocztku, na kocu, a nawet
przemieszane. Moesz je umieci w miejscu, ktre bdzie dla Ciebie najwygodniejsze.
Najwiksz wad przedstawionej metody jest to, e jeli zmieni si to strony, trzeba
utworzy nowy obraz reprezentujcy naroniki. Co gorsza, jeli na rnych stronach
witryny zastosowane s rne ta, dla kadego z nich trzeba utworzy osobny obraz
inapisa osobny kod CSS. Jeszcze gorzej wyglda sytuacja wwczas, gdy w tle otaczajcym
zaokrglony naronik uyje si niejednolitego koloru, jak np. gradientu czy powtarzalnego
wzoru. Wwczas naroniki nie bd si zgadzay z tym tem. Najlepsze, co moemy w takim
przypadku zrobi, to stara si zminimalizowa liczb takich wypadkw.
I jeszcze jedna uwaga natury historycznej. Technika ta dziaa w przegldarce IE 6 tylko
wtedy, gdy dla elementu div zdefiniuje si bezporednio szeroko. Mona do tego uy
dowolnej jednostki miary, ale jeli pozostawi si domyln warto auto, naroniki nie
zostan wywietlone tam, gdzie powinny by. Jest to drobna usterka, ale warto o niej
wiedzie. Przegldarka IE 6 nie obsuguje te przezroczystoci obrazw PNG, a wic trzeba
je zastpi obrazami w formacie GIF albo cakiem ukry ten efekt przed t przegldark.
Uytkownikom nic si przecie zego nie stanie, jeli nie obejrz zaokrglonych naronikw.
To wszystko! Pomijajc fakt, e ten kod nie zadziaa w prawie adnej przegldarce, poniewa
wasno border-radius nie zostaa jeszcze ukoczona, to wszystko, czego nam potrzeba.
Aby zmusi t regu do dziaania w przegldarkach, ktre j obsuguj, tzn. Safari, Chrome
i Firefox, trzeba doda prefiks identyfikujcy producenta a nawet dwa prefiksy (rysunek 5.24).
Naley te zostawi wersj bez prefiksu, ktra zacznie dziaa, gdy wasno zostanie ju
oficjalnie zaimplementowana w przegldarkach.
.rounded {background: #FFF; border: 2px solid #000;
-moz-border-radius: 20px;
-webkit-border-radius: 20px;
border-radius: 20px;}
181
CZ II: NIEZBDNIK
182
ROZDZIA 5: EFEKTY
Wynik tego dziaania wida na rysunku 5.26.
SPRAJTY CSS
Sprajty CSS to technika z 2004 roku, ktrej autorem jest Dave Shea (znany z CSS Zen Graden).
Jest to metoda tworzenia bardzo szybkich efektw :hover. Od chwili ich wymylenia sprajty
CSS s wykorzystywane do redukcji obcienia serwerw poprzez czenie wielu obrazw
dekoracyjnych w jeden.
W najprostszej postaci sprajt CSS to obraz skadajcy si z dwch czci reprezentujcych
dwa stany ikony np. dla normalnego widoku odnonika i widoku podwietlonego,
aktywowanego po najechaniu na niego kursorem. Przykad takiego obrazu wida
narysunku 5.27.
183
CZ II: NIEZBDNIK
Ta regua wyrwnuje je w pionie do rodka cza i po jego lewej stronie. Aby teraz
zawieci ikon, gdy uytkownik najedzie na odnonik kursorem (rysunek 5.28),
naleytylko zmieni pooenie obrazu w tle.
.navbar li a:hover {background-position: -395px 50%;}
184
li
li
li
li
li
ROZDZIA 5: EFEKTY
li
li
li
li
Jeli mylisz, e taki obraz jest o wiele wikszy ni suma dwch pojedynczych obrazw, to si
mylisz. Algorytm kompresji obrazw GIF ma t waciwo, e rozmiar pliku bez wzgldu na
to, czy ikony oddzielimy przestrzeni 4, czy 4000 pikseli, pozostaje ten sam, jeli piksele w tym
obszarze s tego samego koloru (w tym przypadku jest akurat brak koloru). Jeli wemiesz
pod uwag rozmiar dodatkowych nagwkw HTTP i obcienie serwera spowodowane
koniecznoci obsuenia dwch da, po jednym dla kadego obrazu, uycie sprajtw
okae si lepszym rozwizaniem.
To wyjania, dlaczego twrcy niektrych witryn pakuj wszystkie ikony, zaokrglenia rogw
i inne elementy dekoracji graficznych w jednym duym obrazie, a pniej wywietlaj
odpowiedni ikon, sterujc ustawieniami pooenia ta.
Moe takie podejcie w Twoim przypadku byoby przesad, ale warto si nad tym zastanowi.
Moesz znale wicej zastosowa dla sprajtw, ni Ci si pocztkowo wydawao.
SLIDING DOORS
Technika Sliding Doors (przesuwane drzwi) zostaa spopularyzowana w 2003 roku przez
Douga Bowmana. Jest to metoda tworzenia bardzo fajnych zakadek z tekstowych czy
nawigacyjnych. Ale oglnie metod t mona zaadaptowa take do uzyskania innych
efektw ni tylko zakadki.
Na rysunku 5.30 wida interesujcy nas docelowy efekt.
185
CZ II: NIEZBDNIK
Jeli sowo Kup! bdzie trzeba zamieni na Do kasy albo Zapisz, wystarczy tylko zmieni
tekst w kodzie HTML.
No dobrze, to jak w takim razie utworzy te zakadki? Przede wszystkim potrzebny jest duy
obraz zakadki. Taki naprawd duy, jak na rysunku 5.31.
186
ROZDZIA 5: EFEKTY
ul.nav, ul.nav li {float: left; margin: 0; padding: 0; list-style: none;}
ul.nav {width: 100%;}
ul.nav li {background: url(tab-right.png) no-repeat 100% 0;}
ul.nav li a {background: url(tab-left.png) no-repeat;
display: block; padding: 10px 25px 5px;
font: bold 1em sans-serif; text-decoration: none; color: #000;}
Wad tej metody jest to, e przy pierwszym najechaniu kursorem na element trzeba chwil
poczeka na zmian obrazu, a zostanie on pobrany z serwera. Aby tego unikn, mona
opisywan tu metod poczy z technik sprajtw opisan wczeniej. Teraz obrazy kart
wygldaj tak jak na rysunku 5.34.
187
CZ II: NIEZBDNIK
A oto odpowiedni kod CSS:
ul.nav li:hover {background-position: 100% 400px;}
ul.nav li:hover a {background-image: 0 400px;}
Mona te zmieni orientacj zakadek i ustawi je np. wzdu bocznej krawdzi strony.
Wwczas duy obraz trzeba by poci poziomo zamiast pionowo, jak wida na rysunku 5.35.
188
ROZDZIA 5: EFEKTY
Sposb dodania efektu najechania kursorem jest taki sam jak poprzednio wystarczy uy
techniki sprajtw.
Wybiegajc nieco w przyszo, kiedy zapewne doczekamy si powszechnej obsugi wielu
obrazw w tle, co pozwoli nam na zoenie wszystkich elementw zakadek w tle jednego
elementu.
189
CZ II: NIEZBDNIK
Rozwizanie tego problemu wymaga sprytu. Najpierw przesuniemy element a w lewo, poza
element li, co mona zrobi na kilka sposobw. Najprociej bdzie przesun te elementy
wlewo za pomoc pozycjonowania wzgldnego (rysunek 5.39), przy czym trzeba zapewni
im odpowiednio duo miejsca.
ul.nav, ul.nav li {float: left; margin: 0; padding: 0; list-style: none;}
ul.nav {width: 100%;}
ul.nav li {background: url(tab-clip-right.gif) no-repeat 100% 0;
margin-right: 25px;}
ul.nav li a {background: url(tab-clip-left.gif) no-repeat;
display: block; padding: 10px 0 5px 25px;
position: relative; left: -25px;}
190
Kady element a jest teraz przesunity o 15 pikseli w lewo. Samo to jednak nie wystarcza,
poniewa teraz odnoniki od drugiego do koca nachodziyby na element listy, ktry
znajduje si przed nimi. Dlatego dodaem do elementw listy 15-pikselowy prawy margines,
aby zrobi miejsce dla elementw a i zapobiec ich nakadaniu si i powstawaniu luk.
Mamy jednak jeszcze jeden may problem. Prawa strona kadej zakadki nie bdzie
dajcym si klika czem, poniewa cza przesunlimy w lewo (przyjrzyj si dokadnie
rysunkowi 5.39, na ktrym wida zwyk strzak nad ostatni zakadk). Dlatego
lepszym rozwizaniem jest pomajstrowanie przy marginesach. Zmienimy ostatni regu
nastpujco:
ul.nav li a {background: url(tab-clip-left.gif) no-repeat;
display: block; padding: 10px 25px 5px; margin-left: -25px;}
W tym wypadku lewa krawd kadego cza zostaje przecignita o 15 pikseli w lewo od
lewej krawdzi elementu listy. Dziki temu cze zakrywa prawy margines, rozszerzajc si
od poprzedniego elementu listy, tak jak w przypadku pozycjonowania wzgldnego. Tym
razem jednak prawa krawd cza pozostaje wyrwnana z praw krawdzi elementu listy,
zamiast si od niej odsuwa. Dziki temu zakadki dziaaj zgodnie z oczekiwaniami, na co
wskazuje ikona doni widoczna na rysunku 5.40, a przycite rogi pozwalaj przewitywa
tu strony.
ROZDZIA 5: EFEKTY
PARALAKSA CSS
Paralaksa CSS (ang. CSS parallax) to bardzo ciekawa i przyjemna w implementacji
na stronie technika, dziki ktrej mona si dowiedzie, jak za pomoc prostego
pozycjonowania procentowego obrazw w tle mona wywoa niespodziewane efekty
(niestety, trudno jest to pokaza w druku, dlatego najlepiej wyprbowa opisywane tu
techniki na swoim komputerze).
Najpierw zobaczymy, na czym polega pozycjonowanie procentowe. Zamy, e okrelilimy
pooenie obrazu w tle za pomoc wartoci 50% 50%. To spowoduje, e rodek obrazu
pokryje si ze rodkiem obszaru ta. Gdybymy np. zmienili t warto na 100% 100%,
to prawy dolny rg obrazu w tle pokryby si z prawym dolnym rogiem obszaru ta.
Narysunku 5.41 wida dwa przykady pozycjonowania obrazw w tle.
191
Zamy te, e mamy obraz ice-1.png o szerokoci 400 pikseli. W oknie przegldarki
o szerokoci 800 pikseli 300. piksel, liczc od lewej krawdzi tego obrazu, zostanie
wyrwnany z 600. pikselem od lewej krawdzi elementu body, jak wida na rysunku 5.42.
CZ II: NIEZBDNIK
192
ROZDZIA 5: EFEKTY
Dwie warstwy adnie nam si naoyy na siebie. Wracajc do sedna sprawy, w miar
zwania lub poszerzania okna sople w elemencie div#main bd przesuway si obok sopli
elementu body. Samo to ju jest ciekawe, ale pjdmy o krok dalej i przesumy to elementu
body, aby nie byo wyrwnane do lewej.
body {background: url(ice-1.png) 25% 0 repeat-x; width: 100%;
padding: 0; margin: 0;}
div#main {background: url(ice-2.png) 75% 0 repeat-x; width: 100%;}
Teraz przy zmianie rozmiaru okna przegldarki bd si przesuwa oba obrazy sopli, ale
kady z inn prdkoci. Sople w tle elementu body bd si przesuwa z prdkoci rwn
jednej czwartej prdkoci zmiany rozmiaru okna, natomiast sople w tle elementu div#main
z prdkoci rwn trzem czwartym prdkoci zmiany rozmiaru okna. Jeli wic bdziemy
zmienia rozmiar okna z szybkoci 12 pikseli na sekund, to to elementu body bdzie si
przesuwa z prdkoci 3 pikseli na sekund, a elementu div#main 9.
Aby to poruszao si z wiksz prdkoci ni szybko zmiany rozmiaru okna, naleaoby
warto pooenia poziomego ustawi powyej 100%. Gdybymy chcieli, aby obraz przesuwa si
dwa razy szybciej, ni zmieniamy rozmiar okna, wasno background-position powinnimy
ustawi na 200% 0 przy zaoeniu, e obraz ma znajdowa si pod grn krawdzi okna.
Gdybymy chcieli, aby obraz znajdowa si przy dolnej krawdzi okna, naleaoby zastosowa
warto 200% 100%, natomiast aby go wyrodkowa w pionie 200% 50%.
Teraz bdzie najlepsze jeli zastosuje si ujemne wartoci procentowe, obrazy bd si
przesuwa w kierunku przeciwnym do kierunku zmiany rozmiaru okna.
Innymi sowy, w miar rozszerzania okna obraz w tle bdzie przesuwa si w lewo, a w miar
jego zwania w prawo, np.:
body {background: url(ice-1.png) -75% 0 repeat-x; width: 100%;
padding: 0; margin: 0;}
div#main {background: url(ice-2.png) 75% 0 repeat-x; width: 100%;}
193
CZ II: NIEZBDNIK
194
Na pierwszy rzut oka wydaje si to niemoliwe, prawda? A w rzeczywistoci byo bardzo proste.
Aby uzyska taki efekt, wystarczy tylko podzieli krzyw na stos segmentw i zamieni
skadajce si na ni obrazy w elementy pywajce w lewo. Wycite fragmenty maj
wysoko 20 pikseli i przezroczyste to w obszarze poza sam krzywizn (rysunek 5.45).
ROZDZIA 5: EFEKTY
Zwr uwag, e kady fragment ma szeroko odpowiadajc widocznej czci krzywej.
Teraz trzeba tylko te kawaki wprowadzi na stron w wybranym miejscu.
<div class="curves">
<img src="curve_1.gif"
<img src="curve_2.gif"
<img src="curve_3.gif"
<img src="curve_4.gif"
<img src="curve_5.gif"
</div>
alt="">
alt="">
alt="">
alt="">
alt="">
Oczywicie im wicej kawakw, tym wicej potrzeba elementw img. Kod CSS potrzebny
do tego jest ju bardzo prosty:
.curves img {float: left; clear: left; margin-right: 1em;}
195
CZ II: NIEZBDNIK
196
Rysunek 5.47. Bardziej pofalowany ksztat z liniami cicia
ROZDZIA 5: EFEKTY
Kod CSS uyty do realizacji tego zadania jest taki sam jak poprzednio. Zmieniy si tylko
fragmenty obrazu.
Jedna uwaga im wiksze bd rnice w szerokoci krzywizny midzy kolejnymi
fragmentami obrazu, tym wiksze ryzyko, e tekst najdzie na obraz. Moe si tak sta
dlatego, e przegldarki nie sprawdzaj kadego piksela wzdu pola liniowego, aby si
dowiedzie, czy nie nachodzi na element pywajcy. Mog np. sprawdza tylko lewy grny
rg pola. Jeli odlego wynosi tylko kilka pikseli nad znacznie szerszym pywajcym
obrazem, to tekst najdzie na obraz.
Oczywicie tworzenie tych wszystkich skrawkw jest dosy mudne, nie mwic ju
o dodatkowym obcieniu serwera. Na szczcie istnieje te ulepszona wersja tej techniki,
ktrej opis znajduje si w nastpnym podrozdziale.
197
CZ II: NIEZBDNIK
198
ROZDZIA 5: EFEKTY
<div class="curves">
<div></div>
<div style="width: 42px; background-position: 0 20px;"></div>
<div style="width: 21px; background-position: 0 40px;"></div>
<div style="width: 10px; background-position: 0 60px;"></div>
<div style="width: 5px; background-position: 0 80px;"></div>
</div>
199
CZ II: NIEZBDNIK
Pniej mona wyznaczone rozmiary skopiowa bezporednio do dokumentu HTML.
Narysunku 5.52 wida ostateczny wynik.
<div class="curves">
<div style="width: 8px; height: 40px;"></div>
<div style="width: 25px; height: 20px; background-position: 0 40px;"></div>
<div style="width: 50px; height: 15px; background-position: 0 60px;"></div>
<div style="width: 75px; height: 15px; background-position: 0 75px;"></div>
<div style="width: 92px; height: 20px; background-position: 0 90px;"></div>
<div style="width: 97px; height: 15px; background-position: 0 110px;"></div>
<div style="width: 100px; height: 50px; background-position: 0 125px;"></div>
<div style="width: 97px; height: 15px; background-position: 0 175px;"></div>
<div style="width: 92px; height: 20px; background-position: 0 190px;"></div>
<div style="width: 75px; height: 15px; background-position: 0 210px;"></div>
<div style="width: 50px; height: 15px; background-position: 0 225px;"></div>
<div style="width: 25px; height: 20px; background-position: 0 240px;"></div>
<div style="width: 8px; height: 40px; background-position: 0 260px;"></div>
</div>
200
ROZDZIA 5: EFEKTY
POLA OBRAZW
Wiele osb nie ma pojcia o pewnej wanej waciwoci obrazw maj one taki sam model
polowy jak wszystkie inne elementy. To znaczy, e mona im przypisywa to, dopenienie itp.
Co mona z tym zrobi? Jedn z moliwoci jest wypenianie kolorem ta prostoktnych
ikon z przezroczystymi powierzchniami. Wyglda to mniej wicej tak (rysunek 5.53):
img.icon {background-color: #826;}
img.icon:hover {background-color: #C40;}
src="flake-a.png"
src="flake-a.png"
src="flake-a.png"
src="flake-b.png"
src="flake-b.png"
src="flake-b.png"
class="flake1"
class="flake2"
class="flake3"
class="flake1"
class="flake2"
class="flake3"
alt="">
alt="">
alt="">
alt="">
alt="">
alt="">
201
CZ II: NIEZBDNIK
Rwnie dobrze mona stosowa dopenienie. czc dopenienie, kolor ta i obramowanie,
mona uzyska imitacj nawet dwukolorowego obramowania (rysunek 5.55).
img.twotone {background: #C40; padding: 5px; border: 5px solid #4C0;}
Rysunek 5.55. Dwukolorowe obramowanie utworzone przy uyciu wasnoci obramowania i dopenienia
A jeli dodamy jeszcze obrys, to uzyskamy obramowanie nawet w trzech kolorach
(rysunek 5.56).
img.threetone {background: #C40; padding: 5px; border: 5px solid #4C0; outline:
5px solid #40C;}
202
Rysunek 5.56. Trjkolorowe obramowanie utworzone przy uyciu wasnoci obramowania, dopenienia i obrysu
Ta prosta regua sprawi, e szeroko obrazw nigdy nie przekroczy szerokoci elementu
je zawierajcego, a jeli element ten bdzie od nich szerszy, to bd przyjmoway swoj
naturaln szeroko. Obrazy mona dodatkowo wyrodkowa:
img {max-width: 100%; display: block; margin: 0 auto;}
Na rysunku 5.57 wida jeden obraz w trzech elementach nadrzdnych o rnych szerokociach:
dwa pierwsze s wsze od obrazu, a trzeci szerszy (krawdzie elementw nadrzdnych
soznaczone kolorem zielonym).
ROZDZIA 5: EFEKTY
203
III
CZ
III
NAJNOWSZE
TECHNIKI
Rozdzia 6. Tabele
Rozdzia 7. Pie przyszoci
6
ROZDZIA
PODRCZNIK CSS
TABELE
208
ROZDZIA 6: TABELE
209
210
Zamy teraz, e pod nagwkami kolumn i nad wierszem sum w stopce chcemy
narysowa lini, jak na rysunku 6.3. Do tego nie potrzebujemy adnych klas, wystarczy
wykorzysta struktur samej tabeli.
thead th {border-bottom: 1px solid #333; text-align: center; font-weight: bold;}
tfoot th, tfoot td {border-top: 2px solid #666; color: #363;}
Rysunek 6.3. Wizualne oddzielenie od treci gwnej tabeli jej nagwka i stopki
ROZDZIA 6: TABELE
NAGWKI WIERSZY
W poprzednim podrozdziale wspomniaem o nagwkach wierszy. A co to takiego?
Dotej pory mylaem, e nagwek moe mie tylko kolumna. Nieprawda! W jzyku
HTML jest atrybut sucy do zaznaczania, czy dany element th odgrywa rol nagwka
wiersza kolumny.
Spjrz na poniszy kod HTML:
<table>
<thead>
<tr>
<th></th>
<th>Wizyt na stronie</th>
<th>Odwiedzajcych </th>
</tr>
</thead>
<tbody>
<tr>
<th>Stycze 2010</th>
<td>1 367 234</td>
<td>326 578</td>
</tr>
<tr>
<th>Luty 2010</th>
<td>1 491 262</td>
<td>349 091</td>
</tr>
</tbody>
</table>
Kady wiersz w elemencie tbody zaczyna si od elementu th. To s wanie nagwki wierszy.
Czowiek na pewno odgadnie, e odnosz si one do danych, ktre znajduj si za nimi
wwierszu. Przegldarka te moe byaby w stanie to wydedukowa, ale mimo to lepiej jest
zaznaczy to w sposb jasny i wyrany:
<table>
<thead>
<tr>
<th></th>
<th scope="col">Wizyt na stronie</th>
<th scope="col">Odwiedzajcych </th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Stycze 2010</th>
<td>1 367 234</td>
211
212
To moe by bardzo przydatny punkt zaczepienia dla stylw. W tym akurat przypadku
taki sam efekt mona by uzyska za pomoc selektorw thead th i tbody th, ale moe si
zdarzy, e nagwki wierszy bd znajdowa si w elemencie thead lub nagwki kolumn
welemencie tbody. Dlatego najlepiej jest mie obie techniki pod rk.
W przegldarkach czytajcych tre stron atrybut scope moe teoretycznie uatwia
powizanie nagwkw kolumn i wierszy z odpowiednimi komrkami, a wic umoliwi
zrozumienie treci tabeli. Gdyby taka przegldarka odczytaa zawarto powyszej tabeli,
pierwszy wiersz mgby brzmie mniej wicej tak: Wizyt na stronie stycze dwa tysice
dziesi trzysta szedziesit siedem tysicy dwiecie trzydzieci cztery odwiedzajcych
stycze dwa tysice dziesi trzysta dwadziecia sze tysicy piset siedemdziesit osiem
(w miejscu mylnika przegldarka powiedziaaby co w rodzaju komrka danych
wiadomo, o co chodzi).
Znowu nie bez powodu uyem sowa teoretycznie. Mimo i niektre mwice
przegldarki obsuguj ju atrybut scope, to funkcja ta jest w nich zwykle domylnie
wyczona.
ROZDZIA 6: TABELE
komrka
komrka
komrka
komrka
komrka
1</td>
2</td>
3</td>
4</td>
5</td>
komrka
komrka
komrka
komrka
komrka
1</td>
2</td>
3</td>
4</td>
5</td>
Utworzylimy trzy kolumny, z ktrych jedna obejmuje dwie komrki w wierszu, a dwie
pozostae po jednej. To w sumie cztery komrki na wiersz, a wida, e kady wiersz ma
pi komrek. To oznacza, e ostatnia komrka w kadym wierszu nie naley strukturalnie
do kolumny.
No dobrze, to jak sformatowa kolumny, ktre mamy (rysunek 6.5)? Wydaje si, e to proste,
bo wystarczy zastosowa style do elementw col.
col {background: red; width: 10em;}
213
214
Zatem mimo i teoretycznie kolumny mona atwo formatowa przy uyciu elementu
col, w rzeczywistoci metoda ta jest niezwykle ograniczona. Jeli wic chcesz naprawd
1,
1,
1,
1,
1,
komrka
komrka
komrka
komrka
komrka
1</td>
2</td>
3</td>
4</td>
5</td>
2,
2,
2,
2,
1,
komrka
komrka
komrka
komrka
komrka
1</td>
2</td>
3</td>
4</td>
5</td>
ROZDZIA 6: TABELE
Aby teraz zmieni kolor ta wybranej kolumny na czerwony, wystarczy napisa regu CSS
zselektorem odnoszcym si do odpowiedniej klasy komrek. Poniszy kod da taki sam efekt,
jak wida na rysunku 6.5.
.c1, .c2, .c3, .c4 {background: red; width: 10em;}
Zarwno HTML, jak i CSS w tej metodzie s mniej eleganckie ni poprzednio. Zalet tego
rozwizania jest jednak to, e pozwala na uywanie wszystkich wasnoci CSS, ktre maj
zastosowanie do komrek tabeli (prawie wszystko oprcz marginesw). Jeli wic chcesz
wyrwna zawarto komrek do rodka i pochyli tekst, nic prostszego (rysunek 6.6).
.c1, .c2, .c3, .c4 {background: red; width: 10em;
text-align: center; font-style: italic;}
</tr>
<tr class="last">
215
Musisz jeszcze tylko dostosowa swj kod CSS do tych nowych punktw zaczepienia.
td.c2 {border: 2px solid #000; border-width: 0 2px;}
tr.first td.c2 {border-top-width: 2px;}
tr.last td.c2 {border-bottom-width: 2px;}
Teraz poka Ci nieco nietypowy sposb formatowania kolumn, ktry nie wymaga
stosowania adnych dodatkowych klas. Najpierw usumy wszystkie klasy z naszego kodu.
216
<table>
<tbody>
<tr>
<td>Wiersz
<td>Wiersz
</tr>
<tr>
<td>Wiersz
<td>Wiersz
</tr>
</tbody>
</table>
1, komrka 1</td>
1, komrka 5</td>
2, komrka 1</td>
1, komrka 5</td>
Rysunek 6.8. Formatowanie kolumny przy uyciu selektorw dziecka i elementu siostrzanego
Elegancko czy nie? Zaley od gustu.
ROZDZIA 6: TABELE
Jedna rzecz, o ktrej naley pamita przy zastosowaniu tej metody, to to, e uycie komrek
obejmujcych kilka kolumn obrci nasz wysiek wniwecz. Z drugiej strony, jeli tworzysz
komrki obejmujce po kilka kolumn, to raczej nie planujesz formatowania caych kolumn
(no moe Ty tak, ale wikszo ludzi tego nie robi). Jeli rozcigasz komrki na kilka
kolumn, to najlepszym dla Ciebie rozwizaniem bdzie zastosowanie metody z klasami.
<tr id="WY">
<th scope="row">WY</th>
<td>1</td>
</tr>
</tbody>
</table>
Mamy nieco wicej ni 47 wierszy danych, ktre chcemy umieci na mapie. To jest wanie
druga rzecz, ktrej potrzebujemy obraz mapy (rysunek 6.9).
217
218
Majc map, mona zacz wyznacza miejsce wywietlenia wszystkich porcji danych. W tym
celu musimy znale przybliony rodek kadego ze stanw. Zrobiem to w ten sposb, e
otworzyem obraz mapy w edytorze grafiki i znalazem wsprzdne X i Y kadego punktu,
po czym zapisaem je w postaci listy:
AL
692
448
AK
210
560
330
300
WY
W tych punktach umiecimy nasze informacje, ale to nie oznacza, e wartoci bdziemy
wyraa w pikselach przeliczymy je na procenty wymiarw obrazu. Ta mapa ma wymiary
1000700 pikseli. W zwizku z tym kad wsprzdn poziom dzielimy przez 1000,
pionow przez 700 i otrzymujemy:
AL
69,2%
64%
AK
21%
80%
33%
42,9%
WY
List moemy odoy na razie na bok, bo teraz zajmiemy si pisaniem kodu CSS.
Najpierw sprawiamy, aby mapa w ogle zostaa wywietlona:
ROZDZIA 6: TABELE
table, table * {margin: 0; padding: 0; font: 1em/1 sans-serif;}
table {display: block; width: 1000px; height: 700px;
background: url(us-state-map.gif) no-repeat;}
219
220
Jak wida, jednak nie wszystko jest na swoim miejscu. Powodem tego jest to, e punkt
rodkowy (albo przynajmniej punkty wypadajce w sensownym miejscu na powierzchni
stanu) kadego stanu zosta wybrany podczas sporzdzania listy. Zastosowanie tych wartoci
jako grnego i lewego przesunicia umieszcza lewy grny rg kadego pozycjonowanego
elementu w wybranych punktach. Zatem pozycjonowane elementy tr znajduj si poniej
ina prawo od tych punktw.
ROZDZIA 6: TABELE
221
222
ROZDZIA 6: TABELE
223
224
WYKRESY Z TABEL
Czasami dane tabelaryczne nadaj si do przedstawienia w postaci wykresu. Zbiorw
danych tego typu jest wcale niemao, mog to by np. informacje o kwartalnych zarobkach,
wykaz najwyszych i najniszych temperatur w poszczeglnych tygodniach albo rednie
wartoci opadw w cigu roku.
Wemy jednak co bliszego naszemu sercu, czyli dane na temat liczby pocze z serwerem
i odwiedzin serwisu internetowego.
ROZDZIA 6: TABELE
<table summary="Poczenia z serwerem i wywietlenia strony w serwisie meyerweb.
com w okresie od
10.01 do
19.01">
<caption>Ruch sieciowy</caption>
<thead>
<tr>
<th scope="col">Dzie</th>
<th scope="col" class="hits">Poczenia</th>
<th scope="col" class="views">Wywietlenia</th>
</tr>
</thead>
<tbody>
<tr id="day01">
<th scope="row">10.01</th>
<td class="hits">151 308</td> <td class="views">70 342</td>
</tr>
<tr id="day02">
<th scope="row">11.01</th>
<td class="hits">138 887</td> <td class="views">70 410</td>
</tr>
<tr id="day03">
<th scope="row">12.01</th>
<td class="hits">106 563</td> <td class="views">58 383</td>
</tr>
<tr id="day04">
<th scope="row">13.01</th>
<td class="hits">117 551</td> <td class="views">64 181</td>
</tr>
<tr id="day05">
<th scope="row">14.01</th>
<td class="hits">251 969</td> <td class="views">171 790</td>
</tr>
<tr id="day06">
<th scope="row">15.01</th>
<td class="hits">213 228</td> <td class="views">134 238</td>
</tr>
<tr id="day07">
<th scope="row">16.01</th>
<td class="hits">186 099</td> <td class="views">113 014</td>
</tr>
<tr id="day08">
<th scope="row">17.01</th>
<td class="hits">246 637</td> <td class="views">161 287</td>
</tr>
<tr id="day09">
<th scope="row">18.01</th>
225
Dane te w surowej postaci w przegldarce wygldaj tak, jak wida na rysunku 6.16.
226
Wasnociom height i width mona nada wartoci w dowolnej jednostce, ale zdecydowaem
si na piksele, poniewa na ich przykadzie najatwiej jest objani obliczenia arytmetyczne,
ktre bdzie trzeba pniej wykona. Moesz jednak spa spokojnie, nic, co tu bdziemy
robi, nie wymaga stosowania pikseli. Po zakoczeniu pracy bdzie je mona wymieni
nadowoln inn jednostk. Wasno outline zostaa zdefiniowana tylko tymczasowo,
abybyo lepiej wida efekt naszej pracy.
ROZDZIA 6: TABELE
Zaczynamy pozycjonowanie zawartoci tabeli:
tr, th, td {display: block; position: absolute;}
tbody tr {left: 0; bottom: 0; width: 10%; height: 100%;}
Dla wierszy w elemencie tbody zostaa zdefiniowana szeroko 10%, poniewa maj one by
uoone w jednej linii, a jest ich wanie dziesi (czyli 100% szerokoci tabeli podzielilimy
przez 10 elementw). Nastpnie rozmieszczamy wiersze jeden obok drugiego (rysunek 6.17):
#day02 {left: 10%;}
#day03 {left: 20%;}
#day04 {left: 30%;}
#day05 {left: 40%;}
#day06 {left: 50%;}
#day07 {left: 60%;}
#day08 {left: 70%;}
#day09 {left: 80%;}
#day10 {left: 90%;}
tbody td {bottom: 0;}
227
Po powtrzeniu tego procesu dla wszystkich dziesiciu wierszy otrzymamy efekt widoczny
na rysunku 6.18.
228
Ten prosty dodatek sprawi, e supki stay si bardzo dobrze widoczne. Gdybymy usunli
ten przerywany obrys, to otrzymalibymy prawie gotowy wykres. Jest jeszcze tylko jeden
powany problem, ktry dotyczy elementw thead i caption ich zawarto cay czas
wisi w lewym grnym rogu. Oprcz tego mamy kilka mniejszych problemw, jak choby
to, e supki po lewej stronie maj rne szerokoci, a najwyszy supek, reprezentujcy
dzie 1/14/10, nachodzi na tre elementu th.
ROZDZIA 6: TABELE
229
230
Co jeszcze zostao? Elementy thead i caption wci gnied si w lewym grnym rogu.
Drugi z nich umiecimy pod tabel i wyrodkujemy oraz pogrubimy jego tekst:
caption {position: absolute; bottom: -1.75em; width: 100%; text-align: center;
font-weight: bold;}
ROZDZIA 6: TABELE
Rwnie dobrze mona by zamieni selektor tr, th, td na bardziej szczegowy tbody
tr, tbody th, tbody td. Wwczas nie musielibymy usuwa pozycjonowania potomkw
elementu thead, ale musielibymy napisa regu thead * {display: block;}, aby zmusi
komrki do uoenia si jedna nad drug.
Wynik w obu przypadkach byby taki sam (rysunek 6.22). Po zrobieniu tego
(niewane,wjaki sposb) moemy zdefiniowa pooenie elementu thead.
thead {position: absolute;
top: 50%; margin-top: -2.5em;
left: 100%; margin-left: 2.5em;}
231
7
ROZDZIA
PODRCZNIK CSS
PIE
PRZYSZOCI
234
235
236
<div class="figure">
<img src="spring.jpg" alt="Dziewczynka z warkoczami, odwrcona tyem
do aparatu, huta si na hutawce w zachodzcym socu zasanianym na zdjciu
przez poprzeczk hutawki.">
<div class="figcaption">Wiosenne hutanie</div>
</div>
ZAPYTANIA O MEDIA
Temu tematowi mona by powici cay rozdzia, jeli nie ksik. Dlatego pamitaj, e
wszystko, co tu zostao napisane, to jedynie krtkie streszczenie dostpnych moliwoci.
Koniecznie poszukaj dodatkowych informacji na ten temat, gdy pod wieloma wzgldami
tak bdzie wygldaa przyszo formatowania za pomoc stylw.
Zapytania o media pozwalaj na tworzenie blokw warunkowych stylw do zastosowania
wrnych rodowiskach medialnych. Np. mona napisa oddzielny arkusz stylw dla ekranw
o standardowych wymiarach i oddzielny dla ekranw panoramicznych. Mona te zmienia
kolorystyk w zalenoci od obsugiwanej przez urzdzenie gbi kolorw albo parametry
pisma w zalenoci od zagszczenia pikseli na ekranie. Mona nawet zmienia ukad strony
(rysunek 7.3) na podstawie informacji o szerokoci ekranu i dostpnej na nim liczbie pikseli.
237
Mimo niewtpliwych zalet tego kodu (zwaszcza jeli chodzi o oszczdno) istnieje due
ryzyko, e na maych tzn. wskich ekranach wystpi problemy. A gdybymy w takich
sytuacjach mogli magicznie zmienia ukad na dwukolumnowy?
Okazuje si, e moemy. Najpierw musimy zdefiniowa warunek, e ukad trzykolumnowy
ma by wywietlany tylko wtedy, gdy dostpne jest przynajmniej 800 pikseli powierzchni
poziomej. Mona to zrobi, dzielc deklaracje czci ukadu na osobne reguy.
238
Pierwszy wiersz tej reguy mona przetumaczy nastpujco: deklaracje w tym bloku maj
zastosowanie we wszystkich mediach o szerokoci ekranu nie mniejszej ni 800 pikseli.
Jeli szeroko ekranu bdzie choby odrobin mniejsza, deklaracje w tej regule zostan
zignorowane. Zwr uwag na nawiasy otaczajce skadnik min-width i jego warto tego
typu deklaracje (nazywane wyraeniami) naley zawsze umieszcza w nawiasach okrgych.
Po wprowadzeniu tych modyfikacji wszystko pozostanie bez zmian, dopki nie zmniejszymy
okna przegldarki do szerokoci poniej 800 pikseli (rysunek 7.4). Po przekroczeniu tego
progu kolumny przestan pywa jedna obok drugiej.
Na koniec mona jeszcze doda style dla ukadu jednokolumnowego, gdy szeroko ekranu
bdzie mniejsza od 500 pikseli (rysunek 7.6).
@media all and (max-width: 499px) {
#one {text-align: center;}
#one li {display: inline; liststyle: none;
padding: 0 0.5em;
border-right: 1px solid gray;
line-height: 1.66;}
#one li:last-child {border-right: 0;}
#three {display: none;}
}
239
Rysunek 7.5. Zmieniony ukad dla szerokoci okna od 500 do 800 pikseli
240
Rysunek 7.6. Ukad jednokolumnowy stosowany w oknach o szerokoci poniej 500 pikseli
W tym przypadku przecinki odgrywaj rol logicznego LUB, a wic pierwsze zapytanie
naley odczyta tak: stosuj te style w mediach drukowanych LUB TV LUB w obszarze
roboczym w mediach ekranowych, ktrych szeroko wynosi przynajmniej 800 pikseli.
A gdybymy chcieli zastosowa ukad trzykolumnowy we wszystkich mediach innych ni
typu screen? Naley doda do pierwszego zapytania instrukcj z modyfikatorem not, ktry
bdzie oznacza wszystko, co nie jest ekranem.
@media not screen, screen and (min-width: 800px) {...}
@media screen and (min-width: 500px) and (max-width: 799px) {...}
@media screen and (max-width: 499px) {...}
Tak jak poprzednio, przecinek odgrywa rol operatora logicznego LUB, a wic zapytanie to
mona przeczyta nastpujco: wszystko, co nie jest w medium ekranowym, LUB obszar
roboczy na ekranie medium, ktrego szeroko wynosi przynajmniej 800 pikseli.
Istnieje rwnie modyfikator only sucy do tworzenia zapyta typu only print (tylko
druk) albo only screen and color (tylko ekran i kolor). Na razie jedynie modyfikatory
not i only s w zapytaniach o media.
Przy okazji warto wspomnie, e w zapytaniach nie ma obowizku uywania tylko pikseli
jako jednostek. Mona w nich uywa jednostki em, procentw i wszystkich pozostaych.
W tabeli 7.1 znajduje si zestawienie wszystkich skadnikw do budowy zapyta o media.
Prawie wszystkie z nich mona poprzedzi przedrostkami min i max (np. device-height
wystpuje te w wersjach min-device-height i max-device-height). Do wyjtkw w tej
kwestii nale orientation, scan i grid.
241
242
Skadnik
Opis
width
height
device-width
device-height
orientation
aspect-ratio
device-aspect-ratio
color
color-index
monochrome
resolution
scan
grid
FORMATOWANIE
WYBRANYCH ELEMENTW-DZIECI
Czasami potrzebny jest dostp do co drugiego, trzeciego, pitego, smego albo trzynastego
elementu w szeregu. Najczciej mamy z takimi sytuacjami do czynienia w przypadku elementw
dugich list albo wierszy (lub kolumn) tabeli, ale tak naprawd moliwoci jest nieskoczenie wiele.
Rozwaymy mniej oczywisty przypadek. Zamy, e mamy du liczb cytatw, ktre
chcielibymy rozmieci jako elementy pywajce w strukturze siatki. Typowym problemem
w takich sytuacjach jest to, e cytaty mog mie rn dugo i te dusze mog przerywa
siatk, co wida na rysunku 7.7.
Klasycznym rozwizaniem tego problemu jest dodanie klasy do co czwartego elementu
div (w ktrym zawarte s cytaty) i zastosowanie wasnoci clear. Ale czy nie byoby lepiej,
zamiast zamieca kod tymi wszystkimi klasami, uy selektora wybierajcego co czwarty
element div (rysunek 7.8)?
.quotebox:nth-child(4n+1) {clear: left;}
243
elementy 0, 3, 6, 9, 12).
Poniewa w szeregu nie ma elementu zerowego, naley zacz liczenie od jedynki.
Dlatego dodalimy +1, aby wybra elementy pierwszy, pity, dziewity itd.
Tak, dobrze przeczytae, wzorzec :nth-child() zaczyna odliczanie od zera, natomiast
liczenie elementw zaczyna si od jedynki. Dlatego czon +1 znajdziemy w prawie
wszystkich selektorach tego typu.
Najlepsze jest to, e jeli zmienimy zdanie i postanowimy wybra nie co czwarty,
leczcotrzeci element (rysunek 7.9), to musimy zmieni tylko jedn liczb.
.quotebox:nth-child(3n+1) {clear: left;}
244
245
246
Rysunek 7.11. Formatowanie nieparzystych kolumn
Chcesz pokolorowa te pozostae kolumny, jak na rysunku 7.12? To te nic trudnego!
td:nth-child(odd) {background: #FED;}
td:nth-child(even) {background: #DEF;}
247
248
249
250
251
252
CIENIE
Ach, te cienie! Pamitasz, jak w poowie lat 90. wszystko musiao mie cie? Oczywicie
wwczas sporzdzano je za pomoc obrazkw i tabel powykrcanych jeszcze bardziej ni
zwykle. Teraz moemy wrci do minionej wietnoci dziki kilku prostym reguom CSS.
Do tworzenia cieni su dwie wasnoci: text-shadow i box-shadow. Najpierw zajmiemy si
pierwsz. Ponisza regua wywoa efekt widoczny na rysunku 7.21.
253
254
255
256
Gdy kolor jest zdefiniowany w osobnej regule, zawsze jest ustawiany pod obrazami i nie
trzeba go przenosi, gdy zmieni si kolejno obrazw albo doda si nowe obrazy do ta.
Przecinkami mona rozdziela dowolne wasnoci ta, np. background-image. Poprzedni
arkusz stylw moglibymy rwnie dobrze napisa tak:
.quotebox {
background-repeat: no-repeat, no-repeat, no-repeat, no-repeat, repeat;
background-image: url(bg01.png), url(bg02.png), url(bg03.png), url(bg04.png),
url(bgparch.png);
background-position: top left, top right, bottom right, bottom left, center;
background-color: #FFF;}
Inny format, ten sam wynik. W tym przypadku druga wersja jest bardziej rozwleka, ale nie
zawsze musi tak by. Gdybymy pozbyli si ta papirusu, czego efektem byby cytat widoczny
na rysunku 7.30, to pierwsz deklaracj moglibymy troch uproci:
.quotebox {
background-repeat: no-repeat;
background-image: url(bg01.png), url(bg02.png), url(bg03.png), url(bg04.png);
background-position: top left, top right, bottom right, bottom left;
background-color: #FFF;}
257
W tym przypadku obrazy pierwszy i trzeci pozostayby bez zmian, a drugi i czwarty
zostayby zwielokrotnione wedug osi pionowej. Gdyby zostay podane trzy wartoci,
przegldarka zastosowaaby je do obrazw pierwszego, drugiego i trzeciego, a czwartemu
przypisaaby warto pierwsz.
PRZEKSZTACENIA DWUWYMIAROWE
258
Jeli kiedykolwiek chciae obrci lub znieksztaci jaki element, jego obramowanie,
tekst czy cokolwiek innego, to ten podrozdzia jest dla Ciebie.
Najpierw jednak ostrzeenie: dla zwikszenia przejrzystoci przykadw wasno
transform zapisuj bez przedrostkw, ale na razie przeksztacenia mona wykonywa
tylko przy uyciu wielu powtrze tej wasnoci z odpowiednimi przedrostkami, np.:
-webkit-transform: ;
-moz-transform: ;
-o-transform: ;
-ms-transform: ;
transform: ;
Przedrostki te powinny przesta by potrzebne za rok, moe troch wicej (tak mam
przynajmniej nadziej), ale na razie musimy je stosowa, wic pamitaj, e zostay tu
opuszczone tylko w celu uproszczenia przykadw.
Czas wzi si do pracy! Chyba najprostszym rodzajem przeksztacenia jest obrt
przedstawiony na rysunku 7.31 na tej i nastpnych ilustracjach czerwona przerywana
obwdka wskazuje pierwotne pooenie przeksztaconego elementu.
.box1 {-moz-transform: rotate(33.3deg);}
.box2 {-moz-transform: rotate(-90deg);}
Rysunek 7.31. Obrcone elementy. Czerwona obwdka wskazuje ich pierwotne pooenie
Jak na pewno zauwaye, prostokty na powyszym rysunku zostay obrcone wok
swoich rodkw. Stao si tak dlatego, e domylnym punktem obrotu jest 50% 50%, czyli
rodek elementu. Mona go zmieni za pomoc wasnoci transform-origin (rysunek 7.32).
.box1 {transform: rotate(33.3deg); transform-origin: bottom left;}
.box2 {transform: rotate(-90deg); transform-origin: 75% 0;}
259
260
Bez wzgldu na to, ktr wersj wybierzesz, rezultat bdzie taki jak na rysunku 7.34.
Rysunek 7.34. Dwa skalowane elementy, z ktrych jeden zosta przeskalowany tylko w pionie
Podobnie dziaa warto scaleX(), ktra zmienia rozmiar elementu w poziomie, pion
pozostawiajc bez zmian (rysunek 7.35).
.box1 {transform: scaleX(0.5);}
.box2 {transform: scaleX(1.5);}
261
262
Bez wzgldu na metod wynik bdzie taki, jak wida na rysunku 7.38.
263
264
265
266
267
268
Skorowidz
!important, 52, 53
$, 69
*, 57, 67
:active, 48
:after, 48, 75, 76
:before, 48, 75, 76
:checked, 49
:disabled, 49
:empty, 40, 49
:enabled, 49
:first-child, 48
:first-letter, 48
:first-line, 48
:first-of-type, 49
:focus, 48
:hover, 48
:lang(), 48
:last-child, 49
:last-of-type, 49
:link, 48
:not(), 40, 49
:nth-child(), 49, 244, 246, 248
:nth-child(even), 245
:nth-child(odd), 245
:nth-last-of-type(), 49
:nth-of-type(), 49
:only-child, 49
:only-of-type, 49
:root, 49
:target, 49, 51
:visited, 48
@media, 241
^, 68
~, 64, 65
A
adres URL, 66, 67
aktywny element, 48
alt, 40
arkusze serwerowe, 111
arkusze stylw dla mediw, 237
arkusze stylw dla druku, 94, 95
arkusze stylw zerujce domylne
ustawienia, 43
ASCII, 76
aspect-ratio, 242
atrybuty
class, 58
href, 63
id, 58
media, 95
scope, 212
selektory, 62
wartoci, 66
audio, 235
automatycznie adaptujca si siatka,
245
B
background, 93, 110, 249, 254, 255, 256
background-color, 250, 256, 257
background-image, 257
background-position, 257
background-repeat, 257, 258
biblioteki JavaScript, 234
body, 108, 110
to elementu, 110
border, 86
border-bottom-left-radius, 183
border-bottom-right-radius, 183
border-collapse, 214
border-radius, 181
border-style, 86
border-top-left-radius, 183
border-top-right-radius, 183
boxpunch, 174
box-shadow, 253
C
caption, 224
chmurki, 170
cienie, 252
class, 58
selektory atrybutw, 64
clear, 125, 243
clearfix, 125
color, 242, 250
color-index, 242
Complexspiral, 166
CSS, 17
CSS 2.1, 48
CSS 3, 40, 49
kolory RGBA, 249
pseudoklasy, 49
zaokrglanie rogw, 181
CSS parallax, 191
czcionki, 83
D
dane tabelaryczne, 224
definiowanie
punktory list, 100
to elementw body i html, 110
wiele obrazw w tle elementw,
254
device-aspect-ratio, 242
device-height, 242
device-width, 242
diagnostyczny arkusz stylw, 40
display, 88, 89
block, 97
none, 88
div, 64, 107
document.getElementById(), 88
dodawanie obramowania
dokontenera, 175
dokadno selektora, 51
doczanie skryptu IE9.js do strony, 46
domylne style w przegldarkach, 42
dopenienie, 97
Dragonfly, 33
Styles, 33
Ukad, 33, 34
drukowanie, 94
dzieci, 70
formatowanie wybranych
elementw, 242
E
efekty, 165
Complexspiral, 166
menu CSS, 172
menu podrczne, 170
niedostpno obrazu, 93
nieregularne ksztaty, 174
nieregularne ksztaty pywajce, 193
paralaksa CSS, 191
pola obrazw, 201
przesuwane drzwi, 185
przesuwane drzwi z przycinaniem,
189
Sliding Doors, 185
sprajty CSS, 183
Super Ragged Floats, 197
supernieregularne ksztaty
pywajce, 197
zanikajce to, 51
zaokrglanie rogw, 177
elementy blokowe, 96
elementy HTML 5, 234
elementy pywajce, 121
elementy siostrzane, 73
em, 84, 85, 150
F
faszywe kolumny, 132
figcaption, 235
figure, 235
Firebug, 18
badanie elementw, 20
edycja kodu CSS, 23
kod CSS, 19
prezentacja stylw, 20
pseudoelementy, 22
pseudoklasy, 22
struktura dokumentu, 18
Styl, 19, 20
Ukad, 23
ukad elementw, 19
wartoci stylw, 22
Zbadaj element, 21
SKOROWIDZ
Firefox, 18
fixed positioning, 161
float, 123
Fluid Grids, 146
fokus, 48
font, 83
font-size, 83, 85
fonty, 83
footer, 58
formatowanie
elementy HTML 5, 234
cza, 70
wybrane elementy-dzieci, 242
wybrane kolumny, 246
G
generowanie
markery, 105, 106
tre, 75
GIF89a, 189
grid, 242
270
header, 58
height, 226, 242
Holy Grail, 142
href, 40, 63
HSL, 250
hsl(), 251
HSLA, 250
hsla(), 251
html, 108, 110
to elementu, 110
HTML 5, 234
audio, 235
imitacja elementw za pomoc
nazw klas, 236
obrazy, 235
stare przegldarki, 235
video, 235
I
id, 58
identyfikator fragmentu, 50
identyfikatory, 58
czenie z klasami, 61
selektory atrybutw, 65
stosowanie, 60
IE7.js, 45
IE8.js, 45
IE9.js, 45, 46
doczanie skryptu do strony, 46
IEDT, 29
image replacement, 92
imitacja elementw HTML 5
zapomoc nazw klas, 236
inset, 86, 88
Internet Explorer 6, 46, 62
PNG, 181
selektory dzieci, 72
Internet Explorer 7, 29
Internet Explorer 8, 32
J
JavaScript, 234
jednostki, 84
em, 150
jedyny suszny ukad, 138
JQuery, 234
K
kana alfa, 249, 250
klasy, 58
czenie z identyfikatorami, 61
przypisywanie jednego elementu
do wielu klas, 61
kleiste stopki, 161
kliring elementw przylegajcych,
126
kolejno fontw, 83
kolejno zapisu klas, 62
kolorowanie krawdzi, 55
kolory
HSL, 250
HSLA, 250
obramowanie, 86, 87
RGBA, 249
kolumny tekstu, 128
komentarze warunkowe, 46
kontekst pozycjonowania, 157
kontenery, 107
kontenery elementw pywajcych, 121
L
line-height, 83
wartoci bezjednostkowe, 84
link, 94
Liquid Bleach, 135
list-style, 100
list-style-image, 100
listy, 71
generowanie markerw, 105
markery w tle, 104
punktory, 100
punktory w tle, 102, 103
wycinanie, 99
cza, 63, 70
cza blokowe, 96
cza do adresw e-mail, 70
cza do usugi AOL Instant
Messenger, 70
cza nawigacyjne, 59
cza szyfrowane, 70
nieodwiedzone cze, 48
odwiedzone cze, 48
stany, 185
strony przeznaczone do druku, 77
czenie identyfikatorw z klasami, 61
M
macierz przeksztacenia, 267
mapy, 217
margin, 98
marginesy, 97
automatyczna szeroko, 120
ujemne wartoci, 154
wysuwanie elementw poza
kontenery, 155
margin-left, 98, 99
markery, 104
generowanie, 105
matrix(), 267
max-device-height, 241
max-width, 202
media, 94, 95, 237
media="print", 95
media="screen", 95
menu CSS, 172
menu podrczne, 170
menu rozwijane, 173
min-device-height, 241
min-width, 238
model barw HSL, 251
model kolorw RGBA, 249
monochrome, 242
-moz-border-radius, 181
-moz-box-shadow, 253
-moz-transform, 258
-ms-transform, 258
N
nagwek, 58, 161
nagwek z cieniem, 252
nagwki HTTP, 113
narzdzia, 17
Narzdzia deweloperskie, 32
nazwy klas, 58
nieodwiedzone cze, 48
nieregularne ksztaty, 174
nieregularne ksztaty pywajce, 193
not, 241
O
obramowanie, 86, 116
inset, 86
kolor, 86, 87
outset, 86
obrazy, 201, 235
obrazy w tle, 108, 254
obrazy zamiast tekstu, 92
ograniczanie rozmiaru, 202
pola obrazw, 201
obrt, 258
obrysy, 116
grubo, 117
SKOROWIDZ
odnoniki rdliniowe, 97
odwiedzone cze, 48
ograniczanie rozmiaru obrazw, 202
ol, 71
One True Layout, 138
only, 241
Opera, 33
orientation, 242
-o-transform, 258
outline, 116, 226
outset, 86, 88
overflow, 122
auto, 128
P
padding, 98
padding-left, 98
padding-top, 162
paralaksa CSS, 191
paski narzdzi
Internet Explorer Developer
Toolbar, 29
Web Developer, 24
Phark, 93
pynne siatki, 146
pywajce elementy o rnej
wysokoci, 243
pywajce kontenery elementw
pywajcych, 123
PNG, 181, 189
podgld stylu druku w przegldarce,
96
pola obrazw, 201
poprawno kodu, 82
position, 90
absolute, 90, 157
fixed, 163
relative, 92, 157
static, 91
pozycjonowanie, 91
obrazy w tle, 191
pozycjonowanie bezwzgldne, 91
pozycjonowanie elementw
winnym elemencie, 157
pozycjonowanie na sztywno
nagwkw i stopek, 161
pozycjonowanie procentowe, 191
pozycjonowanie stae, 161
pozycjonowanie w kontekcie, 156
wyjcie poza kontener, 158
precyzja selektorw, 51, 57
identyfikatory, 60
progressive enhancement, 77
prosty ukad dwukolumnowy, 128
prosty ukad trzykolumnowy, 129
przeksztacenia dwuwymiarowe, 258
kilka przeksztace naraz, 266
kolejno przeksztace, 267
macierz przeksztacenia, 267
obrt, 258
przeksztacenia macierzowe, 267
skalowanie, 260
skalowanie w poziomie, 261
translacja, 262
znieksztacenie, 264
przepenienie, 121
przesuwane drzwi, 185
przesuwane drzwi z przycinaniem, 189
przezroczysto, 249
obrazy PNG, 181
przypisywanie jednego elementu
dowielu klas, 61
pseudoelementy, 48, 49
:after, 48, 75, 76
:before, 48, 75, 76
:first-letter, 48
:first-line, 48
formatowanie, 76
pseudoklasy, 48, 49
:active, 48
:checked, 49
:disabled, 49
:empty, 49
:enabled, 49
:first-child, 48
:first-of-type, 49
:focus, 48
:hover, 48
:lang, 48
:last-child, 49
:last-of-type, 49
:link, 48
:not(), 49
:nth-child(), 49
:nth-last-of-type(), 49
:nth-of-type(), 49
:only-child, 49
:only-of-type, 49
:root, 49
:target, 49
:visited, 48
CSS 3, 49
punktory, 100
punktory w tle, 102, 103
pusta przestrze wok treci strony, 98
px, 85
regua wanoci, 52
selektor uniwersalny, 51, 57
selektory elementw siostrzanych,
73, 74
selektory potomkw, 70
selektory atrybutw, 62, 65
$, 69
^, 68
~, 64, 65
atrybut class, 64
formatowanie czy, 70
identyfikatory, 65
selektory dzieci, 70
IE 6, 72
selektory podacuchw, 66
wartoci atrybutw, 66, 68
separatory kolumn, 131
skalowanie, 260
skalowanie w poziomie, 261
skew(), 264
skewX(), 264, 265
skewY(), 264, 265
skrcony zapis wasnoci, 53
wybircze przesanianie wasnoci,
55
skrypt IE9.js, 45
Sliding Doors, 135, 185
wersja z przycinaniem, 189
sprajty CSS, 183
sprawdzanie poprawnoci kodu, 82
stany czy, 185
stopka, 58, 161
stopniowe ulepszanie, 77
stosowanie obrysu, 116
strony przeznaczone do druku, 77
struktura tabeli, 208
styl obramowania, 86
style dla druku, 94
Super Ragged Floats, 197
supernieregularne ksztaty pywajce,
197
R
regua precyzji, 51, 57
regua wanoci, 52
resolution, 242
rgb(), 249
RGBA, 249
rgba(), 249
rogi owalne, 182
rotate(), 258, 259
Rundle Method, 93
S
Safari, 35
scale(), 260
scaleX(), 261
scaleY(), 262
scan, 242
scope, 212
Selectoracle, 38
selektory, 47
*, 57
regua precyzji, 51, 57
T
tabele, 207
formatowanie kolumn przy uyciu
klas, 215
formatowanie komrek nagwka,
212
formatowanie wedug kolumn, 213
formatowanie wybranych kolumn,
246
kolor ta kolumny, 215
mapy, 217
nagwek, 208
nagwki wierszy, 211
obramowanie kolumny, 215
pozycjonowanie zawartoci, 227
stopka, 208
struktura tabeli, 208
tre gwna, 208
271
SKOROWIDZ
272
tabele
wizualne oddzielenie nagwka
istopki od treci gwnej, 210
wykresy, 224
wyrwnanie zawartoci komrek,
208
tabele kolorw HSL, 251
table, 208
tbody, 208, 209
techniki
boxpunch, 174
clearfix, 125
faszywe kolumny, 132
Fluid Grids, 146
IR, 92, 93
Liquid Bleach, 135
Sliding Doors, 185
stopniowe ulepszanie, 77
text-align, 208
text-indent, 93, 99
tfoot, 209
th, 211
scope, 212
thead, 208, 209
title, 40
ta dokumentu, 110
tr, 208
transform, 258, 265
matrix(), 267
rotate(), 258, 259
scale(), 260
scaleX(), 261
scaleY(), 260, 262
skew(), 264
skewX(), 264, 265
skewY(), 264, 265
translate(), 262
transform-origin, 259
translacja, 262
translate(), 262, 264
tre generowana, 77
tworzenie
arkusze stylw dla druku, 95
mapy z danych tabelarycznych, 217
wykresy, 224
U
ujemne marginesy, 176
ukad normalny, 154
ukady, 115
clearfix, 125
faszywe kolumny, 132
Fluid Grids, 146
Holy Grail, 142
jedyny suszny ukad, 138
kolumny, 128
Liquid Bleach, 135
obramowanie, 116
obrysy, 116
One True Layout, 138
pynne siatki, 146
pozycjonowanie na sztywno
nagwkw i stopek, 161
pozycjonowanie stae, 161
pozycjonowanie w kontekcie, 156
V
video, 235
visibility, 89, 214
W
walidacja poprawnoci kodu, 82
walidator HTML W3C, 82
wartoci atrybutw, 66, 67, 68
wcicia list, 98
wcity cytat blokowy, 176
Web Developer, 24
identyfikatory, 27
Informacje, 25, 27
klasy, 27
Narzdzia, 27, 28
wyczanie doczonych arkuszy
stylw, 26
Zaznacz, 27
zaznaczanie elementw, 27, 28
WebInspector, 35
informacje o polu elementu, 36
Programowanie, 35
style nadane, 35, 36
-webkit-border-radius, 181
-webkit-box-shadow, 253
-webkit-transform, 258
widoczno elementu, 89
width, 118, 122, 226, 242
wiele obrazw w tle elementw, 254
wielokolumnowe pynne ukady, 135
wielopoziomowe menu rozwijane, 172
wasnoci pisma, 83
wskazywanie identyfikatora
fragmentu, 50
wstawianie
adresy URL do stylw dla druku, 77
tre na pocztku elementw
listy, 75
znaki za pomoc specjalnych
kodw, 76
wybircze przesanianie wasnoci
wzapisie skrconym, 55
X
XRAY, 37
Z
zakadki, 185, 186, 187
zanikajce to, 51
zaokrglanie rogw, 177
CSS 3, 181
zapis skrcony wartoci, 53
zapytania o media, 237
not, 241
only, 241
przecinki, 241
skadniki, 242
zastpowanie tekstu, 92
zerowanie stylw, 42
z-index, 161
zmiana koloru markerw, 101
zmiana liczby kolumn, 241
znieksztacenie, 264
zwielokrotnienie obrazw w tle, 108