CSS lépésről-lépésre: képválasztás listapanel segítségével
A mai nap (a múlt hetihez hasonlóan) egy új sorozat indul útjára, CSS lépésről-lépésre címmel. A sorozat keretében minden alkalommal egy-egy CSS alapú megoldással fogunk megismerkedni, melyek mind a CSS rugalmasságát, illetve lehetőségeit fogják bemutatni. Első alkalommal egy olyan listaválasztó kialakításával ismertet meg minket P][G, melynél a szöveges felsorolás mellett képek is megjelennek, s ezáltal - például - kategóriák közül "WYSIWYG" módon választhatunk. Boogie.
A sasszeműek észrevehetik, hogy a kép bizony nem Internet Explorerben készült, és igazuk is van. A következőkben leírtak csakis Mozillában (illetve a Gecko alapú böngészőkben: Firefox, Galeon, Camino, stb.) voltak hajlandóak működni. Mivel - mint fentebb is írtam - saját, belső használatra készült oldalon használom a bemutatott eljárást, és amúgy is Mozillát használunk, ezért különösebben nem izgatott a dolog.Nos, eddig még nem túl izgalmas, de legalább Internet Explorerben is működik! :-))Internet Explorert használó barátaink már most nem azt látják, amit kéne, ugyanis az <option> elem magassági beállításának nincs hatása (az én IE-mben biztos nincs!). De lépjünk tovább!
Tehát a képecskék elhelyezéséhez vagy a <select> elem <option> elemeit látjuk el id-vel, és a stíluslapban később ezekre hivatkozunk, vagy magukat az <option> elemeket módosítjuk a megfelelő stílusjellemzőkkel. A következőkben az utóbbi megoldást láthatjuk:Könnyen rájövünk innentől kezdve, hogy nem kellene a háttérképnek ismétlődnie, és a szöveg pedig kezdődhetne beljebb, hogy ne fedje el a képet. Pont ezt tudjuk a background-repeat és a padding tulajdonság segítségével beállítani! Stíluslapunkat ennek megfelelően átalakítva:Ha még ez sem elég, akkor az
A tökéletes végeredményt elérve paskoljuk meg vállunkat, dőljünk hátra és mosolyodjunk el, mert olyant vittünk véghez, amit az internetező társadalom kb. 10% tud majd megcsodálni, értékelni pedig még annyi sem!
Internet Explorert használók már csak a fejüket kapkodják, és sehogy sem akar összejönni nekik. Nem is fog - a hiba a "készülékükben van", sajnos ez a lehetőség az egyik, mely náluk nem működik.
A kezdetekhez visszakanyarodva HTML kódunk ismét legyen a következő:Stíluslapunkat a tulajdonság kiválasztók kipróbálására a következőként módosítsuk (helytakarékosság miatt a szabályokat egy sorba tördeltem, de aki idáig követte a cikket azt már nem hiszem, hogy ez megzavarja!):Most, hogy többféle megoldást is találtunk a kezdeti problémára, nem marad más hátra, mint a további kísérletezés. Lehet az egészet külső stíluslapra helyezni, melyet valamilyen programmal, adatbázisból generálunk, lehet játszani a formázási lehetőségekkel, s lehet gondolkodni még újabb lehetőségeken is. Ehhez sok sikert kívánok!
Külön köszönet Boogie-nak az építő kritikáért :-)
■ A sorozatban megjelent
- CSS lépésről-lépésre: képválasztás listapanel segítségével
- CSS lépésről-lépésre: dobozolás
- CSS lépésről-lépésre: nyomtatás
- CSS lépésről-lépésre: táblázatnélküli oldalfelépítés
- CSS lépésről-lépésre: a design tervtől a kész oldalig
Az ötlet
Nemrégiben, saját használatunkra készített portálrendszer adminisztrációs felületének kialakításakor, a hírek rovat kategóriáinak kialakításánál az jutott eszembe, milyen jó is lenne, ha a kategóriákba sorolásnál egy listapanelből választhatnék, és a választáskor mindjárt magában a listapanelban látnám is a kategóriához tartozó képet. A képkiválasztást már jó pár helyen láttam rádiógombokkal vagy felugró ablakok segítségével megvalósítani - de én direkt nem így akartam. Pár perc kísérletezgetés után elértem a kívánt eredményt:A végeredmény
Csatolmányok
- A cikk anyaga (27.75 KB)
A megvalósítás
A megvalósítást természetesen szokásos HTML elemekkel és CSS definíciókkal képzeltem el. Lehetséges lenne akár JAVA appletet, Flash megoldást is készíteni, vagy netán többoldalas Javascript kódokat kiagyalni, de valahogy úgy éreztem, ezekhez nem lenne idegzetem. A kezdetekben még csak agyamban létező CSS-es megoldás pedig olyan elegánsnak és pofátlanul egyszerűnek tűnt, hogy nem bírtam ellenálni a kísértésnek és nekiálltam.A select elem létrehozása
Kiindulásként egy mezei lista szolgál:
<select name="icon" id="icon" size="3">
<option value="0">Hírek</option>
<option value="1">Karbantartás</option>
<option value="2">Fontos</option>
<option value="3">Mozilla</option>
<option value="4">Firefox</option>
</select>
Lista méreteinek meghatározása
Mivel képeim 48x48-as méretűek, ezért a lista (select) magasságát ehhez alkalmazkodva határoztam meg (size="3" - tehát 3x48px=144px), a szélességet pedig hasraütésszerűen 200px-ben. Ne feledjük a 48px széles képecskének is el kell férnie, valamint a szövegnek is, és az sem árt, ha pár pixel helyet hagyunk a kettő között! Miután a listapanel befoglaló méretei megvannak, nekiláthatunk az egyes <option> elemek megformázásának is. Ismét a kép méretéből kiindulva a magasság 48px magas lesz. Stíluslapunk, illetve listapanelünk tehát a következőképp fest:
<style type="text/css">
select {
height: 144px;
width: 200px;
}
option {
height:48px;
}
</style>
A képek - végre!
Végre elértünk a képek elhelyezéséhez. CSS szabályainkat tovább finomítva rövidesen széles mosollyal nyugtázhtajuk, hogy a végeredmény olyan, mint mi magunk - azaz tökéletes. :-)Tehát a képecskék elhelyezéséhez vagy a <select> elem <option> elemeit látjuk el id-vel, és a stíluslapban később ezekre hivatkozunk, vagy magukat az <option> elemeket módosítjuk a megfelelő stílusjellemzőkkel. A következőkben az utóbbi megoldást láthatjuk:
<select name="icon" id="icon" size="3">
<option style="background-image:url(images/news.png);" value="0">Hírek</option>
<option style="background-image:url(images/cog.png);" value="1">Karbantartás</option>
<option style="background-image:url(images/important.png);" value="2">Fontos</option>
<option style="background-image:url(images/mozilla.png);" value="3">Mozilla</option>
<option style="background-image:url(images/firefox.png);" value="4">Firefox</option>
</select>
<style type="text/css">
select {
height: 144px;
width: 200px;
}
option {
height: 48px;
padding-left: 60px;
text-align: left;
background-repeat: no-repeat;
}
</style>
Utolsó simítások
Bár már azt hinnénk készen vagyunk, utolsó simításként azért próbáljuk meg a listaszöveget a képek közepéhez igazítani függőlegesen. A függőleges igazítás problémás dolog, ha nem táblázatcellán belül vagyunk. Jelen esetben is hiába próbálkoztam avertical-align: middle
beállítással, eredménye nem volt. Így a jó hasraütéses hagyományokat követve a padding-top
értékét állítottam át, úgy kábéra. Ez a betűméret függvényében változhat, de ha pontosan pixelre megadunk font-size
segítségével egy méretet is, akkor nagy meglepetés nem fog érni minket. Ezzel együtt persze a height
értéket csökkenteni kellett, hogy az összesített magasság továbbra is az eredeti 48px maradjon.
<style type="text/css">
select {
height: 144px;
width: 200px;
}
option {
height: 33px;
padding-top: 15px;
padding-left: 60px;
text-align: left;
background-repeat:no-repeat;
}
</style>
option:hover
pszeudo kiválasztó esetében adjunk meg még egy szabályt: option:hover { background-color: #F0F8FF; }
. Így egérrel a listaelemek fölött a listaelemek háttérszíne megváltozik.A tökéletes végeredményt elérve paskoljuk meg vállunkat, dőljünk hátra és mosolyodjunk el, mert olyant vittünk véghez, amit az internetező társadalom kb. 10% tud majd megcsodálni, értékelni pedig még annyi sem!
A tökéletesnél is tökéletesebb
Rövid pihenő és megfelelő mennyiségű öndicséret után térjünk vissza még egy kicsit a tettek mezejére! Miért is?, kérdezhetitek, hiszen már készen vagyunk. Igaz, de ez a megoldás még nem aknázza ki teljes mértékben a CSS 2 lehetőségeit. Mivel Internet Explorerben a megoldásunk úgyse működik, Mozilla alatt pedig igen, ezért itt szabadon használhatunk olyan dolgokat is, amik tekintetében egyébként vissza kellene fognunk magunkat. Aki kicsit nézegette már a szabvány, az tudja, hogy HTML tulajdonság alapján is megadható szabály. Jelen példánkban az <option> elem attribútuma avalue
, mely 0 és 4 közti intervallumban vesz fel értékeket. A tulajdonság kiválasztó segítségével igen sokféleképpen behatárolhatjuk azon elemeket, melyekre a szabályt alkalmazzuk. Lássunk ebből néhányat:[att]
Akkor illeszkedik, ha az elem rendelkezik bármilyen att attribútummal. Pl.: h1[title]{color:blue} - minden title attribútummal rendelkező h1 elem kék lesz.
[att=val]
Akkor illeszkedik, ha az elem att attribútuma pontosan val. Pl.: option[value="1"]{color:green} minden option elem, melynek value attribútuma 1, zöld lesz.
Akkor illeszkedik, ha az elem rendelkezik bármilyen att attribútummal. Pl.: h1[title]{color:blue} - minden title attribútummal rendelkező h1 elem kék lesz.
[att=val]
Akkor illeszkedik, ha az elem att attribútuma pontosan val. Pl.: option[value="1"]{color:green} minden option elem, melynek value attribútuma 1, zöld lesz.
Internet Explorert használók már csak a fejüket kapkodják, és sehogy sem akar összejönni nekik. Nem is fog - a hiba a "készülékükben van", sajnos ez a lehetőség az egyik, mely náluk nem működik.
A kezdetekhez visszakanyarodva HTML kódunk ismét legyen a következő:
<select name="icon" size="3">
<option value="0">Hírek</option>
<option value="1">Karbantartás</option>
<option value="2">Fontos</option>
<option value="3">Mozilla</option>
<option value="4">Firefox</option>
</select>
<style type="text/css">
select { height: 144px; width: 200px; }
option { height: 33px; padding-top: 15px; padding-left: 60px; text-align: left; background-repeat: no-repeat; }
option[value="0"] { color:red; }
option[value="1"] { color:blue; }
option[value="2"] { color:green; }
option[value="3"] { color:navy; }
option[value="4"] { color:fuchsia; }
option:hover { background-color: #F0F8FF; }
</style>
Tehát a különböző value
attribútummal rendelkező <option> elemek a value
értéke szerint kapták meg színüket. Innen már ismét csak egy kis lépést kell tennünk, hogy a kívánt eredményt kapjuk. Ha netán több lista (<select>) is szerepel oldalunkon, úgy érdemes megkülönböztetni ezeket valahogy, és a kiválasztóban ezzel megtoldva megadni a szabályt (magától adódik, hogy a select
elem name
tuladjonságát használjuk erre a célra):
[colorer=html]
<style type="text/css">
select { height: 144px; width: 200px; }
option { height: 33px; padding-top: 15px; padding-left: 60px; text-align: left; background-repeat: no-repeat; }
select[name="icon"] option[value="0"] { background-image: url(images/news.png); }
select[name="icon"] option[value="1"] {background-image: url(images/cog.png); }
select[name="icon"] option[value="2"] {background-image: url(images/important.png); }
select[name="icon"] option[value="3"] {background-image: url(images/mozilla.png); }
select[name="icon"] option[value="4"] {background-image: url(images/firefox.png); }
select[name="icon"] option:hover { background-color: #F0F8FF; }
</style>
Külön köszönet Boogie-nak az építő kritikáért :-)
Források
- CSS-el kapcsolatos infók: http://www.w3.org/Style/CSS/#specs
- Az attribútum kiválasztóról: http://www.w3.org/TR/2001/CR-css3-selectors-20011113/#attribute-selectors
- Ikonok: http://www.kde-look.org
url és az attr(value)
Tegyük fel, hogy nem számok, hanem szövegek az értékek:
Nem rossz ötlet.
-boogie-
Aha
Ahogy a cikk végén is utalás történik rá, a szabályok legenerálására marad vmilyen szerveroldali scriptnyelv, ami valószínű amúgy is rendelkezésre áll, hiszen ha nem lenne, akkor hogyan dolgoznánk fel a <select>-ban kiválasztott opciót...
P][G
Esetleg
http://www.w3.org/TR/CSS21/syndata.html#counter
--
Szeretettel: Károly György Tamás
kgyt&kgyt.hu - http://kgyt.hu
IE vs FF
kozepre igazitas fuggolegesen
height: 48px;
padding-left: 60px;
text-align: left;
background-repeat:no-repeat;
line-height:48px;
vertical-align:middle;
}
Jo a cikk egyebkent! Kene egy kep IE-bol, hogy hogyan is nez ki ott. Nem ront el semmit, csak egyszeruen sima selectkent fog megjelenni.
Jano
Az ember mindig tanul...
P][G
pelda zipben
Jano
Megoldható
-boogie-
Délután küldöm...
P][G
Csatolva
-boogie-
Kiraly
Szorgalmi
P][G
js minek
Viszont ezt mar nem nehez kiegesziteni, hogy IE-nek meg genaraljon linkeket egy DIV mezobe, ami linkekre kattintva egy eltuntetett selectben kivalsztjak a megfelelo erteket :)
Jobb ötlet
-boogie-
Közben ilyesmit agyaltam ki
Egyébként naná, hogy oktatási céllal.
insertRule csak Mozillaban van IE-ban addRule kéne, de mivel az egész cuccos amúgy sem működik, ezért azzal külön nem szöszmötöltem
:-)
P][G
"don’t know what that means"
"Képválasztás listapanel segítségével - don’t know what that means, but it’s about styling select and option elements. The code is in english."
:)