CSS Counters to często pomijana funkcjonalność obsługiwana już w każdej normalnej przeglądarce. Nawet w IE8, która do normalnych się nie zalicza.
W niniejszym wpisie pokażę jak i dlaczego warto używać liczników w CSS, a także sytuacje, w których lepiej sobie odpuścić.
CSS Counters – wprowadzenie
Liczniki w CSS są bardzo proste w użyciu. Natywnym przykładem ich wykorzystania są listy numerowane OL, choć równie dobrze możemy je przypiąć do każdego innego elementu.
Żeby zainicjować nowy licznik używamy poniższego kodu:
1 2 3 | body { counter-reset: sectionNum; } |
sectionNum to nazwa licznika, której będziemy później używać w kodzie. Oczywiście liczniki takie możemy przypiąć do dowolnego elementu HTML – tym razem padło na BODY, bo liczeniu podlegać będą jego dzieci, elementy SECTION.
Liczniki domyślnie rozpoczynają iterację od zera, lecz można to z łatwością przestawić, np.:
1 2 3 | body { counter-reset: sectionNum 10; } |
Możliwe jest również ustawianie kilku liczników naraz:
1 2 3 | body { counter-reset: sectionNum 10 imgNum 0; } |
Inkrementacja licznika
Mając już zdefiniowany licznik, możesz zacząć go inkrementować oraz wyświetlać. Zrobisz to następująco:
1 2 3 | section { counter-increment: sectionNum; } |
Tym samym, wstawiając do dokumentu jakikolwiek element SECTION, licznik zostaje powiększony o 1. Jeśli chciałbyś zliczać tylko elementy SECTION najwyższego poziomu (dzieci BODY), musisz użyć selektora dziecka:
1 2 3 | body>section { counter-increment: sectionNum; } |
Wyświetlanie licznika
Czas na najważniejsze – wyświetlanie aktualnej wartości licznika. Musimy w tym celu zdefiniować dla elementu pseudo-element :before lub :after i użyć specjalnej funkcji counter:
1 2 3 4 5 6 | section:before { content: 'Sekcja ' counter(sectionNum) ': '; display: block; font-weight: 700; font-size: 3em; } |
Prosty przykład działania liczników w CSS:
Wady liczników CSS
Choć liczniki w CSS są bardzo przydatne, czasem jednak nie możemy ich wygodnie używać. W listach numerowanych mamy możliwość użycia atrybutów typu start czy value, np.:
1 2 3 4 5 | <ol> <li value="10">item</li> <li>item</li> <li>item</li> </ol> |
czy
1 2 3 4 5 | <ol start="10"> <li>item</li> <li>item</li> <li>item</li> </ol> |
Co jeśli chcemy użyć licznika CSS naliczającego od 7? Musimy go zdefiniować w następujący sposób:
1 2 3 | ol { counter-reset: itemNum 7; } |
A co jeśli w kolejnym elemencie licznik będzie zaczynał się od 11, 19 czy 25? Musielibyśmy zdefiniować kilka różnych klas albo pisać style inline. Nie możemy użyć tak wygodnego sposobu jak przy listach numerowanych:
1 | <body data-start="20"> |
1 2 3 | body { counter-reset: itemNum attr(data-start); } |
Niestety to spora wada i nie znalazłem jeszcze wygodnego rozwiązania.
Praktyczne zastosowanie
Dzisiejszy wpis mówi o podstawach CSS, lecz mimo wszystko, do dzisiaj widuję mnóstwo projektów, w których pomija się używanie liczników na rzeczy brzydkiej składni typu:
1 2 3 | <p><span>1.</span> Blabla</p> <p><span>2.</span> Blabla</p> <p><span>3.</span> Blabla</p>/ |
Nie popełniaj takich błędów! No chyba, że musisz (patrz punkt wyżej).
Liczniki w CSS są naprawdę proste w użyciu i często się przydają – do list numerowanych w efektywny sposób (np. liczba jest w polu otoczonym tłem czy innym ozdobnikiem), jako meta-dane wskazujące o numerze sekcji, czasem jako fallback dla przeglądarek nieobsługujących JavaScriptu (np. tabów), etc.
Praktycznym przykładem będzie natomiast kod z ostatnio wykonywanego przeze mnie projektu – myślę, że ładnie pokazuje możliwości CSS Counters:
Przykład jest responsywny (do zobaczenia także tutaj).
[…] 8. Liczniki w CSS [08:45] http://blog.kamilbrenk.pl/liczniki-w-css/ […]
Ostatni przykład po prostu piękny, będę miał chwilę to przeanalizuje kod bo jak to zobaczyłem to „LOL” :)
I tak musiałem nadprodukować i trochę spieprzyć kod przez dodanie wsparcia dla IE8 :(
Ciekawy wpis.
Czekam na więcej mając nadzieję że to nie koniec publikacji!
Pozdrawiam
Wszystko bardzo fajnie opisane. Super!
Dokładnie, kiedy coś nowego na blogu?
@Redrooster:
http://blog.kamilbrenk.pl/co-dalej-z-blogiem/#comment-103852
Czyli mogę w „czystym” CSS zrobić coś takiego?
http://www.psmkms.krakow.pl/images/phocagallery/Aktualnosci2/thumbs/phoca_thumb_l_foto282.jpg