Devel.cz Lupa Měšec Podnikatel Root Zdroják.cz DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Vyhněte se nejobvyklejším chybám v HTML5

HTML5 je nový standard, a ačkoli vychází z toho, co už všichni webdesignéři a kodéři dobře znají, tak jeho novinky, zejména tzv. „sémantické“ tagy, nemusí být vždy a za všech okolností jasně srozumitelné. V článku si ukážeme nejčastější situace, kde se právě při práci s těmito elementy nejčastěji chybuje.

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

Tento článek napsal pro web HTML5Doctor  Richard Clark. Richard je Head of Interactive v KMP Digitata, Manchester, UK. Můžete jej sledovat na twitteru nebo na jeho  osobní stránce.

Originál článku vyšel na webu HTML5Doctor pod licencí CC-BY-NC.

Během hodnocení stránek pro HTML5 gallery a odpovídání na dotazy čtenářů na HTML5 Doctor jsem viděl spoustu stránek v HTML5 a jejich kódů. V tomto článku si ukážeme některé chyby a zlozvyky, které se často opakují, a vysvětlíme si, jak se jim vyhnout.

Nepoužívejte section jako obalový element pro stylování

Jedním z nejobvyklejších problémů, které ve stránkách v HTML5 vídáme, je mechanické nahrazování  <div> ů elementem pro vyznačování sekcí — konkrétně nahrazení obalových <div> ů (použitých při stylování) elementem <section>. V XHTML nebo HTML4 se běžně používá konstrukce:

<!-- HTML 4-style code --><div id="wrapper">
  <div id="header">  
    <h1>My super duper page</h1>
    <!-- Header content -->
  </div>
  <div id="main">
    <!-- Page content -->
  </div>
  <div id="secondary">
    <!-- Secondary content -->
  </div>
  <div id="footer">
    <!-- Footer content -->
  </div>
</div>

Místo ní nyní vídáme toto:

<!-- Tento kód nepoužívejte! Je špatně! -->
<section id="wrapper">
  <header>  
    <h1>My super duper page</h1>
    <!-- Header content -->
  </header>
  <section id="main">
    <!-- Page content -->
  </section>
  <section id="secondary">
    <!-- Secondary content -->
  </section>
  <footer>
    <!-- Footer content -->
  </footer>
</section>

Na rovinu – je to prostě špatně:<section> není obalový element. Element <section> označuje sémantický oddíl v obsahu, čímž pomáhá vytvořit document outline. Sekce může obsahovat nadpis. Pokud hledáte obalový element pro celou stránku (v HTML, HTML5 či XHTML), zvažte nastylování elementu <body>, jak popisuje Kroc Camen. Pokud potřebujete nějaký obalový element kvůli stylování, použijte <div>, který nenese sémantickou informaci. Jak vysvětluje Dr Mike, DIV není mrtvý, a pokud nemáte nic, co by bylo sémanticky vhodnější, je to stále dobrý způsob, jak aplikovat stylování.

Pokud si toto uvědomíme, dokážeme vytvořit správný kód pro předchozí příklad, včetně některých atributů ARIA. (Poznámka: možná budete potřebovat nějaký <div> navíc, podle použitého designu.)

<body>
  <header>  
    <h1>My super duper page</h1>
    <!-- Header content -->
  </header>
  <div role="main">
    <!-- Page content -->
  </div>
  <aside role="complementary">
    <!-- Secondary content -->
  </aside>
  <footer>
    <!-- Footer content -->
  </footer>
</body>

Pokud si nejste jisti, jaký element použít, odkazuji vás na HTML5 sectioning content element flowchart.

Používejte header a hgroup jen pokud jsou potřeba

Psaní tagů tam, kde nemusí žádné být, nedává smysl, že? Naneštěstí stále vídám <header> a <hgroup> v situacích, kde nemají žádné opodstatnění. Podrobnosti o jejich použití naleznete v článcích the <header> element a the <hgroup> element, ale zde si pravidla stručně shrneme:

  • Element <header> reprezentuje skupinu úvodních nebo navigačních prvků a obvykle obsahuje titulek sekce
  • Element <hgroup> seskupuje nadpisy <h1><h6> v situacích, kdy nadpis sekce má více úrovní, jako např. podtitulek, alternativní titulek nebo řádek s tagy.

Nadužívání header

Pravděpodobně víte, že element <header> může být použit v dokumentu několikrát – což přineslo populární vzor:

<!-- Nepoužívejte tento kód! Header je tu nadbytečný -->
<article>
  <header>  
    <h1>My best blog post</h1>
  </header>
  <!-- Article content -->
</article>

Pokud váš <header> obsahuje jen jediný nadpis, tak <header> vypusťte. Element <article> zajistí, že titulek bude zahrnut do struktury dokumentu, a protože <header> neobsahuje v tomto případě víc prvků (jak je popsáno v dokumentaci), tak není důvod psát kód, který je nepotřebný. Prostě napište toto:

<article>  
  <h1>My best blog post</h1>
  <!-- Article content -->
</article>

Nesprávné použití <hgroup>

Když je řeč o nadpisech, je na místě zmínit další častou chybu – nesprávné použití <hgroup>. Neměli bychom používat <hgroup> ve spojení s <header>, když:

  • obsahuje jediný nadpis, nebo
  • element <hgroup> bude fungovat i samostatně (tedy bez  <header> u).

První problém vypadá takto:

<!-- Nepoužívejte tento kód! Hgroup je tu nadbytečný -->
<header>
  <hgroup>  
    <h1>My best blog post</h1>
  </hgroup>
  <p>by Rich Clark</p>
</header>

V tomto případě odstraňte <hgroup> a nechte titulek samostatně.

<header>
  <h1>My best blog post</h1>
  <p>by Rich Clark</p>
</header>

Druhý problém je příkladem použití elementů, které nejsou nezbytné.

<!-- Nepoužívejte tento kód! Header je tu nadbytečný -->
<header>
  <hgroup>  
    <h1>My company</h1>
    <h2>Established 1893</h2>
  </hgroup>
</header>

Když jediným potomkem elementu <header> je <hgroup>, tak k čemu je <header>? Pokud v něm nejsou další dodatečné elementy („sourozenci“ <hgroup>), tak <header> vyhoďte.

<hgroup>  
  <h1>My company</h1>
  <h2>Established 1893</h2>
</hgroup>

Další příklady použití <hgroup> najdete v článcích o HGROUP na HTML5Doctor.

Nebalte každý seznam odkazů do <nav>

V HTML5 bylo představeno 30 nových elementů (stav v době psaní článku), což je množství, které může člověka zmást a ztížit výběr toho správného elementu pro určitou situaci. Jinými slovy – neměli bychom těmito super-sémantickými elementy plýtvat. Bohužel přesně to se často stává s elementem  <nav>. Specifikace o elementu <nav>  říká:

Element nav reprezentuje oblast stránky, která odkazuje na jiné stránky či části aktuální stránky, tedy sekci s navigačními odkazy.

Poznámka: Ne každá skupina odkazů na stránce musí být v elementu nav — tento element je primárně určen pro oddíly, které obsahují hlavní navigační bloky. Konkrétně bývá např. běžné, že patičky obsahují odkazy na různé stránky jednoho webu, jako jsou pravidla použití, domovská stránka nebo stránka s copyrightem. Pro takové případy je plně dostačující element footer; když je v takové situaci použitý nav, je nadbytečný.

WHATWG HTML spec

Klíčové slovo je ‘hlavní’ navigace. Můžeme celé dny diskutovat o tom, co je to ‘hlavní’, ale podle mého názoru to znamená:

  • Primární navigace
  • Prohledávání webu
  • Sekundární navigace (sporné)
  • In-page navigace (např. v dlouhých článcích)

Ačkoli není jednoznačně řečeno, co je dobře a co špatně, tak mi cit říká, že následující bloky by neměly být v  <nav>:

  • Stránkování
  • Odkazy na sociální sítě (i když mohou existovat výjimky, například stránky jako About me nebo Flavours)
  • Tagy u blogpostu
  • Kategorie u blogpostu
  • Terciární navigace
  • „Reklamní odkazy“ v patičce

Pokud si nejste jisti, kde <nav> použít, zeptejte se sami sebe: Je to hlavní navigace? Následující tipy mohou pomoci:

  • Nepoužívejte <nav> tam, kde si myslíte, že <section> s nějakým <hx> postačí  — Hixie on IRC
  • Dali byste odkaz na to do bloku „Přeskočit na…“ pro zlepšení přístupnosti?

Pokud je odpověď NE, pak odkaz pravděpodobně nepatří do  <nav>.

Běžné chyby u elementu figure

Ach, <figure>. Správné použití tohoto elementu, spolu s jeho spolupachatelem <figcaption>, je někdy obtížné i pro mistry. Pojďme se podívat na několik běžných problémů s  <figure>.

Ne každý obrázek je ilustrace (figure)

Výše jsem radil, abyste nepsali kód, který je nadbytečný. Tato chyba je podobná. Viděl jsem i weby, kde byl každý obrázek označen jako <figure>. Přitom není žádný důvod balit všechny obrázky do dalšího elementu, jen si tím přiděláváme práci a nepřidáváme k obsahu žádnou užitečnou informaci.

Specifikace popisuje <figure> jako obsah, volitelně s nadpisem, který je samostatný a je z hlavního textu odkazován jako jediná jednotka. V tom je krása elementu <figure>. Může být přesunut z primárního obsahu — například do postranního bloku — aniž by to narušilo tok dokumentu.

Pokud to je čistě ilustrační obrázek, který není v textu zmíněn, tak to rozhodně není <figure>. Případy použití se mohou lišit – pro začátek se zeptejte sami sebe: Je ten obrázek nezbytný k pochopení vlastního textu? Pokud ne, tak pravděpodobně nejde o <figure> (možná je to do <aside>). Pokud ano, zeptejte se znovu: Mohl bych to přesunout do Dodatků? Pokud jsou odpovědi na obě otázky ANO, pak jde pravděpodobně o  <figure>.

Vaše logo není ilustrace (figure)

Totéž co výše platí i pro vaše logo. Zde je pár ukázek toho, co lze v kódu někdy nalézt:

<!-- Tento kód nepoužívejte! Je špatně! -->
<header>
  <h1>
    <figure>
      <img src="/img/mylogo.png" alt="My company"class="hide" />
    </figure>
    My company name
  </h1>
</header>
<!-- Tento kód nepoužívejte! Je špatně! -->
<header>  
  <figure>
    <img src="/img/mylogo.png" alt="My company" />
  </figure>
</header>

K tomu není co dodat. Je to prostě špatně. Můžeme se dohadovat až do úpadu o tom, jestli by logo mělo být v <h1>, ale to není důvod, kvůli kterému si tento příklad ukazujeme. Opravdový problém je zneužití elementu <figure>. Element <figure> by měl být použit pouze tehdy, když je zmiňován v textu nebo v okolních elementech. Myslím, že lze tvrdit že firemní logo bývá jen málokdy zmíněno v obsahu stránky. Prostě a jednoduše – nedělejte to. Místo toho použijte:

<header>  
  <h1>My company name</h1>
  <!-- More stuff in here -->
</header>

Figure nemusí být jen obrázek

Další častý omyl a nepochopení smyslu <figure> je přesvědčení, že může být použit pouze pro obrázky. To není pravda, <figure> může být video, audio, graf (třeba pomocí SVG), citace, tabulka, ukázkový kód, ukázka z knihy, tohle všechno dohromady nebo cokoli jiného, co ilustruje obsah. Neomezujte se s <figure>  pouze na obrázky. Naší prací je popsat co nejpřesněji obsah pomocí k tomu určených značek.

Před časem jsem popisoval <figure> do hloubky.

Neuvádějte nepotřebné atributy

Toto je pravděpodobně nejčastější problém, který se v HTML5 vyskytuje. Ačkoli nejde o vyslovenou chybu, tak bude nejlépe se podobným konstrukcím vyhnout.

V HTML5 není zapotřebí uvádět atribut type u elementů <script> a <style>. Může být leckdy obtížné se těchto atributů zbavit, obzvlášť když je generuje CMS, ale není žádný důvod, proč je nechávat v ručně kódovaných stránkách. Protože všechny prohlížeče očekávají, že skript bude JavaScript a styl CSS, tak takovéhle konstrukce nejsou potřeba:

<!-- tento kód nepoužívejte, není dobře -->
<link type="text/css" rel="stylesheet"href="css/styles.css" />
<script type="text/javascript" src="js/scripts.js"></script>

Místo toho použijte prosté:

<link rel="stylesheet" href="css/styles.css" />
<script src="js/scripts.js"></script>

Nesprávné použití atributů u formulářů

Asi víte, že HTML5 přineslo mnoho nových atributů u formulářů. Jejich podrobnější popis naleznete jinde (např. v článku na Zdrojáku – pozn. překl.), zde si ukážeme, čemu se vyhnout.

Booleovské atributy

Booleovské atributy existují i u multimediálních elementů a dalších, nejen u formulářů. Pravidla ale platí i pro ostatní booleovské atributy u jiných elementů.

Booleovské atributy mají tu vlastnost, že jejich uvedení v kódu znamená, že jsou „zapnuté“ („on“, „true“, „yes“…) Příklady takových atributů:

  • autofocus
  • autocomplete
  • required

Po pravdě jsem špatné použití v tomto případě viděl málokdy, ale např. u  required jsem nalezl:

<!-- Tento kód je špatně -->
<input type="email" name="email" required="true" />
<!-- a tento taky -->
<input type="email" name="email" required="1" />

Ve skutečnosti takováto chyba nezpůsobí žádnou škodu. Prohlížeč vidí atribut required v kódu, takže funkce je zapnutá. Ale co když chceme zapsat opak, tedy funkci „vypnout“, a napíšeme  required="false"?

<!-- Tento kód je taky špatně -->
<input type="email" name="email" required="false" />

Parser vidí atribut required a považuje jej za zapnutý, ačkoli se snažíme říct, že má být vypnutý. Tedy něco, co jsme nechtěli.

Existují tři platné způsoby, jak v HTML říct, že booleovský atribut má být použitý. (Druhá a třetí možnost je určena pro zápis v syntaxi XHTML.)

  • required
  • required=""
  • required="required"

V příkladu výše bychom tedy napsali (v HTML):

<input type="email" name="email" required />

Shrnutí

Je nemožné vypsat všechny podivné zvyky a konstrukce, které se ve stránkách v HTML5 objevují – výše uvedené jsou pouze ty, co se objevují nejčastěji. Znáte také takové příklady, které jste zahlédli na webu? Které části HTML5 potřebují ujasnit? Svěřte se v komentářích.

Poděkování: Ian Devlin, Derek Johnson, Tady Walsh, kurátor HTML5 Gallery a lidé z HTML5 Doctor za materiál k článku.

Martin Malý

Martin Maly

Začal programovat v roce 1984 s progra­movatelnou kalkulačkou. Pokračoval k BASICu, assembleru Z80, Forthu, Pascalu, Céčku, dalším assemblerům, před časem v PHP a teď je rád, že neprogramuje…

Školení: Hackujeme operační systém Android

 

Školení vám ukáže, jak se dostat k Linuxu (tzv. "rootování"), který se pod hezkou tváří Androida skrývá a jak ho naplno využít. Pomůže vám to při záloze dat, zvětšování prostoru pro aplikace nebo sdílení připojení k internetu a pokud chcete z telefonu dostat opravdové maximum, ukážeme vám, jak v něm vyměnit kompletní systém za lepší.

Podrobnější informace a přihláška

Přehled názorů

Re: Vyhněte se nejobvyklejším chybám v HTML5
asdasd 22. 8. 2011 01:02
Nový
└ 
Re: Vyhněte se nejobvyklejším chybám v HTML5
Jiří Petruželka (Nox) 22. 8. 2011 08:45
Nový
Obalování
Bubák 22. 8. 2011 02:44
Nový
├ 
Re: Obalování
johan 22. 8. 2011 07:37
Nový
└ 
Re: Obalování
Martin Malý 22. 8. 2011 07:38
Nový
 
└ 
Re: Obalování
Jiří Pudil 22. 8. 2011 11:55
Nový
 
 
└ 
Re: Obalování
Jakub Vrána 24. 8. 2011 14:02
Nový
k čemu to tedy je?
Martin Soušek 22. 8. 2011 09:53
Nový
├ 
Re: k čemu to tedy je?
Rdm 22. 8. 2011 10:12
Nový
└ 
Re: k čemu to tedy je?
Jiří Šoman 22. 8. 2011 10:53
Nový
zajímavý článek, ale...
stope32 22. 8. 2011 10:05
Nový
├ 
Re: zajímavý článek, ale...
Rdm 22. 8. 2011 10:11
Nový
│
└ 
Re: zajímavý článek, ale...
stope32 22. 8. 2011 10:23
Nový
│
 
└ 
Re: zajímavý článek, ale...
Jiří Šoman 22. 8. 2011 10:45
Nový
│
 
 
└ 
Re: zajímavý článek, ale...
j 14. 9. 2011 13:44
Nový
└ 
Re: zajímavý článek, ale...
Bronislav Klučka 22. 8. 2011 10:28
Nový
Nové HTML 5 tagy a jejich použití
Jiří Šoman 22. 8. 2011 10:42
Nový
├ 
Re: Nové HTML 5 tagy a jejich použití
asdasd 22. 8. 2011 11:04
Nový
│
├ 
Re: Nové HTML 5 tagy a jejich použití
Jiří Šoman 22. 8. 2011 11:10
Nový
│
│
└ 
Re: Nové HTML 5 tagy a jejich použití
Ales Roubicek 22. 8. 2011 13:15
Nový
│
│
 
└ 
Re: Nové HTML 5 tagy a jejich použití
Jiří Šoman 22. 8. 2011 15:17
Nový
│
└ 
Re: Nové HTML 5 tagy a jejich použití
Jiří Petruželka (Nox) 22. 8. 2011 11:18
Nový
├ 
Re: Nové HTML 5 tagy a jejich použití
Petr 25. 8. 2011 11:17
Nový
└ 
Re: Nové HTML 5 tagy a jejich použití
j 14. 9. 2011 13:47
Nový
Zbytečnosti
Franta Kučera 22. 8. 2011 11:23
Nový
├ 
Re: Zbytečnosti
asdasd 22. 8. 2011 12:09
Nový
│
└ 
Re: Zbytečnosti
Franta Kučera 22. 8. 2011 12:19
Nový
│
 
└ 
Re: Zbytečnosti
asdasd 22. 8. 2011 12:28
Nový
│
 
 
└ 
Re: Zbytečnosti
j 14. 9. 2011 13:50
Nový
├ 
Re: Zbytečnosti
maryo 22. 8. 2011 22:51
Nový
└ 
Re: Zbytečnosti
Patrik Votoček 22. 8. 2011 23:57
Nový
 
└ 
Re: Zbytečnosti
asdasd 23. 8. 2011 00:17
Nový
 
 
└ 
Re: Zbytečnosti
juraj 23. 8. 2011 10:03
Nový
Booleovské atributy
Franta Kučera 22. 8. 2011 11:43
Nový
└ 
Re: Booleovské atributy
asdasd 22. 8. 2011 12:04
Nový
 
├ 
Re: Booleovské atributy
Franta Kučera 22. 8. 2011 12:12
Nový
 
│
└ 
Re: Booleovské atributy
asdasd 22. 8. 2011 12:22
Nový
 
├ 
Re: Booleovské atributy
srigi . 22. 8. 2011 13:17
Nový
 
│
└ 
Re: Booleovské atributy
Bronislav Klučka 22. 8. 2011 13:24
Nový
 
└ 
Re: Booleovské atributy
Bronislav Klučka 22. 8. 2011 13:23
Nový
 
 
└ 
Re: Booleovské atributy
asdasd 22. 8. 2011 13:41
Nový
 
 
 
└ 
Re: Booleovské atributy
Bronislav Klučka 22. 8. 2011 13:45
Nový
 
 
 
 
├ 
Re: Booleovské atributy
Bronislav Klučka 22. 8. 2011 13:46
Nový
 
 
 
 
├ 
Re: Booleovské atributy
David Grudl 22. 8. 2011 14:01
Nový
 
 
 
 
│
└ 
Re: Booleovské atributy
Bronislav Klučka 22. 8. 2011 14:18
Nový
 
 
 
 
└ 
Re: Booleovské atributy
asdasd 22. 8. 2011 14:10
Nový
 
 
 
 
 
└ 
Re: Booleovské atributy
Bronislav Klučka 22. 8. 2011 14:21
Nový
 
 
 
 
 
 
└ 
Re: Booleovské atributy
Bronislav Klučka 22. 8. 2011 14:43
Nový
Jsou uzavřené tagy alá XHTML v HTML 5 chybou nebo ne?
Miki 22. 8. 2011 13:10
Nový
├ 
Re: Jsou uzavřené tagy alá XHTML v HTML 5 chybou nebo ne?
Ales Roubicek 22. 8. 2011 13:18
Nový
│
└ 
Re: Jsou uzavřené tagy alá XHTML v HTML 5 chybou nebo ne?
Miki 22. 8. 2011 13:31
Nový
│
 
└ 
Re: Jsou uzavřené tagy alá XHTML v HTML 5 chybou nebo ne?
Bronislav Klučka 22. 8. 2011 13:33
Nový
├ 
Re: Jsou uzavřené tagy alá XHTML v HTML 5 chybou nebo ne?
gondo 22. 8. 2011 15:19
Nový
└ 
Re: Jsou uzavřené tagy alá XHTML v HTML 5 chybou nebo ne?
Martin Malý 22. 8. 2011 15:46
Nový
Chyba v posledním příkladu
Jakub Vrána 24. 8. 2011 14:12
Nový
└ 
Re: Chyba v posledním příkladu
Bronislav Klučka 25. 8. 2011 17:28
Nový
 
└ 
Re: Chyba v posledním příkladu
Jakub Vrána 25. 8. 2011 17:30
Nový
 
 
└ 
Re: Chyba v posledním příkladu
Bronislav Klučka 25. 8. 2011 17:32
Nový
 
 
 
└ 
Re: Chyba v posledním příkladu
Jakub Vrána 25. 8. 2011 17:34
Nový
 
 
 
 
└ 
Re: Chyba v posledním příkladu
Bronislav Klučka 25. 8. 2011 17:35
Nový
 
 
 
 
 
└ 
Re: Chyba v posledním příkladu
Jakub Vrána 25. 8. 2011 17:36
Nový
 
 
 
 
 
 
└ 
Re: Chyba v posledním příkladu
Bronislav Klučka 25. 8. 2011 17:39
Nový
Kritika předchozího článku
Petr 29. 8. 2011 14:53
Nový
Co podpora?
Jatan 6. 9. 2011 12:50
Nový
└ 
Re: Co podpora?
Bronislav Klučka 7. 9. 2011 11:59
Nový
 
└ 
Re: Co podpora?
Jatan 8. 9. 2011 14:18
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem