Přejít k navigační liště

Zdroják » Webdesign » Automatické číslování pomocí kaskádových stylů

Automatické číslování pomocí kaskádových stylů

Články Webdesign

Pomocí kaskádových stylů můžete nechat automaticky číslovat nadpisy, obrázky, tabulky a další části (X)HTML dokumentů. S příchodem Internet Exploreru 8 budou čítače podporovány všemi majoritními prohlížeči. Pojďme se proto podívat, jak můžete automatické číslování použít i ve svých dokumentech.

Tento článek je překladem anglického originálu vydaného na portálu Dev.Opera.

Úvod

Když vytváříte dokumenty, bývá užitečné číslovat jednotlivé sekce a vytvořit obsah. Můžete číslovat ručně vkládáním čísel přímo do HTML, to ovšem bude neefektivní, pokud se jejich pořadí mění a vy musíte všechna čísla aktualizovat. CSS 2.1 nabízí automatické číslování pomocí čítačů (CSS counters) a tento článek vám ukáže, jak je můžete používat. Než začneme, je třeba říct, že Internet Explorer zatím čítače nepodporuje, ale připravovaná verze IE8 již ano.

Nastavujeme čítač

Prvním krokem je vynulování čítače na jeho základní hodnotu a přidělení jména. To uděláme vlastností counter-reset stejně jako v následující příkladu:

body { counter-reset: section; } 

V tomto příkladu jsme na začátku prvku body vynulovali čítač na hodnotu nula a pojmenovali jsme jej section. Čítači můžeme přidělit jakýkoliv název. Můžeme také použít volitelný druhý argument a ručně nastavit výchozí hodnotu čítače. Pokud chcete, aby čítač začínal od čísla 5, nastavíte jej takto:

body { counter-reset: section 4; } 

V tomto případě jsme museli napsat hodnotu 4, protože čítač se inkrementuje před svým každým zobrazením. Pokud nastavíte jeho počáteční hodnotu na 4, je před tím, než se prvně zobrazí, jeho hodnota zvýšena na 5.

Inkrementujeme čítač

V dalším kroku musíme určit, kdy se má náš čítač inkrementovat a o jakou hodnotu. To nastavíme vlastností counter-increment. Pokud nespecifikujeme žádnou hodnotu, bude použita výchozí hodnota 1.

body { counter-reset: section 4; }
h2 { counter-increment: section; } 

Pokud chcete raději zvyšovat čítač vždy o dvojku, použijte:

h2 { counter-increment: section 2; } 

Můžete zadat i nulu nebo záporné hodnoty. Pokud nastavíte nulování a inkrementaci u stejné značky HTML, bude napřed provedeno nulování a teprve po té proběhne inkrementace o specifikovanou hodnotu. Výsledkem následujícího příkladu bude hodnota 2.

h2 {
    counter-reset: section;
    counter-increment: section;
} 

Zobrazení čítače

Jakmile je čítač nastaven, můžete jej na stránce zobrazit. To provedeme pomocí generovaného obsahu – funkce counter a pseudotřídy  :before.

body { counter-reset: section 4; }
h2 { counter-increment: section; }
h2:before{ content: counter(section) " "; } 

Pokud zobrazíte čítač na stejném prvku HTML, na kterém provádíte inkrementaci, jak jsme udělali i v příkladu výše u h2, pak je čítač napřed inkrementován a teprve po té použit.

Nyní se můžete podívat na hotovou ukázku.

Používáme dva a více čítačů

Funkci counter můžete ve vlastnosti content použít i vícekrát. V následujícím příkladu použiji dva čítače k číslování sekcí a podsekcí. Čítač podsekce bude s každou novou sekcí vynulován.

body { counter-reset: section; }

h2 {
    counter-increment: section;
    counter-reset: sub-section;
}

h2:before, h3:before { content: counter(section) "." counter(sub-section) " "; }

h3:before {
    counter-increment: sub-section;
} 

Používáme vnořené čítače

Vedle zobrazování jednotlivých čítačů existuje i funkce counters() pro zobrazení vnořených čítačů. Je vhodná např. pro seznamy, které mohou být vnořovány do sebe. V příkladu výše by ale nefungovala, protože tam podsekce nebyla vnořena v hlavní sekci, ale zobrazena vedle ní.

Vnořené čítače můžeme nastavit následovně:

ol {
  counter-reset: section;
  list-style-type: none;
}

ol li { counter-increment: section; }

ol li:before{ content: counters(section, ".") ". "; } 

Tím zvýšíme čítač s každou položkou seznamu bez ohledu na to, kolik vnořených seznamů kód obsahuje. Vynulování čítače musíte provést na správném místě, aby bylo nulování provedeno pro každý vnořený seznam. V tomto případě nulujeme čítač na značce ol. V následujícím příkladu bude první vnořený seznam začínat 1.1 a zvyšovat se 1.2, 1.3 atd. Druhý vnořený seznam bude začínat hodnotou 1.1.1 a zvyšovat se 1.1.2 atd.

<ol>
    <li>item 1
        <ol>
            <li>sub item 1
                <ol>
                    <li>sub-sub item 1</li>
                    <li>sub-sub item 2</li>
                    <li>sub-sub item 3</li>
                </ol>
             </li>
             <li>Sub item 2</li>
        </ol>
    </li>
    <li>item 2</li>
</ol> 

Podívejte se na ukázku používající vnořené čítače.

Nastavujeme styl čítače

Čítači je možné nastavit styl pomocí druhého argumentu funkce counter. Hodnoty jsou stejné jako u vlastnosti list-style-type. Ačkoliv jsou všechny hodnoty validní, u čítačů dávají smysl jen některé hodnoty, protože disc, square nebo circle zůstávají vždy stejné bez ohledu na hodnotu čítače. Styl čítače můžete nastavit následovně:

ol li:before{ counter(answer, lower-alpha) ") "; } 

Zobrazte si ukázku použití funkce counter pro nastavení stylu čítače. V příkladu najdete ukázku explicitního specifikování hodnot pro nulování a inkrementaci.

Použití čítačů k nahrazení zastaralého atributu start

Pokud potřebujete použít u značky ol atribut start, aby váš seznam začínal jinou hodnotou než jedničkou, a zároveň používáte striktní doctype, zřejmě jste si všimli, že vaše stránka není validní. Vedou se spory, zda je atribut start prezentační nebo nikoliv a pracovní verze HTML5 jej již za zastaralý (deprecated) nepovažuje (alespoň v době psaní tohoto článku). Ovšem i kdyby byl atribut start v HTML5 opět povolen, nepomůže vám to, pokud se vaše stránka musí validovat proti doctype HTML4. Doctype HTML5 zatím není určen pro produkční použití, protože podpora HTML5 je stále experimentální. Pokud chcete, aby vaše stránka byla validní, musíte buď použít doctype transitional nebo čítače.

Pokud chcete seznam začít čtyřkou místo jedničkou, docílíte toho následovně:

body { counter-reset: list-order 3; }

ol li {
    counter-increment: list-order;
    list-style-type: none;
}

ol li:before{ content: counter(list-order) " "; } 

Nesmíte zapomenout schovat odrážku seznamu, jinak by se zobrazilo dvojí číslování.

Podívejte se na ukázku použití čítačů pro nahrazení atributu start.

Závěr

V tomto článku jsme probrali, jak nastavit a stylovat čítače pomocí kaskádových stylů místo, abyste je museli psát přímo do HTML kódu. Jsou užitečné pro číslování sekcí článků nebo pro číslování tabulek. Použití čítačů vám ušetří čas při změně struktury dokumentu. Je také flexibilnější, protože typ čítače může být změněn v kaskádových stylech a bude automaticky aktualizován, ať již obsah stránky změníte vy nebo javascriptový kód (např. pokud máte skript pro řazení seznamů nebo tabulek). Zmínili jsme i možnost nahrazení zastaralého atributu start. Čítače jsou jednoduché k používání, jedinou překážkou jejich širšího použití je, že nejsou podporovány staršími verzemi Internet Exploreru.

Tento článek je překladem textu Automatic numbering with CSS Counters, jehož autorem je David Storey a je zde zveřejněn s laskavým svolením Opera Software.

Použili jste někdy automatické číslování z CSS2?

Komentáře

Subscribe
Upozornit na
guest
39 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
Roj

Sice se mi to libi a urcite si to nekam na blog prdnu ale…

Vyhoda, ze pri zmene obsahu (vlozeni, smazani) se zbytek automaticky precisluje je zaroven smrtelnou nevyhodou. Cislovani se taxtane naprosto samoucelne, protoze neni mocne ciselne odkazat na zadnou takto cislovanou polozku, anic by hrozilo nebezpeci, ze odkaz (nejen hypertextovy) ztrati platnost.

Cislovani octavcu a kapitol totiz neni presentacni, ale semanticky prvek! Davat ho do CSS je kravina.

Roj

Fakt?
Takze kdyz ja ted sem do tohoto komentu napisu, ze se mi libi bod 2.4.4 ze stranky na http://superstranka.cz, kam nekdo vlozi mezitim novou kapitolu, tak to bude fungovat?
Tu knizku MUSIM SEHNAT!! :-)

dond

Roji, číslování podle pořadí není sémantické ani náhodou, to přece nemůžeš myslet vážně.

Textové procesory používají něco jako kotvy, tzn. každému referencovanému místu (nadpis, citát, rovnice atp.) přiřadíš jednoznačný identifikátor, pomocí kterého se pak odkazuješ. Jestli je nadpis první nebo patnáctý, je pak jedno. Stejně (ne)fungují odkazy na webu – když budeš jako text odkazu používat nadpis odkazované stránky, může se stát, že nadpis někdo změní, ale text odkazu (ve tvém HTML) ne.

Tvůj příklad je nesmyslný a ty to víš. Když tě odkážu na Shakespearova Hamleta, řekněme na stranu 57, a neřeknu, které vydání mám na mysli – bude to fungovat?

Roj

Jaxem jiz psal, nejde mi o odkazovani hypertextove, ale zcela obecne.
Textove procesory primarne pocitaji s tim, ze dokument se v jednom omaziku UZAMKNE a cislovani se tim jednoznacne zakonservuje. To se stane nejpozdeji tim, ze se dokument VYTISKNE.
Pak muzes brat cislovani octavcu jako jednoznacne, trvale a nemenne.

Tvuj priklad s odkazem na stranku knihy s tim nema naprosto vubec nic spolecneho.

Pokud beres cislovani octavcu jako dekoraci, pak ano. Octavec ma svoje neviditelne vnitrni ID, ktere je ovsem ctenarum k nicemu, a tak jim naservirujes "nejakacisilka", aby to nevypadalo blbe, hlavne aby sla aritmeticky poporade.
Ja ho chapu jako dulezitou pomucku v orientovani v textu. Cislo navzdy a trvale patri ke "svemu" octavci. V takovem pripade jednoznacne patri do OBSAHU, nikoliv do CSSS.

kucikk

Řekněme, že máš text o 10 kapitolách. Za pátou kapitolu přidáš ještě jednu. Jaký bude mít číslo? 11? To by nebylo moc přehledný, takže to bude 6 a ke všem následujícím se taky přičte jedna.
Já bych to vytvářel pomocí CSS, po přidání kapitoly je míň práce.
BTW každá verze dokumentu může být uložena zvlášť (místa v DB je dost). Stejně jako například na w3.org, kde je taky možnost dohledat každou předchozí verzi. A na ní můžeš odkazovat pomocí "viz kapitola 2.1.3". Tam se to už nezmění.

Roj

Jasne, nejvic to usetri praci zakonodarcum, kdyz se (ciste hypoteticky) rozhodnou pridat za paragraf 1 dalsi paragraf a ono se to krasne precisluje vsecko :-)
Nas pravni system bude jeste odusevnelejsi, nez uz je :-)

Jeste stale si nekdo mysli, ze cislo neni soucasti obsahu?

kucikk

Číslo kapitoly je pouze pro lepší orientaci a jako takové do obsahu nepatří. Stejně jako například číslo stránky.
Když bude mít kapitola číslo 2.1.3 tak to nic nezmění na tom co kapitola popisuje. Z toho usuzuju, že má nulovou informační hodnotu.
Data s nulovou informační hodnotou patří do CSS.

Každá novela zákona má číslo. Paragraf bez čísla zákonu je na prd. Bez výčitek svědomí bych ty paragrafy přečísloval.

pankreas

Kazdy zakon ma cislo, to je pravda. Novely funguji jako patch, kdy se rekne: Zakonem XY/2008 Sb. se v zakone QP/1966 Sb. v platnem zneni vypousti §107 a do §403, odst. (3) se vklada radek (i) ve zneni "zahradkari, myslivci".

Proto v zakonech najdete veci jako "§ 56 (vypusten)".
Proto se v kanonickych odkazech uvadi nejen cislo zakona, ale i dolozka "v platnem zneni" – rozumej "ve zneni, kere je platne prave nyni, po upravach vsemi novelami".

Precislovani paragrafu je zvracenost – predstavte si deset let trvajici soudni spor, ve kterem se vam kazdy mesic vse precisluje!

Cislo je v pripade zakona jednoznacne soucasti obsahu a slouzi jako jedinecny identifikator, jakoz i jako udaj sam o sobe.

kucikk

No tak dobře, když se stanu zákonodárcem, tak paragrafy přečíslovávat nebudu…

ph55

Když bude mít kapitola číslo 2.1.3 tak to nic nezmění na tom co kapitola popisuje. Z toho usuzuju, že má nulovou informační hodnotu.

Pre mňa osobne to číslo informačnú hodnotu ma a to dosť veľkú: hovorí, že súvisí s kapitolami 2.1.1,2.1.2 … a je podkapitolou vo „väčšej kapitole 2.1, ktorá patrí taktiež do nejakého celku 2 atď…

Roj

Jiste, do doby, nez to nekdo zedituje.

Roj

Ano cely problem spociva v tom, ze mezi tistenym dokumentem a webem je rozdil nejen v trvdosti materialu ;-)
Pokud se pouzije automaticke cislovani v media=print, skoro proti nemu nic nemam.

Respektive vyraz "automaticke" neni presny, spravny vyraz je "dynamicne cislovani", proti tomu budu za vsech okolnosti.

Automaticke lze chapat i tak, ze se v jeden okamzik automaticky VYGENERUJI cisla a ZAPISOU SE DO OBSAHU. Proti tomu samozrejme nic nemam. A pochopitelne potom musi editor takoveho dokumentu sam zvazit a rucne provest pripadne precislovani.

Anonymní

Článek se mi líbí, nápad je to hezký a provedení elegantní.

Roji, s tištěnou podobou bude také problém. Stačí, když já budu mít první vydání knihy a Ty, druhé, rozšířené. Když Ti pak ze své knihy opíšu číslo na zajímavou pasáž – např.: 4.2.3.10 – a Ty ve své najdeš něco jiného, protože jako na potvoru zrovna zde došlo k přečíslování, budeš ve stejném kýblu jako na webu (a já za truhlíka :-) ).

Rozdíl vidím pouze v tom, že přečíslování v knihách není tak snadné jako na webu a tak nějak intuitivně cítíme, že vytištěné je neměnné. Stejně jako v knihách, kde bych uvedl krom diskutovaného čísla i ISBN a číslo vydání, tak i u webového dokumentu by bylo třeba odkázat na správnou verzi dokumentu. Ano, ne každý verzuje – přesto doufám, že u dokumentů na "úrovni zákona" (ISO normy ap.) se budou uchovávat veřejně dostupné: 1. verze, 1. revize, 2. revize, 2. revize s dodatkem a pak 2. verze, atd.

Anonymní

Brbla si nepřál zůstat v anonymitě, leč, při prohlížení náhledů a po editacích před odesláním se mu to přesto povedlo 87)

Roj

Vicemene souhlasim, a asi o tom neco blognu.

Roj

Pokud tady jeste nekdo je, tak muze :-)
http://roj.bloguje.cz/748308-cislo-jako-dekorace.php

Radek

Souhlasím, číslování je věc stylu. V různých stylech můžu kapitoly (ne)očíslovat jinak. Ale jak tedy vyrobit ty odkazy, když nechci hypertextové (třeba pro tisk)? Chci mít v textu napsáno: "Podrobnosti najdete v kapitole X.Y". Nadpis odkazované kapitoly můžu identifikovat třeba atributem id. Podle stylu se mi u nadpisu objeví čísla X.Y. Až sem je to výborné. Ale lze potom nějak spárovat id, na které se odkazuji s vygenerovaným číslem kapitoly? Představuji si něco jako stylové pravidlo pro element <a>, ale netuším, jak propojit counter a id. Funguje něco takového? Pokud ne, tak mi v CSS něco chybí.

Roj

A to uz vubec nemluvim o tom, jaxe dokument bajecne zprehledni, kdyz si nekdo vypne styly :-)))
Jo ono vlastne vypinat styly uz nejni kůl, aha.

Roj

No jo, to pak ovsem uz neni usnadneni prace, ale pekna vychytavka. Samozrejme, proti peknym vychytavkam nic nemam, dyt jsem rikal, ze si to na blog klidne prdnu. :-)
Cislo jako dekorace, proc ne? ;-)

Ale puvodni smysl systematickeho cislovani (viz zakony) byl jiny.

Petr

Nechápu proč se pořád snažíš hledat nějaký rozpory. Vždyť tvrdíte všichni to samé. Stále se tu dokola píše, že číslování nemá zásadní informační hodnotu, ale pouze zpřehledňuje formátování. Proto patří do CSS.
A když je automatické, pracuje se s tím lépe, než když bych musel pořád přečíslovávat ručně.

Roj

Cislovani nema zasadni informacni hodnotu. PRO TEBE. V takovem pripade tedy nekam do hlavicky napis, ze to tak je.
Protoze ctenarka tohle netusi. Ona si muze myslet, ze je to poctive, muze si zapamatovat, popripade nekam zaznamenat, ze s bodem 8.2 souhlasi/nesouhlasi, ze z neho vychazi. Nezapise si plne zneni toho bodu, jen to cislo.
Ty ji ho pak zmenis a zpusobis informacni chaos. Vytvorils barieru, snizils pouzitelnost pri vypnutem CSS. Co se da delat, CSS 2.1. to tak chce, ja uz se nedivim nicemu.

Honza

Pokud někdo souhlasí s bodem 8.2 – tak by měl vědět v jakém dokumentu jaké verze. Protože samotné číslo 8.2 nenese žádnou hodnotu, se kterou lze či nelze souhlasit (krom samotné hodnoty 8.2). Já chápu, že to myslíš dobře, přesto se obávám, že je to nešťastné řešení.

Chápu, že jako na mapách je každá změna nežádoucí (změna jména ulice, přečíslování domů), je přesto nutné tyto věci dělat, aby se zachovala logika systému (zboří se dům, postaví nový s jiným počtem vchodů – a když se nepřečísluje, tak to je v jiném městě potom navigace – Patočkova 4, 5, 6, 7, 48, 49, 8, 9) – pro nově příchozího lahoda :-) Je to hodně krkolomné, neřeším orientační čísla… Jenže pak něco najít…

Jirka Kosek

Jako schůdnější a bezpečnější řešení pro generování čísel a křížových odkazů bych rozhodně viděl využití XSLT pro vygenerování HTML s již doplněnýmu čísly a odkazy. Přece jen CSS3 je v nedohlednu a ty složitější CSS výrazy, které tohle umí, už jsou dost nečitelné.

xx

jak Hakon s Bertem Bosem psali knihu pomocí HTML+CSS

To ta kniha musela vypadat. Chudaci ctenari.

xx

A mohl bych se zeptat, nevite, cim z te knihy generovali nejaky tisknutelny format (mam na mysli PDF apod.)? Osobne znam jen PrinceXML, ale z hlediska typografie jsou jeho moznosti velice omezene.

Knihu jsem bohuzel necetl.

Láďa

Hlavní důvod proč se nedají použít prakticky je uvedený, že z rodiny IE to podporuje jenom nevydaný IE8. Takže jenom na intranety a podobně.

Lisicky

Bohužel se žádný čítač nezobrazí. Chyba je i v originále. Chybí tam
slovíčko content. Správně to má být tedy takto:

h2:before{ content: counter(section) " "; }

tomaash

Je to moc hezké a určitě by to bylo i praktické, kdyby…

Vezmu to od jinud a položím základní otázku: kdo a jak nejčastěji tvoří obsah na webu?

Pokud si myslíte, že jsme to my, tj. pokročilí uživatelé, programátoři, nebo vývojáři webu (ať už se pod tím skrývá kdokoliv :), pak jste na omylu. Nejčastěji jsou to lidé, kteří používají nějaké webové rozhraní, nějakého CMS, který jim někdo připravil a ve kterém je velice často nějaký WYSIWYG editor (TinyMCE, a spol.).

Dobře víme, že ačkoliv jsou to nástroje velice flexibilní a umožňují dělat uživateli spoustu skopičin (například velice oblíbený červený text, žeano :), tak s ním uživatelé umí pracovat na úrovni MS Wordu, tj. vůbec. Nechápou, proč by měli dělat seznamy pomocí toho podivného tlačítka s puntíkama, když jej přeci můžou udělat pomlčkama a textem na novém řádku, nebo dokonce proč by měli dělat číslovaný seznam jinak, než očíslováním nových řádků (a ti pokročilejší/esteticky citlivější, si dokonce všimnou, že text začíná podle plotu, takže jej donutí "chovat se slušně" tabulkou :) Tito lidé dělají nadpisy zásadně pomocí nového odstavce s tučným, zvětšeným písmem, ačkoliv mají k dispozici velice snadný nástroj jak takový nadpis vyrobit třemi kliky (označit text, otevřít roletku a vybrat nadpis).

Z toho vyplývá, že tyhle vlastnosti jsou úžasné pro nás hračičky, kteří víme, co je CSS a jak funguje, pro nás, kdož tušíme k čemu je sémantické značení obsahu. Pro uživatele, kteří na web jen potřebují něco napsat, je něco takového naprosto zbytečné.

A teď proč to píšu: dokud někdo uživatele nedonutí/nenaučí používat toho co mají a nevysvětlí jim, k čemu je to dobré, jsou všechny tyhle vychytávky užitečné jen pro těch pár "geeků", kteří je znají a vědí co s nimi. Jako jediné východisko z této šlamastyky se mi jeví zavržení všech WYSIWYG klikátek udělátek, a důsledné protlačování nějaké formy Wiki zápisu. Ale nuťte to uživatelům…

Stručně a jasně: Bez jiného přístupu k tvorbě obsahu ze strany běžných uživatelů jsou všechny (byť sebelepší) vlastnosti CSS, podobně užitečné jako americký radar v českých Brdech proti severokorejským raketám ;)

Každopádně díky za dobrý instruktážní článek :)

Filip Jirsák

S příchodem Internet Exploreru 8 budou čítače podporovány všemi majoritními prohlížeči.

Obávám se, že příchod IE8 nic nezmění na tom, že MSIE6 a WIE7 nadále zůstanou majoritními prohlížeči. Chápu, že tím bylo myšleno, že každá produktová řada z těch nejdůležitějších prohlížečů už bude mít alespoň jednu verzi prohlížeč, který danou věc umí – na to se ale nehraje, uživateli MSIE6 nijak nepomůže, že IE8 už něco umí.

MD

Naucme prohlizece rozumnet TeXu, ten uz to ma vsechno vyresene ;-)

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.