Yetii – czyli moje podejście do tematu “zakładek” Grzegorz Wójcik
11 Sep, 2008
|
Artykuły, JavaScript
Yetii został wymieniony w artykule [1] 75 (Really) Useful JavaScript Techniques w prestiżowym Smashing Magazine - cóż za zaszczyt! :)
Zakładki (ang. tabs) są coraz częściej wykorzystywanym „interaktywnym” elementem stron internetowych. Sprawdzają się zwłaszcza w sytuacji, gdy na stronie jest naprawdę tłoczno (przykładowo jest to strona główna serwisu) i dysponujemy ograniczonym obszarem dla zaprezentowania większej ilości informacji.
W Internecie znajdziemy mnóstwo darmowych „zakładkowych” skryptów, jednak większość z nich ma kilka podstawowych wad:
- albo są mało elastyczne (co wynika z błędnej implementacji)
- albo są zbyt rozbudowane i „napuchnięte” niepotrzebną funkcjonalnością
- albo są zależne od popularnych JavaScriptowych bibliotek
- albo stają się niedostępne w sytuacji wyłączonej obsługi skryptów w przeglądarce
Wychodząc naprzeciw tym problemom postanowiłem napisać we własnym zakresie coś małego i funkcjonalnego zarazem – Panie i Panowie – przedstawiam wam Yetii (ang. Yet (E)Another Tab Interface Implementation).
Yetii – funkcjonalność
- treść zakładek jest dostępna nawet w sytuacji braku obsługi JavaScript
- możliwość określenia domyślnie aktywnej zakładki
- możliwość włączenia mechanizmu automatycznej rotacji zakładek w jednym z dwóch trybów
- możliwość użycia wielu różnych grup zakładek na jednej stronie
- możliwość zagnieżdzenia jednej grupy zakładek wewnątrz innej
- możliwość dostosowania domyślnych nazw klas CSS wykorzystywanych do generowania zakładek
- możliwość podpięcia własnej funkcji wykonywanej w momencie kliknięcia w zakładkę
- możliwość podpięcia własnej funkcji wykonywanej w momencie opuszczenia konkretnej zakładki
- możliwość stworzenia linku na stronie B do konkretnej zakładki na stronie A poprzez dodanie odpowiedniego parametru w adresie URL
- możliwość włączenia mechanizmu „pamiętania” ostatnio klikniętej zakładki między kolejnymi przeładowaniami strony
Demo
Skrypt w działaniu można zobaczyć na [2] tej stronie.
Użycie
- [3] Pobierz plik z kodem źródłowym Yetii i dołącz go do swojej strony:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <script type="text/javascript" src="yetii.js"></script> </head>
|
- Przygotuj kod HTML zakładek:
<body> <!-- zakładki --> <div id="tab-container-1"> <ul id="tab-container-1-nav"> <li><a href="#tab1">tab 1</a></li> <li><a href="#tab2">tab 2</a></li> </ul> <div class="tab" id="tab1"> <h2>tab 1</h2> <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry.</p> </div> <div class="tab" id="tab2"> <h2>tab 2</h2> <p>It was popularised in the 1960s with the release of Letraset sheets.</p> </div> </div> <!-- zakładki --> </body>
|
Jak widać w powyższym przykładzie pojemnikiem definiującym grupę zakładek jest div
o id="tab-container-1"
. Wewnątrz pojemnika umieszczona jest nieuporządkowana lista linków, za pomocą których możliwe stanie się przełączanie między poszczególnymi zakładkami. Lista powinna mieć przypisane odpowiednie id
, które powstaje z połączenia id
pojemnika i końcówki -nav
.
Yetii linkowi aktywnej zakładki dynamicznie przypisuje klasę active
:
<ul id="tab-container-1-nav"> <li class="activeli"><a class="active" href="#tab1">tab 1</a></li> <li><a href="#tab2">tab 2</a></li> </ul>
|
Specjalna klasa CSS (domyślnie activeli
) przypisywana jest także elementowi listy, w którym znajduje się aktywny link. Jeśli zmienimy nazwę aktywnej klasy np. na aktywny
to do elementu listy zostanie przypisana klasa aktywnyli
.
Dzięki kreatywnym stylom CSS można bardzo prosto przekształcić tę nieuporządkowaną listę w grupę zgrabnych przycisków do przełączania zakładek – [4] zobacz arkusz CSS ze strony demonstracyjnej.
Zawartość poszczególnych zakładek powinna zostać umieszczona jest w blokach div
z klasą tab
.
- Zainicjalizuj obiekt Yetii:
<body> <div id="tab-container-1"> <ul id="tab-container-1-nav"> <li><a href="#tab1">tab 1</a></li> <li><a href="#tab2">tab 2</a></li> </ul> <div class="tab" id="tab1"> <h2>tab 1</h2> <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry.</p> </div> <div class="tab" id="tab2"> <h2>tab 2</h2> <p>It was popularised in the 1960s with the release of Letraset sheets.</p> </div> </div> <script type="text/javascript"> var tabber1 = new Yetii({ id: 'tab-container-1' }); </script> </body>
|
Aby określić domyślnie aktywną zakładkę (np. drugą):
var tabber1 = new Yetii({ id: 'tab-container-1', active: 2 });
|
Aby uaktywnić mechanizm automatycznej rotacji zakładek (interwał rotacji wyrażony jest w sekundach):
var tabber1 = new Yetii({ id: 'tab-container-1', active: 2, interval: 5 });
|
Domyślnie mechanizm rotacji wyłącza się w momencie, gdy użytkownik kliknie jakąś zakładkę. Jednak jeśli obok parametru interval
określimy dodatkowo parametr wait
:
var tabber1 = new Yetii({ id: 'tab-container-1', active: 2, interval: 5, wait: 10 });
|
w momencie kliknięcia w zakładkę rotacja „zastygnie” na określoną liczbę sekund (10 w powyższym przypadku) i po tym czasie będzie kontynuowana.
Aby dostosować nazwy klas CSS, które wykorzystywane są przez skrypt do generowania zakładek:
var tabber1 = new Yetii({ id: 'tab-container-1', active: 2, interval: 5, tabclass: 'mojaklasazakladki', activeclass: 'mojaklasaaktywnegolinku' });
|
Możliwe jest także „ręczne” wywołanie metody odpowiedzialnej za pokazanie konkretnej zakładki w danej grupie zakładek:
<a href="#" onclick="tabber1.show(2); return false;">Pokaż zakładkę numer 2</a>
|
Istnieje także możliwość podpięcia własnej funkcji, która wykonywana będzie w momencie kliknięcia w zakładkę:
function mojafunkcja(zakladka) { if (zakladka==2) alert('Kliknąłeś zakładkę nr 2'); } var tabber1 = new Yetii({ id: 'tab-container-1', callback: mojafunkcja });
|
Funkcję wykonywaną w momencie opuszczenia danej zakładki podpinamy w następujący sposób:
function mojafunkcja(zakladka) { if (zakladka==1) alert('Opuściłeś zakładkę nr 1'); } var tabber1 = new Yetii({ id: 'tab-container-1', leavecallback: mojafunkcja });
|
Zagnieżdżając jakąś grupę zakładek wewnątrz innej „nadrzędnej” zakładki należy pamiętać, aby ustawić inne klasy dla zakładek z obu tych grup (parametr tabclass
) np.:
var grupa_nadrzedna = new Yetii({ id: 'grupa_nadrzedna' }); var podgrupa = new Yetii({ id: 'podgrupa', tabclass: 'jakasinnaklasa' });
|
Aby stworzyć link na stronie B do konkretniej zakładki na stronie A należy zbudować go w następujący sposób:
<a href="stronaA.html?tab-container-1=2">2 zakładka wewnątrz tab-container-1 na stronie A</a>
|
gdzie tab-container-1
jest pojemnikiem grupy zakładek, wewnątrz której chcemy wybrać zakładkę (drugą w przykładzie powyżej). Zamiast wartości numerycznej można także podać DOM id
zakładki, która ma być aktywna np.:
<a href="stronaA.html?tab-container-1=tab2">2 zakładka wewnątrz tab-container-1 na stronie A</a>
|
Aby włączyć mechanizm „pamiętania” ostatnio klikniętej zakładki (np. pomiędzy poszczególnymi przeładowaniami strony) należy zainicjalizować obiekt Yetii z parametrem persist
:
var tabber1 = new Yetii({ id: 'tab-container-1', persist: true });
|
Informacje o ostatnio klikniętej zakładce przechowywane są w ciasteczkach sesyjnych, które wygasają w momencie zamknięcia okna przeglądarki. W sytuacji, gdy jednocześnie włączony jest mechanizm pamiętania klikniętej zakładki, określono aktywną zakładkę za pomocą parametru w adresie URL i skrypt zaincjalizowo z parametrem active
stosowana jest następująca hierarchia pierwszeństwa:
zapamiętana zakładka « parametr w adresie URL « parametr active
Pobierz Yetii
Wszelkie sugestie na temat skryptu i ewentualne propozycje poprawek jak zawsze mile widziane.
-----
Wydrukowano z: https://www.kminek.pl/yetii/
Lista adresów URL występujących w tekście:
- [1] http://www.smashingmagazine.com/2008/09/11/75-really-useful-javascript-techniques/
- [2] http://www.kminek.pl/lab/yetii/
- [3] http://www.kminek.pl/yetii/#pobierz-yetii
- [4] http://www.kminek.pl/lab/yetii/custom.css
- [5] https://raw.githubusercontent.com/kminek/Yetii/master/yetii.js
- [6] https://raw.githubusercontent.com/kminek/Yetii/master/yetii-min.js
© 2007-2025 kminek.pl