ID nebo CLASS?

2.3.2012

Jaký je váš pohled na použití atributů id nebo class pro kaskádové styly? A co pro selektory jQuery? A co teď, když máme HTML 5. Můj názor je jasný, ale budu rád, když se podělíte s vlastními zkušenostmi.

ID vs CLASS z pohledu kaskádových stylů

Já říkám class, jedině class. Nevím, kde se to vzalo, ale na mnoha příkladech v různých materiálech o HTML a CSS autoři používají id pro napojení kaskádových stylů. Důvod proč se kloním ke class je, že id musí být dle definice HTML unikátní v celém framu. Prohlížeče jsou ale velmi benevolentní a dovolí vám stylovat i více prvků se stejným id. A proč dělám tedy humbuk kolem problému, který očividně neexistuje?

ID vs CLASS z pohledu javascriptu

Problém totiž přijde až s použitím javascriptu. Ve svých projektech používám jQuery, kde jsem se právě s tímto problémem setkal. Začnete-li používat id pro identifikaci html elementů, tak si na to pěkně zvyknete a při napojování jQuery je budete využívat také. Například takto:

$(document).ready(function(){
   $('#logo').click(function(){
      // animace loga, skryti, ...
   });
}); 

No a jednoho dne budete dělat formulář a tak mu dáte id, přes jQuery napojíte Tinymce a vše funguje tak jak má. No a pak tento formulář chcete zobrazit na stránce vícekrát, třeba pro reakci na každý zobrazený článek. A teď právě narazíte. Už si nejsem přesně jistý, zda to byl problém jQuery nebo Tinymce, ale jakmile jsem měl v HTML více elementů se stejným id, tak se to celé po... pokazilo. Buď jQuery nebo Tinymce chápají unikátnost id striktněji než HTML prohlížeče a požadovanou operaci vám provede pouze na prvním zachyceném elementu.

Připouštím, že je to tak trochu extrémní případ. Ale to je zatím jeden, a někomu z vás se to možná stalo v jiných případech. Proto je podle mne class lepší. Je zkrátka nekonfliktní a umožňuje i zápis metadat pro javascript. Id samozřejmě stále musíme používat pro tagy label, tam námitek nemám.

Hurá je tu HTML 5

No konečně, konečně se sešla rada starších internetu se soudruhy z NDR a udělali atribut data-cokoliv. Od té doby je pro mne vše vyřešeno. Id používám jen pro tag label. Class používám jen pro kaskádové styly a ne pro jQuery, tak jak tomu rada starších internetu na počátku chtěla. A pro napojení javascriptu používám atribut data-jquery. Ihned pak poznám, zda má element nějaký význam pro javascript. 

Kdybych například chtěl AJAXem odesílat formulář, tak bych HTML napsal nějak takto ...

<form action="index.php" method="post" data-jquery="KontaktniFormular">
   <label for="jmeno">Jméno:</label>
   <input id="jmeno" name="jmeno" type="text" />
   <label for="zprava">Zpráva:</label>
   <textarea id="zprava" name="zprava"></textarea>
   <input type="submit" name="Odeslat">
</form> 

... a obslužný JS by vypadal takto ...

$(document).ready(function(){
   $('[data-jquery=KontaktniFormular]').submit(function(event){
      event.preventDefault();
      $.post('index.php',$(this).serialize());
   });
}); 

Jak řešíte id/class/jquery vy?

Komentáře

Přidej svůj komentář

Přidání komentáře

11.4.2015 10:28 - cialis
I really enjoy reading on this website, it holds great articles. Don't put too fine a point to your wit for fear it should get blunted. by Miguel de Cervantes.
7.4.2012 14:21 - Method

prijde vam, ze nemam vlastni nazor? ano je tomu tak, ale proc vymyslet neco, co uz ti lepsi vymysleli za mne :) koncenve v jquery, v bootstrap a objektove programovani se vsemi best practice :)

7.4.2012 14:18 - Method

jen se odklonim k tem prohlizecum, tak ono je hezke, ze to jede na jadre WebKit, ale Safari taky jede na WebKitu, ale je tak silene narocny na vykon procesoru, ze pouzitelny se mi zda az ted na Core i5 ... zato Chrome ma webkit a bezi prakticky na cemkoli co umi x86 instrukce :D

bohousi s tim brigadnikem jsi mne teda urazil, jelikoz jsem tam (asi) jediny :D ale zrovna tohle je tema, co by chtelo nejak ujednotit, zatim mi rozumne opravdu prijde atribut data na feature a stylovani pres class. (netvrdim, ze to tak striktne pouzivam, ale rozhodne s tim zacinam :) )

no a ohledne pojmenovani stylovani, sice je to ukecany, ale vyhovuje mi to jak to ma bootstrap ... .table .table-bordered :)

6.4.2012 20:12 - Bogan

Data-jquery chci pouzivat pro js, prave protoze js zadny svuj tag nema (inline javascripty nepocitam).

Ja dlouhy nazvy (samozrejme se to nesmi prehanet) zachytavacich tagu podporuju, ale jde o to ze je nechci psat do classy. I kdybych jim daval prefix JS, tak se ve firme najde nejakej brigos, kterej mi na to napoji i grafiku. Tag data-jquery svuj vyznam krasne vysvetluje.

Mozna by to bylo na jine tema, ale u CSS pouzivam hlavni element a pak relativni vedeljsi. Tak treba kdyz to zacina malym pismem, treba jako "left", "first", "name" a podobne takt o samo o sobe nema vyznam, ale funguje to az ve spojeni s hlavnim elementem s velkym pismenem. Treba .FormNovyUzivatel .name nejak zohyzdi name input v registracnim formulari. Nebo .TableZbozi . right zaridi text-align do prava. Ale treba .Content .right udela float treba na obrazku do oprava. Pak muzu pouzivat jasne nazvy a nemusim to mit moooc dlouhy.

JEste jsem zkousel take varianty .FormNovyUzivatel-name nebo .TableZbozi-right, ale to je moc ukecany.

6.4.2012 20:01 - Bogan

Ohledne rozsirenosti IE se podivejte na muj oblibeny web http://gs.statcounter.com/ ... ten ie tam tak krasne klesa Usmívající se. A jeste si zvolte, ze chcete videt jen CR a tam to IE je uz na tretim miste.

6.4.2012 19:58 - Bogan

Methoduv prispevek zacinajici "jquery podporuje i br" je cista pravda. 

Kdybychom kazdy element formulare ocejchovali class="kontaktniFormularInputJmeno", tak bychom tim sli proti zakladni idee CSS, ktera je prave tady kvul itomu, abychom nemuseli u kazdeh elementu resit grafiku zvlast.

6.4.2012 09:48 - Prochy

Já nepopírám, že data* je krok vpřed. Jen nevidím důvod, proč ho používat jako identifikátor pro JS.

kontaktniFormularInputJmeno je špatnej příklad, ale na velkejch věcech se tomu nevyhneš a ve finále pořádný názvy ušetří mraky času - hlavně těm co to budou po tobě opravovat:) Viva la ComboBox38:D

Když bych ti ukázal fíčury, který mám na Maxthonu rád, tak bys mi odpověděl seznamem pluginů, kterýma si můžeš zakydat svůj prohlížeč:) Jako funkční celek by se to ale stopro nevyrovnalo. Jinak standartně používá Webkit, na Trident si můžeš přepnout, případně se ti přepne sám pokud je vynucenej compatibility view pro IE v kódu. A už dost honění a ať si každej na browsení používá co chce:) Určitě se ale schodneme, že na debug je nejlepší FF:)

6.4.2012 00:38 - Method

"Internet Explorer je asi nejrozšířenější internetový prohlížeč dneška. Přesto se o něm rozhodně nedá říci, že by byl tím nejlepším. Maxthon je prohlížeč pracující právě s jádrem IE, který přináší jak větší komfort ovládání, tak mnoho dalších funkcí. "

MUHEHEHE, viry nam mutuji

6.4.2012 00:34 - Method

jquery podporuje i brrr ... IE 6, tudiz atributovej selektor pojede bez problemu (a kdo nepouziva JS Framework je sebevrah)

class by melo zustal pro stylovani a camelCase je sice fajn, ale ve spojeni s class="kontaktniFormularInputJmeno" mi to prijde celkem brutalni :D

oni ten atribut data jen tak pro nic za nic do HTML 5 nedavali. sice nevim co je ten prohlizec, jehoz jmeno nejde ani vyslovit zac, ale bude to stejna tragedie jako je Safari a Opera ... vzdusnej Chrome, ktery dodrzuje "nepsane" standardy vede

5.4.2012 20:22 - Prochy

Dobře, na IE6 zapomeň, ale jinak je to co? Pravda!:) A co je nejlepší prohlížeč? No? Přece Maxthon:) Hau, domluvil jsem..

5.4.2012 19:02 - Bogan

IE6? Neni to nahodou nazev toho viru, co vyhubil dinosaury Smějící se? Tak takove geronty opravdu podporovat nebudu. Ja na tehlech strankach snad ani nepodporuju IE vubec. Zkus si tohle zobrazit v IE a uvidis, co se ti zobrazi za varovani.

5.4.2012 15:05 - Prochy

ID pro unikátní, CLASS pro ostatníMrkající  Vlastní identifikátory bych vůbec nezaváděl, pokud nejsou potřeba. Když už chceš odlišit JS přístupný prvky, tak proč definovat nový nestandartní parametr, když stačí doplnit CLASSu o další hodnotu - třeba class="kontaktniFormularInputJmeno JS_kontaktniFormularInputJmeno". Navíc pokud chceš pak element i stylovat, asi bude lepší použít v CSS class selector, než atributovej(v IE6 ti podle mně nepojede)

4.4.2012 11:33 - Tweetak

No jak rikas, validita neni tak nejak dulezita a tohle je rychly a jasny zapis... ono je to zatim jen nastrel, ktery bych chtel pouzit, zatim jsem se nad tim jeste nedonutil zacit poradne premyslet... ale data-jquery je moc dlouhy, kor kdyz by jsi chtel mit dalsi parametry, ktere by jsi chtel pouzit pro jquery, jako ja mam to *-value....

Trochu se to HLAVNI tema zvrhlo jinam Usmívající se

3.4.2012 19:08 - Bogan

Ja vim, ze validita je ve skutecnosti zbytecnost, ale jdata-* neni validni ani v HTML 5. To ti nevadi? 

3.4.2012 07:21 - Tweetak

Tak aby jsi mel klid v dusi Usmívající se Ja ve svem "webu" pouzivam "zatim predbezne" jdata (jdata-value,....) attribut, ktery mi urcuje jquery veci. ID zasadne nepouzivam, protoze za rok se k tomu vratim a budu nadavat, ze tam potrebuju ten element mit dvakrat a budu to muset prepisovat na classu v js, css a kodu.... Je to je to, jak jsem naucenej...nic vic....

30.3.2012 18:12 - Bogan

Atribut name je sice u formulare definovan, ale nepouziva se a je oznacen jako deprecated.

Spravnou cestu vyvoje webu stale hledame, a snad ji jednou i najdeme. Usmívající se

29.3.2012 16:27 - Method

a nepouziva se nahodou name i u formulare?

jo s tim JS to mas pravdu, v CIS projektech mam obcas fakt problem cokoli napojenyho najit, protoze ty, lubos, vasek a nevim kdo dalsi mate uplne odlisny styl a kazdy pouzivate jine soubory na jinem umisteni :D

28.3.2012 21:22 - Bogan

Nedávno jsem editoval web (MyTOP09) po jiném programátorovi (zdravím Vaška Smějící se) a nemohl jsem vůbec přijít, jak je napojen javascript na konkrétní element ve formuláři. Bez FireQuery do FireBugu bych to asi hledal dlouho. Vřele doporučuju.

28.3.2012 21:18 - Bogan

Napojování jQuery přes name formulářového prvku je ok a dokonce to funguje pro stylování i v IE (asi od verze 7). Jen se nesmí zapomenout určit i identifikátor formuláře, jinak vám to může nadělat paseku. Takže třeba [data-jquery=mujformular] [name=jmeno]. Pravda teda je, že to není 2x pěkný zápis. Ale je v něm pěkně vidět ta lokace, kde se vyskytuje.

28.3.2012 15:13 - Method

osobne mam zabehnuto v zakladnim layoutu webu pouzivat ID a to jen u prvku, ktere tam budou opravdu unikatne - header, vrchni menu, obsah, prava lista ( a podobne Usmívající se ), protoze tak to do mne hustilo 90% knih a materialu ...  ostatne co jsem ted nahledl do "mistrovstvi v CSS" take pouzivaji pro klicove elementy stromu ID (netvrdim, ze je to neomylna knizka)

jquery jsem snad nikdy pres ID nenapojoval, vetsinou u formularu napojuji pres atribut name a odkazy pres class, ale pokud html 5 prichazi s atributem data, bude to nejlepsi reseni