ID nebo CLASS?
2.3.2012Jaký 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ář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 :)
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 :)
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.
Ohledne rozsirenosti IE se podivejte na muj oblibeny web http://gs.statcounter.com/ ... ten ie tam tak krasne klesa . A jeste si zvolte, ze chcete videt jen CR a tam to IE je uz na tretim miste.
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.
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:)
"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
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
Dobře, na IE6 zapomeň, ale jinak je to co? Pravda!:) A co je nejlepší prohlížeč? No? Přece Maxthon:) Hau, domluvil jsem..
IE6? Neni to nahodou nazev toho viru, co vyhubil dinosaury ? 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.
ID pro unikátní, CLASS pro ostatní 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)
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
Ja vim, ze validita je ve skutecnosti zbytecnost, ale jdata-* neni validni ani v HTML 5. To ti nevadi?
Tak aby jsi mel klid v dusi 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....
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.
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
Nedávno jsem editoval web (MyTOP09) po jiném programátorovi (zdravím Vaška ) 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.
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.
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 ), 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