RP1 - CSS
✓XHTML1
Uvod. Selektori
U prethodnim vje~zbama smo nau~cili ~sto je
XHTML, i
vidjeli smo da je za pisati dobar XHTML
najva~znije dobro shvatiti logi~cku strukturu
dokumenta. To je zato ~sto je XHTML
zami~sljen i napravljen kao jezik (za razliku od
HTMLa) potpuno oslobo~den
prezentacijskih efekata, koji odre~duju kako ~te se
to~cno ne~sto renderirati na ekranu (ili bilo gdje
drugdje).
Posljedica toga je, naravno, da XHTML dokumenti,
sami po sebi, u browseru obi~cno izgledaju prili~cno siroma~sno.
Prezentacija i vizualne karakteristike prikaza pojedinih
XHTML elemenata se mogu precizno specificirati, samo
~sto XHTML nije pravi jezik za to. Postoje specijalizirani
jezici za tu svrhu. Najpoznatiji od njih je vjerojatno
CSS.
CSS dokumenti, takozvane stilske kartice
(stylesheets), sastoje se od pravil~a (koja se ~cesto grupiraju u
sekcije). Svako pravilo se sastoji od selektora i
deklaracije, i pi~se se u obliku
selektor { deklaracija }
.
Selektor kazuje na koji/kakav element se treba primijeniti deklaracija, koja
kazuje kako neko svojstvo tog elementa treba renderirati. Selektor mo~ze
biti jednostavan (samo ime elementa, uz eventualno ime klase ili id), ili
kontekstni (nekoliko jednostavnih selektora odvojenih razmacima, koji ozna~cavaju elemente jedan unutar drugog).
Klase se u CSSu pi~su s po~cetnom to~ckom, a id-ovi
(kao i u XHTMLu prilikom dereferenciranja) s po~cetnim
znakom "#". Dakle, neki primjeri jednostavnih selektor~a su:
Napomena: jedna deklaracija ~ciji efekt se gotovo uvijek mo~ze vidjeti je recimo { background: green }
, koja postavlja boju pozadine elementa na zelenu. Tu deklaraciju mo~zete upariti (napisati nakon) s bilo kojim od donjih selektor~a (na nekom prikladno slo~zenom dokumentu), da vidite na ~sto se pojedini selektor odnosi -- podru~cje njegovog dosega obojit ~te se zeleno.
- BLOCKQUOTE
- Odnosi se na sve blockquote elemente. Napomenimo da je
CSS, za razliku od XHTMLa,
case insensitive (op~tenito ne razlikuje velika i mala slova),
te da se u selektorima imena elemenata obi~cno pi~su velikim slovima, da se bolje uo~ce.
- CODE.math
- Odnosi se na code elemente koji imaju definiran univerzalni
atribut class s vrijedno~s~tu "math". Na primjer, element
<code class='math'>x∈[0,1]</code> bi bio u dosegu tog selektora (odnosno, na njegov sadr~zaj x∈[0,1] bi se odnosile deklaracije u viti~castim zagradama nakon tog selektora).
- .vazno
- Odnosi se na sve elemente koji imaju atribut class sa vrijedno~s~tu 'vazno'. Na primjer, element <em class='vazno'>Napomena:</em> bi bio u dosegu tog selektora.
- #osnovniTeorem
- Odnosi se na onaj element u dokumentu koji ima atribut id postavljen na vrijednost "osnovniTeorem". Tako~der je mogu~te specificirati vrstu elementa, na primjer "P#osnovniTeorem", no to nema previ~se smisla jer je element s tim id-om ionako jedinstven, bar za dani XHTML dokument. Da, jedna stilska kartica mo~ze upravljati renderiranjem vi~se dokumenata, no svejedno nije dobra praksa imati unutar razli~citih dokumenata razli~cite elemente s istim id atributom.
Pseudoklase
Osim navedenih klas~a (onih koje specificira autor dokumenta kao vrijednosti class atributa), posebno a
element mo~ze imati nekoliko pseudoklas~a, najva~znije od kojih su ":link" i ":visited" (kao ~sto vidimo, pseudoklase se umjesto s to~ckom pi~su s dvoto~ckom na po~cetku). To su klase koje ne ovise o tome kako je a
elemente (linkove) klasificirao autor dokumenta, ve~t kako ih je "klasificirao" korisnik: na posje~tene i neposje~tene.
- A:link
- Odnosi se na linkove koji jo~s nisu posje~teni (aktivirani, "kliknuti"), ili pak na one koji su zadnji put posje~teni prije mnogo vremena (recimo, prije zadnjeg brisanja browser cachea).
- A:visited
- Linkovi koji su ve~t (nedavno) posje~teni -- bilo iz tog dokumenta, bilo iz nekog drugog. Ideja je da je razumno pretpostaviti da za njihov sadr~zaj korisnik ve~t zna, te mo~zda ne moraju biti toliko vizualno upe~catljivi kao oni neposje~teni.
- :visited
- Skra~teni zapis za "A:visited". Budu~ti da u CSS1 (po kojem radimo), jedino a element mo~ze imati pseudoklase, s~amo navo~denje pseudoklase je dovoljno. Ipak, treba uzeti u obzir da u CSSu ne postoji deklaracija verzije (nigdje na stilskoj kartici ne pi~se da je ona ba~s CSS1), tako da je dobro pitanje je li u~steda jednog slova vrijedna glavobolj~a u trenutku kad najnovija verzija CSSa definira :visited pseudoklasu i za cite element, na primjer.
- A.natrag:link
- Linkovi klase "natrag", koji jo~s nisu posje~teni. Na primjer, element <a class="natrag">Povratak</a> bi spadao pod doseg tog selektora, ukoliko jo~s nije posje~ten (ako se to odnosi na linkove koji stvarno slu~ze vra~tanju s podre~denih dokumenata, ta situacija obi~cno indicira da je korisnik do~sao do dokumenta nekim drugim putom od onog koji smo mi zamisliti -- na primjer za WWW, pomo~tu search enginea). Vidimo da mo~zemo kombinirati klasu i pseudoklasu, no treba upamtiti da u tom slu~caju pseudoklasa uvijek dolazi na kraju.
Kontekstni selektori
Kontekstni selektor je vi~se jednostavnih selektor~a nanizanih jedan za drugim (i odvojenih obi~cno razmacima, osim kod pseudoelemenata, o ~cemu vi~se kasnije). Ideja je da se neke deklaracije odnose samo na elemente unutar nekih drugih elemenata. Na primjer, unutar code.math elementa, sadr~zaj var elementa ~te vjerojatno trebati druga~cije renderirati nego unutar address ili li elementa. To se mo~ze posti~ti kontekstnim selektorima. Na primjer:
- P EM
- Odnosi se na samo one em elemente koji su unutar p elementa (ne nu~zno neposredno unutar njega). Na primjer u kodu
<h1>Tocka <em>1</em></h1>
<p>Tocka <em>2</em>, <a href="tocka3.html">tocka <em>3</em></a></p>
, taj selektor bi se odnosio na brojeve "2" i "3", ali ne na "1", jer on nije unutar p elementa.
- BLOCKQUOTE#essential P.long A:visited KBD
- Odnosi se na kbd elemente unutar posje~tenih linkova u odlomcima teksta klase .long, sve to samo unutar blockquotea identificiranog kao essential. (Ovako precizan selektor vam skoro sigurno nikada ne~te trebati.:)
- DL.fancy DD
- dd elementi unutar definicijskih list~a klase fancy. ~Cesta je pojava poku~sati svaki pojedini dd element unutar takve liste klasificirati, no to otvara puno problema (~sto ako dodamo novi dd element i zaboravimo mu pridijeliti klasu?; ~sto ako copy&pasteamo elemente izme~du dvije liste?), i pi~semo vi~se nego ~sto je potrebno. Puno je bolje napisati "class='fancy'" samo na jednom mjestu (ili nekoliko njih) u XHTML dokumentu (kao atribut dl elementa), i onda pristupati pojedinim elementima unutar liste pomo~tu kontekstnih selektor~a.
- UL UL
- Odnosi se na neure~dene liste negdje unutar neure~denih list~a (dakle, dubine barem 2). Primijetimo: iako je po pravilima XHTMLa nemogu~te utrpati jedan ul element direktno unutar drugog (ul element smije sadr~zavati samo li elemente), CSS pravilo "ne mora sadr~zavati neposredno" za kontekstne selektore osigurava da mo~zemo i to napisati. Dakako, mo~zemo napisati i "potpuniju" sekvencu "UL LI UL" (kao ~sto mo~zemo i "HTML BODY UL LI UL":), ali vezanje deklaracij~a na li element ("UL LI UL LI") nosi sa sobom neke probleme, ~sto ~te postati jasnije kad objasnimo preklapanje.
Pseudoelementi
Osim ~sto ima pseudoklase za a element, CSS nudi i pseudoelemente: specijalne fiktivne elemente unutar nekih blokovskih elemenata (najva~zniji je p), za koje opet nije odgovoran autor dokumenta, ve~t browser: oni ovise o tome kako se to~cno poslo~zi pojedini element na konkretnom korisnikovom ekranu. To su ":first-line" i ":first-letter" -- prva linija, i prvo slovo, pojedinog blokovskog elementa (naj~ce~s~te odlomka teksta). Jasno je da ~sto to~cno ulazi u prvu liniju odlomka, ovisi o tome kakva je veli~cina fonta, kolika je ~sirina browserovog prozora, rezolucija... autor to ne mo~ze znati. ~Sto je prvo slovo odlomka, autor mo~ze dodu~se ozna~citi posebnim elementom, no nema potrebe niti puno smisla -- to nije logi~cki ve~t prezentacijski detalj, jer prvo slovo odlomka se obi~cno ni po ~cemu ne razlikuje od ostalih slov~a, osim po tome kako se renderira.
- INS:first-letter
- Odnosi se na prvo slovo proizvoljnog ins elementa. Vidimo da to mo~zemo shvatiti donekle kao kontekstni selektor (":first-letter" element unutar "INS" elementa), s tom razlikom da ovdje sadr~zavanje mora biti neposredno -- radi se stvarno o prvom slovu sadr~zaja ins elementa, ne o prvom slovu nekog npr. odlomka unutar ins elementa. U znak toga, pseudoelementi se pi~su odmah nakon elemenata unutar kojih se "nalaze", bez razmaka.
:first-letter
- Ovo nije dobar selektor sam po sebi (ne odnosi se, recimo, na prva slova svih blokovskih elemenata u dokumentu). Pseudoelementi uvijek moraju biti referencirani unutar konkretnih elemenata, i moramo uvijek navesti na koji element se misli.
- P.prvi:first-line
- Odnosi se na prvu liniju (uklju~cuju~ti i prvo slovo) p elemenata klase "prvi". Ovo isto mo~zemo shvatiti kao kontekstni selektor u nekom smislu, no treba zapamtiti da ispred pseudoelemenata nikada ne ide razmak.
- BLOCKQUOTE P:first-line
- Prva linija samo onih p elemenata koji se nalaze unutar nekog blockquote elementa. Vidimo da su pseudoelementi dozvoljeni unutar kontekstnih selektor~a, no u tom slu~caju oni moraju biti zadnji -- iako ponekad ima smisla govoriti o "elementima sadr~zanima unutar prve renderirane linije", nije jasno ~sto uraditi s elementima koji nisu potpuno u prvoj liniji (na primjer, prelamaju se s prve na drugu). Zbog takvih konfuzij~a, CSS1 je jednostavno zabranio kontekstualiziranje unutar pseudoelemenata.
Grupiranje selektor~a
Vi~se selektor~a se mo~ze grupirati, odnosno nanizati odvojene zarezima. U tom slu~caju, u dosegu tog "multiselektora" ~te biti svi oni elementi koji bi bili u dosegu bilo kojeg pojedinog -- dakle, zarez me~du selektorima ima zna~cenje logi~ckog "ili". Obi~cno se iza zareza jo~s stavi razmak, radi lak~seg ~citanja.
- EM, STRONG
- Odnosi se na sve em elemente, i na sve strong elemente -- dakle, na sve nagla~sene dijelove teksta.
- H1,H2,H3,H4,H5,H6
- Odnosi se na sve naslove -- ono ~sto smo obi~cno zvali "hx element". Uo~cimo da mo~zemo izostaviti razmak iza zareza -- ni s njim ovo ne bi bilo puno ~citljivije.
- OL.kratka, UL.kratka, DL.kratka
- Odnosi se na sve liste klase "kratka". Primijetimo da u CSS1 nema dodatnog grupiranja -- ne mo~zemo napisati ne~sto poput
(OL,UL,DL).kratka.
- .math KBD, KBD.math
- Odnosi se na sve kbd elemente unutar proizvoljnog elementa klase math, kao i na s~ame kbd elemente klase math. Ne odnosi se na kbd elemente koji "nemaju nikakve veze" s klasom math. Primijetimo da su ovo gore dva nezavisna selektora -- ono ~sto je u dosegu jednog, mo~ze a ne mora biti u dosegu drugog.