Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: JS, własna galeria/animacja problem migotania zdjęć
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
matijas6113
Witam
Otóż tworzę dla siebie stronkę i mam własną galerię/animacje napisaną w JS. Ma ona za zadania automatycznie zmieniać zdjęcia po określonym czasie (taki pokaz slajdów jakby) przy czym przy zmianie ze zdj A na zdj B chciałem otrzymać efekt przenikania. Kod działa ok poza jednym wyjątkiem: otóż kiedy w przeglądarce przejde na inną zakłądkę i wrócę za chwile do strony to zdjęcia tak jakby migotają (tak jakby skrypt przełączania zdj się zawiesił i chciał nadrobić wszystko) po czym wszyskto sie normuje i działa ok.

O to kody:

  1. var img = 1;
  2. function changeImg()
  3. {
  4. img = img + 1;
  5. if(img % 2 == 1)
  6. {
  7. var element = document.getElementById("img1");
  8. var hide = document.getElementById("img2");
  9. }
  10. else
  11. {
  12. var element = document.getElementById("img2");
  13. var hide = document.getElementById("img1");
  14. }
  15.  
  16. element.src = "gfx/home/" + img + ".jpg";
  17.  
  18. var value = 0;
  19. var i = 0;
  20.  
  21. var changeClock = self.setInterval(function()
  22. {
  23. value = i * 0.025;
  24. setTimeout(function(){
  25. element.style.opacity = value.toFixed(2)
  26. }, 0);
  27. setTimeout(function(){
  28. hide.style.opacity = (1-value.toFixed(2))
  29. }, 10);
  30. i++;
  31. if(i == 40) clearInterval(changeClock);
  32. },80);
  33.  
  34. if(img >= 9) img = 0;
  35. }
  36.  
  37. function start()
  38. {
  39. var int = self.setInterval(function(){
  40. changeImg()
  41. },5000);
  42. }


tutaj kod html który współpracuje z kodem js.

  1. <div style="margin: 0 auto; text-align: center; position: relative;">
  2. <img id="img1" src="gfx/home/1.jpg" onclick="changeImg()" style="width: 770px; height: 515; z-index: 9901; border: 6px solid whitesmoke; position: absolute; left: 50%; margin-left: -385px; top: 0;">
  3. <img id="img2" src="gfx/home/2.jpg" onclick="changeImg()" style="width: 770px; height: 515; z-index: 9900; border: 6px solid whitesmoke; visibility: visible; position: absolute; left: 50%; margin-left: -385px; top: 0;">
  4. <script type="text/javascript">window.onload = start();</script>
  5. </div>


Wiem, że niektórzy mi powiedzą, że popełniłem wiele błędów w kodzie albo, że moge zastosować jakiegoś gotowca ale nie o to tutaj chodzi. Chce coś zrobić sam bo lubie. Chce też osiągnąć taki efekt wizualny jak mi sie podoba tak więc proszę o wyrozumiałość i pomoc związaną z tematem.

Pozdrawiam.
PrinceOfPersia
Cytat
Ma ona za zadania automatycznie zmieniać zdjęcia po określonym czasie (taki pokaz slajdów jakby) przy czym przy zmianie ze zdj A na zdj B chciałem otrzymać efekt przenikania.

samo przenikanie możesz zrobić za pomocą efektów CSS3 (transition dokładnie), to Ci trochę uprości kod JS. Tak jak tutaj: http://jsfiddle.net/fgasU/

Generalnie wtedy byś musiał za pomocą JavaScriptu tylko podmienić opacity na to końcowe (czyli z 1 na 0), a CSS by zrobił resztę.
matijas6113
Fajnie by było niestety nie działa.... dodałem kod css i zamieniłem kod js :
  1. var changeClock = self.setInterval(function()
  2. {
  3. value = i * 0.025;
  4. setTimeout(function(){
  5. element.style.opacity = value.toFixed(2)
  6. }, 0);
  7. setTimeout(function(){
  8. hide.style.opacity = (1-value.toFixed(2))
  9. }, 10);
  10. i++;
  11. if(i == 40) clearInterval(changeClock);
  12. },80); */


na:

  1. element.style.opacity = "1";
  2. hide.style.opacity = "0";


zdjęcia się zmieniają jednak bez efektu przenikania....
PrinceOfPersia
bo tam ręcznie podmieniasz niepotrzebnie src. Wywaliłem to i działa:
Kod
element.src = "gfx/home/" + img + ".jpg";


http://jsfiddle.net/fXv3F/
matijas6113
Ok, rozumiem. tylko że zdjęć będzie więcej niż dwa. Ogólnie udało mi sie rozwiązać problem:) praktycznie działa tak jak powinno:)

zaraz za pętlą robiącą "przejście" dodałem taki kod:
  1. setTimeout(function() {changeClock = window.clearInterval(changeClock); }, 5000);


Ogólnie dziękuje Ci za pomoc:) napewno komuś sie to przyda jak będzie szukałsmile.gif
PrinceOfPersia
za dużo kombinujesz z tym kodem, jakbyś nie kombinował tylko wziął i od zera to napisał, żadne dodatkowe clearIntervale czy timeouty nie byłyby potrzebne (oprócz jednego setInterval), bo sprawa jest banalna, piszesz:
[JAVASCRIPT] pobierz, plaintext
  1. var images;
  2. var index = 0;
  3. function changeImg()
  4. {
  5. images[index].style.opacity = 0;
  6. index++;
  7. if (index >= images.length) index = 0;
  8. images[index].style.opacity = 1;
  9. }
  10.  
  11. function start()
  12. {
  13. images = document.querySelectorAll("img"); // "img" to selektor elementu (jak w CSS czy jQuery)
  14. setInterval(changeImg,5000);
  15. }
[JAVASCRIPT] pobierz, plaintext

i to jest cały kod JS, potrzebny do zmieniania obrazków.

http://jsfiddle.net/fXv3F/2/
matijas6113
Przyznaję racje:) Jestem dość początkujący i dlatego ucze się na błędach:) Dzięki wielkie:)
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.