Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [jQuery] menu z warstwą po kliknięciu na konkretną pozycje
Forum PHP.pl > Forum > XML, AJAX
Fo
Witam,

Od razu na wstępie chciałem zaznaczyć, że rzeźnikiem w jQuery nie jestem - trochę czytam w momencie kiedy potrzebuje... ale nigdzie nie mogę wyczytać jak poradzić sobie z tym problemem na który obecnie się nadziałem.

Co do założeń: mam listę linków i jak klikam na konkretny link to pokazuje mi się konkretna warstwa a jak zjeżdżam kursorem z tej warstwy to ona sie chowa.

Doszedłem do momentu, że robię prosty switchclass i dzięki temu chowam i pokazuje warstwę ale w momencie kiedy jest więcej kodu to jak kliknę w jeden odnośnik to pokazują mi się wszystkie warstwy a chciałbym by pokazywała się tylko ta konkretna - o konkretnym ID (dla konkretnie klikniętego linka) - ale nie wiem jak właśnie nadać dla konkretnej warstwy konkretne ID i później operować w jquery po konkretnym ID żeby też nie stworzyć jakiegoś niewiadomo jak długiego kodu.

To co mam obecnie to:

  1. <div id="tabs">
  2. <ul class="col">
  3. <li>
  4. <a href="#" class="trigger">This is link</a>
  5. <span class="layer hideit">
  6. this is layer
  7. </span>
  8. </li>
  9. <li>
  10. <a href="#" class="trigger">This is other link</a>
  11. <span class="layer hideit">
  12. this is layer too
  13. </span>
  14. </li>
  15. <li>
  16. <a href="#" class="trigger">This is another link</a>
  17. <span class="layer hideit">
  18. and this is another
  19. </span>
  20. </li>
  21. <li>
  22. <a href="#" class="trigger">And another one</a>
  23. <span class="layer hideit">
  24. here the same
  25. </span>
  26. </li>
  27. <li>
  28. <a href="#" class="trigger">and so on..</a>
  29. <span class="layer hideit">
  30. and here also
  31. </span>
  32. </li>
  33. </ul>
  34. </div>


  1. $(document).ready(function(){
  2. $("#tabs .trigger").click(function(){
  3. $(".hideit").switchClass('hideit', 'showit', 200);
  4. $(".showit").switchClass('showit', 'hideit', 0);
  5. return false;
  6. });
  7. });


  1. #tabs .col {list-style:none;padding:0px;margin:0px;float:left;width:242px;line-height:20px;}
  2. #tabs .col li {font-size:12px;color:#000;}
  3. #tabs .col li a {color:#000;}
  4. #tabs .layer {display:block;position:absolute;width:500px;height:500px;}
  5. #tabs .hideit {background:blue;display:none;visibility:hidden;height:0px;width:0px;}
  6. #tabs .showit {background:red;display:block;visibility:visible;height:500px;width:500px;}


Jak sprawić by w momencie kiedy klikam w konkretny link to żeby pokazała mi się tylko ta konkretna warstwa a nie wszystkie ?
Dodatkowo jak to zrobić, żeby w momencie kiedy mam kursor na tej warstwie to ona jest widoczna ale jak z niej zjade kursorem to się chowa?

Byłbym bardzo wdzięczny za odpowiedź, niestety nie potrafię sobie poradzić z tym problemem - nie znam jako tako całego jQuery - sięgam do niego tylko w momencie kiedy na prawdę muszę ale tym razem nie udało mi się znaleźć rozwiązania adekwatnego do moich potrzeb.
mortus
Na przykład tak:
[JAVASCRIPT] pobierz, plaintext
  1. $(document).ready(function(){
  2. $("#tabs .trigger").click(function(){
  3. $(this).parent().find(".hideit").switchClass('hideit', 'showit', 200);
  4. $(this).parent().find(".showit").switchClass('showit', 'hideit', 0);
  5. return false;
  6. });
  7. });
[JAVASCRIPT] pobierz, plaintext

Fo
@mortus dzięki ale to trochę nie działa tak jak powinno :/

teraz jak klikam np. w link 1 -> to się pokazuje warstwa ale jak klikam zaraz potem w link 2 to się pokazuje również druga warstwa z tym że pierwsza nie ginie.

a chodzi mi konkretnie o to:
1) klikam link 1 -> pokazuje się warstwa 1
2) zjeżdżam kursorem z warstwy 1 i ona znika (czyli chyba onmouseout)
3) klikam link nr. 598 i pokazuje mi się warstwa (span class layer) nr. 598

czyli tak na dobra sprawe to brakuje mi tego onmouseout jeszcze. bo to generalnie jest takie menu, które ma w sobie pozycje. jak klikam na którąś z pozycji to się pokazuje warstwa, jak zjeżdżam z tej warstwy kursorem (no żeby coś innego kliknąć) to wtedy ta którą już otworzyłem (kliknąłem) znika i mam możliwość kliknięcia innej.
mortus
No to uzupełnijmy poprzedni kod:
[JAVASCRIPT] pobierz, plaintext
  1. $(document).ready(function(){
  2. $(".showit").mouseout(function() {
  3. $(this).switchClass('showit', 'hideit', 0);
  4. });
  5. $("#tabs .trigger").click(function(){
  6. $(this).parent().find(".hideit").switchClass('hideit', 'showit', 200);
  7. $(this).parent().find(".showit").switchClass('showit', 'hideit', 0);
  8. return false;
  9. });
  10. });
[JAVASCRIPT] pobierz, plaintext
Fo
dalej nie działa :/ efekt jest taki sam jak poprzednio czyli: a) jak klikam w jakiś link to otwiera się warstwa (dotąd jest OK) ale później jak klikam w drugi link to ta pierwsza warstwa się nie chowa i pokazuje się do tego jeszcze druga - ta którą właśnie kliknąłem. no i ten onmouseout nie działa :/

edit: dobra poprawiłem i działa.

źle była część odnośnie mouseout, poprawnie jest tak:


[JAVASCRIPT] pobierz, plaintext
  1. $(".hideit").mouseout(function() {
  2. $(this).switchClass('showit', 'hideit', 0);
  3. });
[JAVASCRIPT] pobierz, plaintext



dzięki CI bardzo mortus!!
mortus
Spróbuj jeszcze tak:
[JAVASCRIPT] pobierz, plaintext
  1. $(document).ready(function(){
  2. $(".showit").live("mouseout", function() {
  3. $(this).switchClass('showit', 'hideit', 0);
  4. });
  5. $("#tabs .trigger").click(function(){
  6. $(this).parent().find(".hideit").switchClass('hideit', 'showit', 200);
  7. $(this).parent().find(".showit").switchClass('showit', 'hideit', 0);
  8. return false;
  9. });
  10. });
[JAVASCRIPT] pobierz, plaintext
i pokaż aktualny kod.

EDIT:
Ehh. Pewnie onmoseout wpisałeś?
Fo
no właśnie zamiast .hideit dałeś .showit w pierwszej linii i przez to było źle.

teraz mam tylko ostry zgryz z z-indexami, bo mi pod ie6 i ie7 jakby linki nie giną w momencie jak sie warstwa pokazuje, która to warstwa nachodzi na te linki ale to już chyba inne forum.

aktualny kod jest taki tego przełączania:

[JAVASCRIPT] pobierz, plaintext
  1.  
  2. $(document).ready(function(){
  3.  
  4. $("#tabs .trigger").click(function(){
  5. $(this).parent().find(".hideit").switchClass('hideit', 'showit', 200);
  6. return false;
  7. });
  8. $(".hideit").mouseout(function() {
  9. $(this).switchClass('showit', 'hideit', 0);
  10. });
  11.  
  12. });
[JAVASCRIPT] pobierz, plaintext


a jeszcze jedno może ktoś wie.

w tej warstwie mam inne linki i elementy typu ul, li a, h3, h4 i jak najade na któryś z tych elementów to mi ta warstwa znika :/ a ma zniknąć dopiero jak zjade z warstwy a nie najade na jakiś element w niej.

kawałek kodu odpowiedzialny za to to:
[JAVASCRIPT] pobierz, plaintext
  1. $("#tabs .hideit").mouseout(function() {
  2. $(this).switchClass('showit', 'hideit', 0);
  3. });
[JAVASCRIPT] pobierz, plaintext
zegarek84
Cytat(Fo @ 17.04.2010, 20:38:35 ) *
a jeszcze jedno może ktoś wie.

w tej warstwie mam inne linki i elementy typu ul, li a, h3, h4 i jak najade na któryś z tych elementów to mi ta warstwa znika :/ a ma zniknąć dopiero jak zjade z warstwy a nie najade na jakiś element w niej.

kawałek kodu odpowiedzialny za to to:
[JAVASCRIPT] pobierz, plaintext
  1. $("#tabs .hideit").mouseout(function() {
  2. $(this).switchClass('showit', 'hideit', 0);
  3. });
[JAVASCRIPT] pobierz, plaintext

skoro masz kilka elementów więc działa poprawnie winksmiley.jpg gdyż przechodząc do innego elementu mimowolnie jest przekazywana akcja .mouseout

rozwiązaniem w jQuery jest .mouseleave() (choć w przykładzie na dole powinni dać 2 zmienne coby osobno te warstwy zliczać ;p)...

Cytat(Fo @ 17.04.2010, 20:38:35 ) *
teraz mam tylko ostry zgryz z z-indexami, bo mi pod ie6 i ie7 jakby linki nie giną w momencie jak sie warstwa pokazuje, która to warstwa nachodzi na te linki ale to już chyba inne forum.

to forum jest odpowiednie winksmiley.jpg - w sumie na problem nie trafiłem od razu choć sam zawsze wykorzystywałem pewną własność i prawie nigdy nie pisałem z-index... i teraz zanim zacytuję napiszę, iż nawet jeśli nie nadasz z-index to jest on relatywny względem rodzica w kolejności występowania elementów... i dalej w tych nowszych przeglądarkach jak się nadaje z-index to podobnie jak z pozycjonowaniem powinien być dla potomków ustanawiany względem rodzica któremu nadało się z-index -> no niestety w IE6/7 tak nie jest winksmiley.jpg
Cytat
A teraz wyjaśnienia. Internet Explorer ustawia kolejność elementów z pozycjonowaniem absolutnym względem pola nadrzędnego. Czyli dwa pola blokowe z pozycjonowaniem relatywnym (a w nich pola absolutne) są liczone od 0! Im niżej w kodzie html znajduje się pole tym wyżej będzie w IE

choć nie do końca jest jak to co zacytowałem powyżej ;p - bardziej tak jakby rodzic był pozycjonowany tą samą wartością z-index (choć Ty go nie pozycjonujesz z-index) i tak jakby choć się nie ustawia po przecinku to raczej bardziej obrazuje, że w przeglądarce jest jeszcze coś dodawane lub drugi licznik którego się nie ustawia winksmiley.jpg

rozwiązanie?? - nadaj z-index dla pola listy <li> od ostatniego elementu 1 do pierwszego max (przelecisz to skryptem od tyłu)...

i a propo uwagi co pisałem -> więc nie potrzebujesz ustawiać z-index na tych linkach i na .showit winksmiley.jpg

albo inne rozwiązanie to zrobić menu od końca ;p - czyli pierwszy element jako ostatni itd. winksmiley.jpg - czyli nie float: left a right winksmiley.jpg (i sam dom odpowiednio wtedy nada z-index a Ty nic nie będziesz musiał robić)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.