Mootools 1.1 - Accordion.js
08 września, 2007
Oto i on - ostatni z pluginów mootools - chyba wiecie co to oznacza :) Muszę w tym miejscu dodać iż mam szczególny sentyment do tego plugina - to on jeszcze jako składnik biblioteki moo.fx i jej strony głównej sprawił, że zainteresowałem się najpierw wspomnianą biblioteką, a później samym mootools. Kto wie czy gdyby nie ten plugin to czy kurs mootools w ogóle by powstał :) Sam efekt, który oferuje do dziś robi na mnie wrażenie - ja po prostu akurat ten efekt uwielbiam i mam nadzieję, że Wy też go polubicie :)
Klasa Accordion pozwala nam na animację elementów w taki sposób, że po aktywowaniu danego elementu poprzedni element aktywny jest ukrywany. W ten sposób zawsze aktywny jest tylko jeden element.
Składnia klasy Accordion wygląda następująco:
var efekt = new Accordion("aktywatory", "elementy", {opcje}, $("kontener"));
Zmienna aktywatory to selektor CSS odnoszący się do kolekcji elementów po których kliknięciu dany element zostanie aktywowany. Zmienna elementy to to samo co zmienna aktywatory, ale dotyczy elementów zależnych od aktywatorów. Obiekt {opcje} to oczywiście pozostałe parametry klasy Accordion, a zmienna kontener to identyfikator elementu w jakim zawarte są składniki naszego elementu.
Opcje klasy Accordion:
- show - opcja określająca, który element ma być rozwinięty po uruchomieniu skryptu. Jako wartość podajemy indeks elementu (numerowanie jak w tablicach czyli od 0),
- display - opcja działająca na tej samej zasadzie co opcja show z tą różnicą, że element jest rozwijany z animacją (w wypadku show po prostu się pojawia),
- fixedHeight - wartość określająca stałą wysokość rozwijanych elementów. Domyślnie (false) każdy element ma wysokość dostosowaną do ilości tekstu.
- fixedWidth - opcja tego samego typu co fixedHeight tyle, że dotyczy ona szerokości elementów.
- height - wartość logiczna określająca czy w animacji ma być stosowana zmiana wysokości elementu. Domyślnie opcja ta ma wartość true.
- opacity - wartość logiczna określająca czy w animacji ma być stosowana zmiana przezroczystości elementu. Domyślnie opcja ta ma wartość true.
- width - wartość logiczna określająca czy w animacji ma być stosowana zmiana szerokości elementu. Domyślnie opcja ta ma wartość false. Opcja ta ma raczej zastosowanie w efektach poziomych podobnych do tych jakie prezentowałem przy okazji prezentacji klasy Fx.Slide .
- alwaysHide - wartość logiczna określająca czy można zwinąć wszystkie elementy (true), czy też zawsze jeden element ma być rozwinięty (false).
Wszelkie operacje związane ze zmianą szerokości elementu w trakcie animacji mogą powodować pewne problemy związane z CSS i wyglądem elementów - osobiście polecam nie polecam tego typu animacji. Pokazałem już, że Fx.Slide może godnie zastąpić klasę Accordion w tej kwestii.
Zdarzenia klasy Accordion:
- onActive - zdarzenie wywoływane w momencie rozwijania elementu.
- onBackground - zdarzenie wywoływane w momencie zwijania elementu.
Metody klasy Accordion:
- addSection - metoda dodająca kolejny element efektu.
- display - metoda pozwalająca na aktywowanie danego aktywatora bez klikania go. Jej wadą jest fakt iż po dodaniu nowego elementu metodą addSection, nadal poprzez indeksy odnosi się do podstawowych elementów bez uwzględnienia nowych.
Pora na praktykę :) Stworzymy efekt klasy Accordion najpierw wersji podstawowej, a później dodamy parę upiększeń ;)
Aktywatorami w naszym wypadku będą nagłówki drugiego poziomu klasy "toggler", a rozwijanymi elementami będą paragrafy klasy "element":
var efekt = new Accordion('h2.toggler', 'p.element');
Powyższa linijka spowoduje powstanie bardzo ładnego efektu - kliknijcie na jednym z paragrafów poniższego przykładu:
W powyższym przykładzie kliknięcie na rozwinięty paragraf nie spowoduje nic. Ale wystarczy dodać opcję alwaysHide i teraz kliknięcie na jakikolwiek nagłówek spowoduje animację (ukrywania lub pokazywania):
var efekt = new Accordion('h2.toggler', 'p.element', {
alwaysHide: true
});
I powyższy kod w akcji:
Ustalmy teraz stałą wysokość wszystkich rozwijanych elementów na 150 pikseli:
var efekt = new Accordion('h2.toggler', 'p.element', {
alwaysHide: true,
fixedHeight: 150
});
Dobrze by też było gdyby dla odmiany zamiast pierwszego rozwijał się jako pierwszy trzeci element:
var efekt = new Accordion('h2.toggler', 'p.element', {
alwaysHide: true,
fixedHeight: 150,
display: 2
});
Pora wykorzystać potencjał zdarzeń klasy Accordion - dodamy efekt zmiany koloru tła z szarego na biały dla aktywnego aktywatora - najpierw tworzymy podstawy zdarzeń onActive i onBackground:
var efekt = new Accordion('h2.toggler', 'p.element', {
alwaysHide: true,
fixedHeight: 150,
display: 2,
onActive: function(toggler){},
onBackground: function(toggler){}
});
Jak widać oba zdarzenia jako pierwszy argument przyjmują uchwyt do aktywatora. Warto dodać, że drugi argumentem może być rozwijany/zwijany element.
Ważne jest by do zmiany koloru tła wykorzystać klasę Fx.Styles ponieważ oferuje nam ona możliwość nie określania początkowej wartości zmienianej właściwości. W wypadku klasy Fx.Style animacja przebiegałaby od danego koloru do końcowego co w naszym wypadku spowodowałoby zmiany koloru wszystkich aktywatorów. A dzięki klasie Fx.Styles kolor pozostałych aktywatorów nie ulega zmianie bo animacja dąży od koloru podstawowego do końcowego więc w wypadku pozostałych aktywatorów kolor się po prostu nie zmienia:
var efekt = new Accordion('h2.toggler', 'p.element', {
alwaysHide: true,
fixedHeight: 150,
display: 2,
onActive: function(toggler){
new Fx.Styles(toggler).start({
"background-color" : "#FFF"
});
},
onBackground: function(toggler){
new Fx.Styles(toggler).start({
"background-color": "#EFEFEF"
});
}
});
I cały przykład w akcji:
Pozostało nam jeszcze omówić metody klasy Accordion. Metoda addSection jako pierwszy argument przyjmuje uchwyt do aktywatora, drugi argument to uchwyt do elementu rozwijanego, a trzeci argument to pozycja na jakiej ma się znaleźć nowy element po dodaniu do pozostałych elementów. Tworzymy przycisk "dodaj", który będzie dodawał nowy element do naszego efektu na pierwszej pozycji:
var efekt = new Accordion('h2.toggler', 'p.element', {
alwaysHide: true,
fixedHeight: 150,
display: 2,
onActive: function(toggler){
new Fx.Styles(toggler).start({
"background-color" : "#FFF"
});
},
onBackground: function(toggler){
new Fx.Styles(toggler).start({
"background-color": "#EFEFEF"
});
}
});
$("dodaj").addEvent("click",function(){
efekt.addSection(new Element('h2', {'class': 'toggler'}).appendText('Wstęp'), new Element('p', {'class': 'element'}).appendText('Kliknij na wybranym paragrafie by aktywować efekt klasy Accordion...'), 0);
});
Pozwoliłem sobie od razu tworzyć elementy zamiast tworzyć kolejne zmienne.
Dodajmy do tego wszystkiego przycisk, który aktywuje pierwszy paragraf:
var efekt = new Accordion('h2.toggler', 'p.element', {
alwaysHide: true,
fixedHeight: 150,
display: 2,
onActive: function(toggler){
new Fx.Styles(toggler).start({
"background-color" : "#FFF"
});
},
onBackground: function(toggler){
new Fx.Styles(toggler).start({
"background-color": "#EFEFEF"
});
}
});
$("dodaj").addEvent("click",function(){
efekt.addSection(new Element('h2', {'class': 'toggler'}).appendText('Wstęp'), new Element('p', {'class': 'element'}).appendText('Kliknij na wybranym paragrafie by aktywować efekt klasy Accordion...'), 0);
});
$("pokaz").addEvent("click",function(){
efekt.display(0);
});
W efekcie otrzymamy coś takiego:
I tym akcentem zakończyliśmy kurs frameworka MooTools 1.1(1) :) Mam nadzieję, że te 41 wpisów się przydało ;)
Komentarze do wpisu "Mootools 1.1 - Accordion.js":
1.
off napisał(a):
08 września 2007, 21:29:22
Piąty przykład wymiata ;P
2.
Dziudek napisał(a):
08 września 2007, 21:31:04
@off – to dobrze :D Miało być w miarę ciekawie ;]
3.
Bigismall napisał(a):
09 września 2007, 13:42:56
(...) W wypadku klasy Fx.Styles animacja przebiegałaby od danego koloru do końcowego co w naszym wypadku spowodowałoby zmiany koloru wszystkich aktywatorów. A dzięki klasie Fx.Styles kolor pozostałych (...)
Nie ma tam jakiegoś błędu ?
4.
Dziudek napisał(a):
09 września 2007, 15:56:11
@Bigismall – jedno „s” za dużo ;] Powinno być „W wypadku klasy Fx.Style” ;] Poprawione – dzięki za info ;)
5.
learndesk napisał(a):
20 listopada 2007, 14:54:15
Many many thanks for this example. I searched the internet for several days to open and close the accordion from outside the accordion
6.
felippe napisał(a):
01 sierpnia 2008, 15:41:14
Takie pytanie, którego nie ma w oficjalnym demo ;)
Czy udało się komuś zrobić zagnieżdżone paragrafy?
Tzn. Mam dwie części, w drugiej zaś chcę mieć kolejne dwie…
7.
Dziudek napisał(a):
01 sierpnia 2008, 16:32:07
@felippe – a w czym miałby być problem ? Przecież można ustawić inne klasy paragrafom wewnątrz i tym „zewnątrz”, a następnie skrypt tworzy efekt accordion dla paragrafów zewnątrz i paragrafów wewnątrz – oddzielny efekt na każdą grupę wewnętrznych paragrafów. Według mnie nie powinno być większych problemów.
8.
felippe napisał(a):
08 sierpnia 2008, 15:58:45
Tak też robiłem, problem polega na tym, że w jak jest tworzony zewnętrzny obiekt, to „nie widzi” on rzeczywistej szerokości wewnętrznych obiektów (które są zwinięte), i efektem tego jest „za krótki”. W momencie rozwinięcia „podlisty” znika ona z obszaru wyświetlania
9.
Dziudek napisał(a):
08 sierpnia 2008, 16:46:02
@felippe – jeżeli stosujesz przy accordion animację szerokości to ja niczego nie gwarantuję ;) Ja starałem się jej unikać, bo była dość problematyczna ;)
10.
felippe napisał(a):
27 sierpnia 2008, 17:00:58
Nie, nie – animację wysokości.
Gdzieś na forach znalazłem opis tego samego problemu – obiekt „nie wie”, że w środku ma zwinięte inne elementy i bierze sumaryczną wysokość „zwiniętych” elementów.
Jakby ktoś napisał takie zagnieżdżone accordion, to chętnie bym zerknął w kod ;)
11.
Dziudek napisał(a):
27 sierpnia 2008, 17:04:59
@felippe – a o to chodzi :) No tak – wysokość jest jakby stała – dlatego ta implementacja Accordion niezbyt nadawała się do danych ładowanych dynamicznie :) Jedyne rozwiązanie jakie przychodzi mi na myśl to użycie Fx.Slide i napisanie własnego Accordion opartego właśnie o tę klasę :)
12.
frz napisał(a):
22 października 2008, 12:23:20
Gdy mamy znacznik np <a class „toggler”>button</a> który pełni funkcje „rozwijacza” i „zwijacza”. (Odrazu mowie że w moim przypadku musi to być <a>)Następuje nieciekawy efekt na nowej Operze, mianowicie skopiowania stylu z classy <a> na treść tekstową kolejnych tabel Accordion. Czy ma ktoś jakiś pomysł jak sobie z tym poradzić ? ^^’ pozdrawiam
13.
Dziudek napisał(a):
22 października 2008, 23:25:07
@frz – obstawiałbym jakiś błąd w kodzie, bądź błąd renderowania Opery :)
14.
Anonim napisał(a):
24 października 2008, 20:48:11
niestety to bug mootoolsa ^^” podczas animacji gubi klasy.
15.
adax napisał(a):
24 kwietnia 2009, 16:14:34
<script type=„text/javascript”> window.onload = function(){ var togglers = $$(‘h3.storytitle’); var stretchers = $$(‘div.accordion’); var myAccordion = new Fx.Accordion(togglers, stretchers, {opacity: true, start: true, alwaysHide: true, display: 1}); <?php if (is_single() || is_page()) { ?> myAccordion.showThisHideOpen(0) <?php };?> };
</script>
jak w tym skrypcie dodać opcje display tak żeby działało wyświetlanie jednego posta po załadowaniu strony (w przykładzie wyżej jest już dodany ale nie działa to w tej wersji może ktoś pomoże ??!
16.
anonim napisał(a):
13 października 2009, 15:14:02
jak zmniejszyc odstepy pomiedzy zakladkami?? prosze o pomoc bardzo wazne!!
17.
Dziudek napisał(a):
13 października 2009, 15:28:05
trzeba pooperować na marginesach dla paragrafów i nagłówków h2 w divie #content ;)
Dodaj komentarz: