Sub-kategorie v XHTML a JS

MyEgo.cz

home foto blogy mywindows.cz kontakt

Sub-kategorie v XHTML a JS

Doplňoval jsem včera sub-kategorie do BLOG:CMS, kvůli zpřehlednění větších webů, a narazil jsem na problém, jak řešit reprezentaci a formátování sub-kategorií v XHTML, a zároveň skrývání/odkrývání skupin v JavaScriptu.

Skoro automatické řešení je použít zde tagy ul, li, nicméně, nakonec se mi jako sémanticky správnější zdálo použití dl, dt, dd, navíc obaleno jedním div, kvůli formátování a XHTML validitě (a MSIE).

Tag dl se zde používá jako formátovací "obal" pro CSS pro skupinu, tag dt je název skupiny, a tagy dd jsou sub-kategorie zařazené v dané skupině. Vypadá to celé nějak takto:

<div id='subcat'>
 <dl id='group1>
  <dt>Skupina 1</dt>
   <dd>Kategorie 1</dd>
   <dd>Kategorie 2</dd>
   <dd>Kategorie 3</dd>
 </dl>
 <dl id='group2>
  <dt>Skupina 2</dt>
   <dd>Kategorie 4</dd>
   <dd>Kategorie 5</dd>
 </dl>
</div>

Je to řešení sémantické, XHTML validní, jednoduše nastylovatelné, a poskytující prostor i pro JavaScriptové skrývání/odkrývání skupin kategorií, třeba tímto jednoduchým skriptem:

// strom je zobrazen
var categoryhidden = false;
// schovat strom
function categoryfold(){
categoryhidden = true;
 var i=1;
 var ele;
 while (ele=document.getElementById('group'+i++)) 
  ele.style.display='none';
}
// rozbalit strom
function categoryexpand(){
 categoryhidden=false;
 var i=1;
 var ele;
 while (ele=document.getElementById('group'+i++)) 
  ele.style.display='block';
}
// prepnout strom
function categorytoogle(){
 if (categoryhidden)
  categoryexpand();
 else
  categoryfold();
}
// zobrazit jednu kategorii
function categoryswitch(j){
 if (categoryhidden) {
  categoryexpand();
  return;
 }
 var i=1;
 var ele;
 while (ele=document.getElementById('subcat'+i))
  if (i++==j) 
   ele.style.display='block'; 
  else 
   ele.style.display='none';
 categoryhidden=true;
}

Celé to řešení je vtipné v tom, že funguje na libovolné množství kategorií, ve chvíli kdy ele=document.getElementById('group'+i++) vrátí false, je jasné, že se jedná o poslední skupinu kategorií.

Řešení je implementováno v nejnovější verzi BLOG:CMS, jako plugin NP_SubCategories.php.

Je škoda, že zaostalý MSIE nepodporuje v CSS konstrukce následujícího typu, podobné věci by šlo stylovat v CSS mnohem lépe, bez divů, a rovněž zpracovávat bez hromady id identifikátorů pro JavaScript, jen pomocí DOMu…

div#subcat dl dt>a{color: black; display: block;}

Komentáře

  1. 1 llook 07.11.04, 15:16:53
    FB

    Nevím, jestli podkategorii je správné vyjádřit jako definici termínu. Já tedy preferuji neseřazený seznam (ul). Seznam kategorií. Pokud má kategorie podkategorie, jsou tyto součástí nadřazené kategorie, a tak dál, pokud má podkategorie další podkategorie.

    Zajímalo by mě, jak (a zda) budou s použitím definičních seznamů (dl) sémanticky řešeny podkategorie podkategorií. Snad ne takhle:
    <dl>
    <dt>kategorie</dt>
    <dd><dl><dt>podkategorie</dt>
    <dd>podkategorie podkategorie</dd>
    </dl>
    </dd>
    </dl>

  2. 2 Radek Hulán 07.11.04, 15:58:50

    [1] ale já tu neřeším neexistující problém zvaný "co by, kdyby", sub-kategorie subkategorií prostě nejsou, a pokud budou, zvolí se ideální řešení ;)

  3. 3 Zdenek Merta 07.11.04, 17:22:00
    FB

    Mohu se zeptat v cem je semanticky lepsi pouziti definice terminu namisto seznamu?

  4. 4 Ján "johno" Suchal 08.11.04, 00:30:00
    FB

    [3] Sémanticky to určite nie je lepšie ale aspoň to nerobí bordel v IE5 s marginmi a paddingami. Kto to skúšal nulovať vie o čom hovorím. IE5 je ale história takže ja by som tiež použil radšej zoznam ako definition list.

  5. 5 Ján "johno" Suchal 08.11.04, 00:33:12
    FB

    Hmm, Radku a na čo ako má slúžiť to schovávanie a rozbalovanie keď sa stav ani nezapamätáva v cookies? To je len tak keď sa mi zachce klikať?

  6. 6 noname 08.11.04, 00:38:50
    FB

    no malinko se to podobá tomu co mám na kehilaprag.cz, ale bez těch divů

  7. 7 emilk 08.11.04, 12:43:31
    FB

    to, ze elementum prirazujete idecka, abyste je mohl skriptovat a tim ve finale emulovat onen elegantni css selector, ktery ovsem v ie nefunguje
    - to se nemusi delat rucne, staci na to napsat skript. jeden takovy vhodny od pana deana

    dela presne to, co vy rucne, projde css soubor, nalezne pravidla, ktera ie neumi, najde elementy, kterych se to tyka, doda jim idecka a pozadovane styly, pripadne handler, kdyz chcete hover nad necim jinym nez a

    smena je nasledujici:
    programatoruv komfort, mensi a prehledny kod za cenu dodatecne prace na klientske strane (ale delaji to stroje, koho to pali :)
    kdo nema zapnuty js, tak je na tom spatne, zle :(
    ale ten si muze vypnout i css a videt unordered list
    (ktery se na to semanticky nejlepe hodi) v cele sve rozvinute a hierarchicke krase

  8. 8 Radek Hulán 08.11.04, 12:46:13

    [7] IE7 znám, dobře, a považuji jej za špatné řešení.. Místo pár ID navíc tam doplňovat 100KB behaviours, to je... nesmysl

  9. 9 emilk 08.11.04, 13:28:11
    FB

    10kB core + 8kB css2
    pripadne +2kB css3

    to je jak jeden obrazek v jpg
    a zustane to v cache

    az se MS pochlapi, a udela poradnej browser nebo koupi do zakladni distribuce operu, tak to zrusite a mate kod, kde je radost delat upravi podle prani zakaznika :)

  10. 10 Vašek 08.11.04, 18:27:18
    FB

    [4] jo, asi je menší problém ostylovat dl-dt-dd stejně v IE a mozille než ul-li. Škoda, že se do specifikací html nedostal nadpis seznamu lh. Hodil by se.

Nový komentář

Pro přidání komentáře se musíte nejdříve  registrovat Facebookem

Banan.cz