Prosty Akordeon na liście definicji jQuery - DL DT DD

marcincook

Avatar: marcincook

2011-10-23 19:22

Akordeonik mojej produkcji zrobiny przy użyciu biblioteki jQuery

Długi czas się zastanawiałem po co jest tyle kodu w gotowych akordeonach "pluginach" do jquery. Kiedy końcowy użytkownik obsługujący sklep czy cms-a i tak zawinie się przy dodawaniu div-ów w div-ach i do tego z odpowiednimi klasami ... obsługowa masakra

Załoażenia
- ma być semantyczne // div w divie nie jest tak samo semantyczny jak tabelka do układu strony :)
- ma być proste w obsłudze przy podtawowej znajomośći czystego html-a lub edytora WysiWyg
<dl>
<dt>Tytół definicji 1</dt>
<dd>Opis definicji 1</dd>
<dt>Tytół definicji 2</dt>
<dd>Opis definicji 2a</dd>
<dd>Opis definicji 2b</dd>
</dl>

- ma obsługiwać kilka definicji
Tytół 1 - Zamek
Definicja 1a - ten w drzwiach
Definicja 1b - ten budynek

- ma być zrobione na jQuery (bo i tak już jeej używam) kilkoma liniami kodu bez zbędnych pluginów ale zawierać choćby najprostszą animację - bo kowalski lubi efekt :)

- ma działać dobrze i walidować się po wyłączeniu JS

Wyszło tak:


<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.6.4.min.js"></script>
<script type="text/javascript">
jQuery(document).ready(function($) { // tutaj możemy normalnie używać $

$('#pageDescription dd').not("dd:first").hide(); // ukrywamy wszystkie definicje poza pierwszą 
       
       $('#pageDescription dt').not("dt:first").prepend('<b>+</b>'); // dodajemy plus do zamkniętych definicji 
       $('#pageDescription dt:first').prepend('<b>-</b>'); // dodajemy minus do otwartej pierwszej definicji 
       
       $('#pageDescription dt').css({"cursor": "pointer"}).click(function(){
                $(this).siblings('dt').find("b").html("+"); // u rodzeństwa tytółów definicji kliknietego tytółu szukamy pogrubień <b> i dodajemy plus i dodajemy im plusa
                $(this).find("b").html("-"); // klikniety tytół definicji szukamy <b> i dodajemy dodajemy minusa bo jest otwarty
                $('#page dd').slideUp(); // zwijamy wszystkie definicje
                $(this).nextUntil("dt").slideDown(); // rozwijamy te definicje które występują po klikniętym tytóle definicji
               return false; // przy animacjach radzę stosować
       });
       $('#pageDescription dt').css({"position":"relative"}).find("b:first").css({"position":"absolute ","right":"10px","top":"3px","width":"10px","textA lign": "center"}); // stylizację można by zrobić i w css bezpośrednio 

});
</script>



Zachęcam do oceniania i dywagazji co można by było zrobić prosciej etc

Tu przykład w akcji :
http://www.kamienicawarszawska.pl/?finansowanie-kredyty,16

W finalnym prjekcie lepiej pobrać jquery i zapisać w katalogu core
Pamiętajmy żeby ostylizować w CSS już samą listę definicji
ja użyłem brązowych beleczek

» Quick.Cart v4.x

marcincook

Avatar: marcincook

2011-10-23 20:51

http://dev.inherit.pl/akordeon/

openzibi

Avatar: openzibi

2011-10-23 20:55

@marcincook
Na akordeonie zagrałem :)
Jet jedno "ale". Chyba litebox gryzie się z jquery (pół ekranu widzę za przesłoną)
Być może pomoże dodanie
var $$ = jQuery.noConflict(); za $(document).ready(function(){

-------------------------------------------------------
hosting-domeny-strony - http://www.rhh.pl

marcincook

Avatar: marcincook

2011-10-23 21:43

@openzibi

czyli obiekty $$ z Prototype - hmm jest to jakiś pomysł, ja po prostu zawsze wymieniam Lightboxa na jakiś jquery bo używam jQuery
http://keyk.jupe.pl/elwoz/?akordeon,28


Ale spróbuje zrobić "CROSS JS Library Plugin" :) dla tego pluginu, jak ma to być plugin to niech działa na QC domyślnym

openzibi

Avatar: openzibi

2011-10-23 22:00

Każdy z nas ma jakieś preferencje. Ja "polubiłem" Pretty Photo.


-------------------------------------------------------
hosting-domeny-strony - http://www.rhh.pl

sIMONkING

Avatar: sIMONkING

2011-10-24 23:54

Sorki za lamerskie pytanie, ale do którego pliku wkleić kod Marcina?

marcincook

Avatar: marcincook

2011-10-26 02:37

@sIMONkING

Do pliku : container.tpl

Poszukaj taką linię (jeszcze przed wszystkimi skryptami js):
<meta http-equiv="Content-Style-Type" content="text/css" />

i za nią wklej:


<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.6.4.min.js"></script>;
<script type="text/javascript">
jQuery(document).ready(function($) { // tutaj możemy normalnie używać $

var $$ = jQuery.noConflict();
$('#pageDescription dt').not("dt:first").nextUntil('dt').hide(); // ukrywamy wszystkie definicje poza pierwszą 
         
         $('#pageDescription dt').not("dt:first").prepend('<b>+</b>'); // dodajemy plus do zamkniętych definicji 
         $('#pageDescription dt:first').prepend('<b>-</b>'); // dodajemy minus do otwartej pierwszej definicji 
         
         $('#pageDescription dt').css({"cursor": "pointer"}).click(function(){
                            $(this).siblings('dt').find("b").html("+"); // u rodzeństwa tytółów definicji kliknietego tytółu szukamy <b> i dodajemy plus
                            $(this).find("b").html("-"); // klikniety tytół definicji szukamy <b> i dodajemy minusa bo jest otwarty
                            $('#page dd').slideUp(); // zwijamy wszystkie definicje
                            $(this).nextUntil("dt").slideDown(); // rozwijamy te definicje które występują po klikniętym tytóle definicji
                         return false; // przy animacjach radzę stosować
         });
         $('#pageDescription dt').find("b:first").css({"position":"absolute ","right":"10px","top":"3px","width":"10px","textA lign": "center"}); 
                            // stylizację można by zrobić i w css bezpośrednio 

}); // koniec jQuery
</script>
<style type="text/css">
#pageDescription dl { display:block; }
#pageDescription dt { position:relative;display:block; padding:4px 10px; font-weight:bold;font-size:1.1em; background:#D9D2BC;margin-bottom: 1px; }
#pageDescription dd { display:block; padding: 5px 10px 10px; margin: 0px; }
</style>



Później w opisie pełnym w Panelu Admina naciśnij "html" w edytorze Wysiwyg
I wklej taki kod html:


<dl>
  <
dt>Tytół definicji 1</dt>
    <
dd>Opis definicji 1</dd>
  <
dt>Tytół definicji 2</dt>
    <
dd>Opis definicji 2a</dd>
    <
dd>Opis definicji 2b</dd>
</
dl>



I zobacz co się stanie :)
ewentualnie daj linka do strony to zobaczę

Programy się nie mylą - myli się programista :)

marcincook

Avatar: marcincook

2011-10-26 03:05

@sIMONkING

Przykład działający z QC 4.2
http://www.mistalbud.com/42aad/?kontakt,2

@all
Podejrzyjcie źródło kopiujcie do woli
Jak chcecie się odwdzięczyć
to wklejcie w tym wątku linki do stron gdzie użyliście - nie jest konieczne :)

Działa z Proto - @openzibi

Programy się nie mylą - myli się programista :)

boboo

Avatar: boboo

2011-10-26 07:10

Marcinku, jesteś naprawdę super-programistą, ale kruca-bomba, zmień "tytół" na "tytuł".
Oczy bolą ;-)

strzelectwo.kimla.de

.kotek999.

Avatar: .kotek999.

2011-10-26 12:16

super, dzieki, a ja biedna tyle tego szukalam:)

.kotek999.

sIMONkING

Avatar: sIMONkING

2011-10-27 18:42

Dzięki Marcin, w wolnej chwili to wkleje, ale ten mistalbud to jakoś zamula na headerze.

Do góry
o nas | kontakt