Formų stilizavimas
Pripažinkite — naršydami įvairiuose tinklalapiuose dažnai matote formas. Ir taip pat dažnai jas užpildote, siunčiate kažkokius duomenis į serverį. Jeigu patys kuriate tinklalapius, turbūt kartais galvoje pradeda suktis įvairios mintys ir mąstote, kaip sukurti tokius pat gražius formų laukelius, mygtukus, kuriuos pamatote tinklalapiuose.
Iš tikrųjų, formų stilizavimas su CSS nėra ypatingai sudėtingas, tačiau būtina atkreipti dėmesį į keletą niuansų. Straipsnyje stengsiuosi kuo plačiau apžvelgti įvairius stilizavimo būdus ir subtilybes bei, žinoma, pateiksiu pavyzdžių.
Paprastas formų stilizavimas
Kaip ir daugeliui HTML elementų, formų elementams galime nurodyti rėmelį (angl. border), jo storį, spalvą, tipą (solid, dotted, dashed), fono, teksto spalvą, šrifto dydį ir t.t. Taigi pasirašykime HTML kodą, kuris nurodys formos elementus.
<form action="" method="post">
<label for="slapyvardis">Slapyvardis:</label>
<input type="text" name="username" id="slapyvardis" />
<br />
<label for="slaptazodis">Slaptažodis:</label>
<input type="password" name="password" id="slaptazodis" />
<br />
<label for="vardas">Vardas:</label>
<input type="text" name="name" id="vardas" />
<br />
<label for="pastas">El. pašto adresas:</label>
<input type="text" name="email" id="pastas" />
<br /><br />
<input type="submit" name="submit" value="Siųsti duomenis" />
</form>
Rezultatą galite peržiūrėti čia: formos/index1.html.
Pastebėsite, kad ne kiekvienoje naršyklėje net nestilizuoti formų elementai atvaizduojami skirtingai. Norėdamas tai jums įrodyti, „pagavau“ kadrus su Safari 3, Firefox 3, Opera 9 ir Internet Explorer 8 Beta 2 naršyklėmis.
Įprastai formų elementams tvarkingai sudėlioti naudojamos lentelės, tačiau mes galime šiek tiek pažaisti ir sudėlioti elementus su CSS. Tarkime, kiekvienas formos laukelis turi būti po to laukelio pavadinimu, pavyzdžiui, po žymių <label></label> laukelis turi tęstis ne toje pačioje eilutėje, o persikelti į kitą. Žinoma, tai padaryti galime pridėję <br /> žymę, tačiau yra ir kitas būdas. Apibrėžkime keletą CSS savybių label identifikatoriui.
label { display: block; padding-top: 10px; padding-bottom: 10px; }
Pati svarbiausia dalis aukščiau pateiktame kode yra display: block. Savybei display nurodę reikšmę block priverčiame visus label elementus „elgtis“ kaip blokams. Kitaip sakant, visi label elementai tampa blokais, o blokai, kaip žinia, pagal numatytąsias naršyklės CSS savybių reikšmes visada atvaizduojami naujoje eilutėje. Taigi dabar peržiūrėję puslapį naršyklėje pamatysite, kad kiekvienas laukelis perkeliamas po laukelio pavadinimu.
Taip pat matote, kad CSS kodo pavyzdyje yra dar dvi savybės: padding-top ir padding-bottom. Šios savybės nurodo atitraukimą nuo viršaus (padding-top) ir apačios (padding-bottom). Jų nurodyti, žinoma, nėra būtina, tačiau jas pridėję pamatysite, jog laukeliai nuo pavadinimų yra labiau atskirti ir atrodo tvarkingiau.
Toliau pridėkime label elementams rėmelį (tik iš viršaus su border-top), pritaikykime margin-top ir margin-bottom savybes bei pakeiskime teksto spalvą.
label
{
display: block;
padding-top: 10px;
padding-bottom: 10px;
border-top: 1px solid #CCC;
margin-top: 5px;
margin-bottom: 5px;
color: #0058bb;
}
Peržiūrėję gautą rezultatą matysite, kad dabar label elementai yra
atitraukti nuo laukelių, teksto spalva mėlyna bei atsirado pabraukimas virš kiekvieno label elemento. Dabar būtų pats laikas
pradėti stilizuoti laukelius ir mygtuką, taip? ![]()
Laukeliai ir mygtukai (taip pat ir kiti elementai: radio, checkbox) nurodomi su žyme input, tad CSS savybes galėtume taikyti su atitinkamu identifikatoriumi.
input { }
Tačiau norėdami atskirai stilizuoti laukelius ir mygtuką šio identifikatoriaus naudoti negalime. Taigi elementams priskirkime klases su class atributu.
<form action="" method="post">
<label for="slapyvardis">Slapyvardis:</label>
<input type="text" name="username" id="slapyvardis" class="laukelis" />
<br />
<label for="slaptazodis">Slaptažodis:</label>
<input type="password" name="password" id="slaptazodis" class="laukelis" />
<br />
<label for="vardas">Vardas:</label>
<input type="text" name="name" id="vardas" class="laukelis" />
<br />
<label for="pastas">El. pašto adresas:</label>
<input type="text" name="email" id="pastas" class="laukelis" />
<br /><br />
<input type="submit" name="submit" value="Siųsti duomenis" class="mygtukas" />
</form>
Atitinkamai sukurkime CSS aprašus.
.laukelis
{
padding-top: 5px;
padding-bottom: 5px;
padding-left: 5px;
padding-right: 5px;
width: 300px;
color: #666;
border: 1px solid #CCC;
}
.mygtukas
{
border: 0;
padding-top: 5px;
padding-bottom: 5px;
padding-left: 8px;
padding-right: 8px;
background: #0058bb;
color: white;
}
Priskirtos savybės gana aiškios: laukelio klasei priskyrėme atitraukimą (padding-top, padding-bottom ir t.t.), ilgį (width), teksto spalvą ir rėmelį; mygtuko klasei — rėmelį pašalinome, kadangi jis mums nereikalingas, nurodėme mygtuko fono ir teksto spalvą bei pridėjome padding. Rezultatą galite peržiūrėti čia: formos/index3.html.
Norėdami dar labiau pagražinti mūsų formą, galime nurodyti, kaip atrodys elementai užvedus ant jų pelės žymeklį. HTML dokumente nieko keisti nereikia, užtenka CSS faile nurodyti pseudo klasę :hover.
.laukelis:hover { color: black; }
.mygtukas:hover { background: black; }
Peržiūrėję pavyzdį pamatysite, kad užvedus pelės žymeklį ant laukelio, kuriame įrašytas tekstas, pasikeis teksto spalva, o ant mygtuko — fono spalva. Galite eksperimentuoti su CSS aprašais: pridėti papildomas savybes, keisti esamų savybių reikšmes ir t.t.
Taigi, jau žinote, kaip paprastai ir nesudėtingai stilizuoti formos elementus, tačiau iš tiesų galime netgi labiau pakeisti elementų išvaizdą.
Sudėtingesnis formų stilizavimas
Turėtumėte žinoti, kad tekstui įvesti naudojamos <textarea></textarea> žymės. Jas pridėkime HTML dokumente.
<... kiti HTML formos elementai ...> <label for="apie">Trumpai aprašyk apie save:</label> <textarea name="about" id="apie" cols="60" rows="10" /></textarea> <... kiti HTML formos elementai ...>
Kadangi teksto įvesties elementas naudoja textarea, o ne input žymes, galime drąsiai nurodyti CSS aprašus textarea identifikatoriui.
textarea
{
padding-top: 5px;
padding-bottom: 5px;
padding-left: 5px;
padding-right: 5px;
color: #333;
border: 1px solid #AAA;
}
Toliau laukeliams, textarea elementui ir mygtukui pritaikykime fono paveikslėlį.
.laukelis
{
padding-top: 5px;
padding-bottom: 5px;
padding-left: 5px;
padding-right: 5px;
width: 300px;
color: #666;
border: 1px solid #CCC;
background: url(laukelio_fonas.png) repeat-x;
}
.mygtukas
{
border: 1px solid #CCC;
padding-top: 5px;
padding-bottom: 5px;
padding-left: 8px;
padding-right: 8px;
background: url(mygtuko_fonas.png) repeat-x;
color: black;
}
.mygtukas:hover { }
textarea
{
padding-top: 5px;
padding-bottom: 5px;
padding-left: 5px;
padding-right: 5px;
color: #333;
border: 1px solid #AAA;
background: url(laukelio_fonas.png) repeat-x;
}
Iš CSS aprašų matote, kad vietoj HEX reikšmių (pav. #666 ar #666666 ir pan.) panaudotas atributas url. Skliaustų viduje nurodytas adresas iki paveikslėlio, kurį naudosime formų elementų fonams užpildyti. Taip pat matote, jog nurodytas atributas repeat-x — jis žymi, kad fono paveikslėlis turi būti kartojamas x ašyje (horizontaliai) iki elemento pabaigos.
Atkreipkite dėmesį, kad mygtuko pseudo klasei :hover išimta background savybė, kadangi anksčiau buvome nurodę juodą fono spalvą, kai užvedamas pelės žymeklis ant mygtuko. Taip išvengsime ne visai gražaus efekto, mat dabar, panaudoję fono paveikslėlį .mygtukas identifikatoriuje, šiek tiek pakeitėme mygtuko išvaizdą ir, užvedus pelės žymeklį ant mygtuko, nenorime, kad fono paveikslėlis būtų pakeistas juoda spalva. Taip pat prie mygtuko identifikatoriaus buvo pridėtas rėmelis (angl. border), kad aiškiau matytųsi kontūrai.
Rezultatą galite peržiūrėti čia: formos/index5.html.
Tarkime, kad norime išskirtinio mygtuko, kurį, pavyzdžiui, sukūrėme su Adobe Photoshop programa. Pabandykime šiek tiek pakeisti mygtuko CSS aprašus bei HTML kodą.
<input type="submit" name="submit" value="" class="mygtukas" />
.mygtukas
{
border: 0;
width: 100px;
height: 35px;
background: url(mygtukas.png) no-repeat;
}
HTML dokumente pakeitėme mygtuko elemento value atributą, t. y. nurodėme tuščią reikšmę, kadangi sukurtas grafinis mygtukas turės savo tekstą. CSS aprašuose mygtuko identifikatoriui vėl nurodėme border: 0, nes mums rėmelis nebereikalingas. Taip pat nurodytas mygtuko ilgis (width) ir aukštis (height). Kaip ir anksčiau, mygtuko fonui naudojame background savybę, tik šį kartą nurodytas adresas į kitą paveikslėlį, be to, vietoj repeat-x panaudotas no-repeat atributas — tai reiškia, kad mygtuko fono paveikslėlis nebus kartojamas nei x, nei y ašyje.
Gautas rezultatas: formos/index6.html.
Taigi, CSS suteikia mums daug laisvės, tiesa? Tačiau aktreipsiu dėmesį į tai, kad toks mygtuko stilizavimas turi keletą nepatogumų. Pavyzdžiui, jeigu jūsų internetinėje svetainėje yra daug mygtukų ir jūs nusprendėte stilizuoti mygtukus su paveikslėliais, pamatysite, kad kiekvienam mygtukui turėsite sukurti atskirą paveikslėlį. Todėl kiekvieną kartą pridėję naują mygtuko elementą HTML dokumente greičiausiai turėsite atsidaryti grafinę programą, pavyzdžiui, Adobe Photoshop, ir sukurti atitinkamą paveikslėlį. Žinoma, jeigu mygtuko pavadinimas kartojasi, naujo paveikslėlio kurti nereikės — galėsite naudoti tą pačią mygtuko klasę. Kita problema iškils, jeigu jūsų svetainėje yra kelios kalbos, pavyzdžiui, lietuvių ir anglų. Tokiu atveju turėsite kurti atkirus paveikslėlius ne tik su lietuviškais, bet ir angliškais užrašais. CSS faile privalėsite nurodyti dvigubai daugiau mygtukų klasių, pavyzdžiui: .mygtukas1_lt, .mygtukas1_en; .mygtukas2_lt, .mygtukas2_en ir t. t.
Kaip stilizuosite mygtukus ar kitus formos elementus priklausys tik nuo jūsų. Ir negaliu teigti, kad vienas stilizavimas būdas yra geras, o kitas — ne. Iš tiesų viskas priklauso nuo konkrečios situacijos ir nuo to, koks jūsų tinklalapio pobūdis, ką jame vaizduojate ir pan.
Išsitraukime didžiuosius ginklus
Grįžkime prie idėjos, kad norime stilizuoti mygtukus ir laukelius atskirai, nekurdami papildomų klasių ir jų nepriskirdami formos elementams. Galiu jus nudžiuginti, kadangi tai įmanoma! CSS faile ištrinkime .mygtukas ir .laukelis klases ir vietoje jų parašykime atitinkamus aparašus. Taip pat nepamirškime išimti class atributo iš formos elementų HTML faile.
<form action="" method="post">
<label for="slapyvardis">Slapyvardis:</label>
<input type="text" name="username" id="slapyvardis" />
<br />
<label for="slaptazodis">Slaptažodis:</label>
<input type="password" name="password" id="slaptazodis" />
<br />
<label for="vardas">Vardas:</label>
<input type="text" name="name" id="vardas" />
<br />
<label for="pastas">El. pašto adresas:</label>
<input type="text" name="email" id="pastas" />
<br />
<label for="apie">Trumpai aprašyk apie save:</label>
<textarea name="about" id="apie" cols="60" rows="10" /></textarea>
<br /><br />
<input type="submit" name="submit" value="Siųsti duomenis" />
</form>
input[type="text"], input[type="password"]
{
padding-top: 5px;
padding-bottom: 5px;
padding-left: 5px;
padding-right: 5px;
width: 300px;
color: #666;
border: 1px solid #CCC;
}
input[type="submit"]
{
border: 0;
padding-top: 4px;
padding-bottom: 4px;
padding-left: 8px;
padding-right: 8px;
background: black;
color: white;
}
Kaip matote, stilizuoti atskirus input elemento tipus nėra sudėtinga. Nurodėme atributo identifikatorių, kuris žymimas prie įprastinio identifikatoriaus pridedant laužtinius skliaustus, o juose nurodžius, koks turi būti elemento atributas, kad naršyklė pritaikytų CSS aprašus. Taigi iš HTML dokumento ir CSS aprašų matome sąsają: <input type="text" name="username" id="slapyvardis" /> su input[type="text"].
Pastaba: nepamirškite, kad „web developerių“ ypatingai nekenčiama naršyklė Microsoft Internet Explorer 6 atributo identifikatorių nepalaiko. Tačiau rekomenduoju į tai didelio dėmesio nekreipti ir ignoruoti IE6, kadangi anksčiau ar vėliau vis tiek reiks galutinai atsikratyti ta seniena, todėl nepalaikydami savo tinklalapyje šios naršyklės padėsite greičiau jai numirti.
Rezultatas: formos/index7.html.
Turbūt žinote, kad yra ir daugiau formos elementų: radio (galimybė pasirinkti vieną iš kelių variantų), checkbox (tam tikrų pasirinkimų pažymėjimas varnelėmis), select (pasirinkimas iš variantų sąrašo), file (failo įkėlimas). Deja, šiuos elementus stilizuoti nėra taip lengva kaip tuos, kuriuos anksčiau aptariau straipsnyje. Pavyzdžiui, paprastai su CSS negalima nurodyti checkbox tipo formos elemento fono paveikslėlio ar pačios varnelės, kuri parodo, kad pasirinkimas buvo pažymėtas. Tačiau ir čia turime išeitį. Galime panaudoti JavaScript ir pakeisti standartinius formos elementus.
Nice forms
Idėja paprasta: įprastiniai formos elementai (radio, checkbox, textarea, selct) su JavaScript yra pakeičiami kitais elementais, kurie imituoja standartinių formos elementų veikimą.
Naudoti „Nice Forms“ JavaScript skriptą yra visai nesudėtinga: reikia formai nurodyti klasę niceform ir, žinoma, įterpti patį skriptą į puslapį.
Functional Pretty Forms
Panašus skriptas kaip ir nice forms, nors, mano nuomone, ne toks geras, be to, stilizuotų elementų išvaizda neprilygsta anksčiau paminėto skripto sugeneruotų formos elementų išvaizdai.
Šį skriptą integruoti reikia šiek tiek kitaip: įtraukite skriptą į dokumentą ir į <body> žymę įterpkite atributą onload="prettyForms()".
jQuery: jqTransform
Mano nuomone, pats geriausias iš paminėtų skriptų ne tik todėl, kad formos elementai atrodo labai simpatiškai, tačiau ir dėl to, kad skriptas paremtas jQuery JavaScript biblioteka, kurią pats dažnai naudoju projektuose. Pasirinkimo iš sąrašo elementas taip pat turi gražų efektą (slideIn ir slideOut).
Naudojimo instrukcijas rasite jqTransform projekto puslapyje.
Taip pat reikėtų paminėti QuirksMode tinklalapyje esantį įrašą apie tai, kaip stilizuoti failo įkėlimo elementus.
Ieškome įkvėpimo
Pateiksiu keletą pavyzdžių, kaip gražiai stilizuoti formas.
Apibendrinimas
Kaip matote, stilizuoti formas nėra sunku kai žinai, kaip tai padaryti. Jas pagražinti galima ne tik vien su CSS, tačiau ir paveiksliukais, o CSS naudoti kaip įrankį jiems „prilipdyti“. Norėdami dar labiau išpuošti formas, galime naudoti JavaScript skriptus, kurie pakeis standartinius elementus kitais, imituojančiais įprastinių elementų veikimą, ir suteiks daugiau galimybių stilizuojant formų išvaizdą.