setInterval és a globális változók
Azt szeretném, hogy egy onmouseover és onmouseout eseménykor egy animált színváltás történne az HTML elemen. Ezt alapvetően a setInterval segítségével oldanám meg, de semmiképp nem akar hozzáférni a globális változókhoz. Utánanéztem googlen, és láttam, hogy nem csak nekem van ezzel bajom, viszont sehogy sem tudok rájönni, hogy hol a hiba és mit kellene csinálnom. Ebben kérnék egy kis segítséget.
Mielőtt még felhoznátok a jQuery-t, el kell mondjam, én inkább egy második megoldásnak tartogatnám. Mivel most tanulom a JS-t ezért nekem egyelőre átláthatóbb lenne a sima JS kód.
A kódom:
■ Mielőtt még felhoznátok a jQuery-t, el kell mondjam, én inkább egy második megoldásnak tartogatnám. Mivel most tanulom a JS-t ezért nekem egyelőre átláthatóbb lenne a sima JS kód.
A kódom:
- function hover(element_class, mouseover, mouseout){
- var element = document.getElementsByClassName("hover");
- function animate(u){
- element[u].onmouseover = function(){
- var divider = 20;
- var f_color_array = mouseover.split(" ");
- var s_color_array = mouseout.split(" ");
- var division_r = f_color_array[0]/divider;
- var division_g = f_color_array[1]/divider;
- var division_b = f_color_array[2]/divider;
- var r = 0;
- var g = 0;
- var b = 0;
- /*function color(){
- if(f_color_array[0] >= s_color_array[0]){
- r += division_r;
- }else if(f_color_array[0] <= s_color_array[0]){
- r -= division_r;
- }
- if(f_color_array[1] >= s_color_array[1]){
- g += division_g;
- }else if(f_color_array[1] <= s_color_array[1]){
- g -= division_g;
- }
- if(f_color_array[2] >= s_color_array[2]){
- b += division_b;
- }else if(f_color_array[2] <= s_color_array[2]){
- b -= division_b;
- }
- //console.log(r);
- }*/
- var f_interval = setInterval(function(){
- if(f_color_array[0] >= s_color_array[0]){
- r += division_r;
- }else if(f_color_array[0] <= s_color_array[0]){
- r -= division_r;
- }
- if(f_color_array[1] >= s_color_array[1]){
- g += division_g;
- }else if(f_color_array[1] <= s_color_array[1]){
- g -= division_g;
- }
- if(f_color_array[2] >= s_color_array[2]){
- b += division_b;
- }else if(f_color_array[2] <= s_color_array[2]){
- b -= division_b;
- }
- }, 30);
- element[u].style.background = "rgb(" + r + ", " + g + ", " + b + ")";
- if((r >= f_color_array[0]) || (g >= f_color_array[1]) || (b >= f_color_array[2])){
- window.clearInterval(f_interval);
- }//temporary statement
- };
- element[u].onmouseout = function(){
- element[u].style.background = "#D43F3F";
- };
- }
- for(i = 0; i < element.length; i++){
- animate(i);
- }
- }
Tudnál egy rövidebb példa
Nem látok globális változókat sem deklarálva sem hivatkozva rájuk.
A probléma középen van
A setInterval hiába futtatja
setInterval
hiába futtatja a megadott függvényt, ha csak egyszer állítod be a hátteret (feketére, mielőtt akár egyszer is meghívódna asetInterval
callbackje). Ráadásul a leállási feltétel is rossz helyen van, még az előtt próbálod megállítani a timert (clearInterval
), hogy egyszer is lefutott volna.Egyébként erre minek JS? CSS is tudja ezt: http://codepen.io/lennoff/pen/rOVxwB
Hmm.. Köszönöm, nem is tudtam
Igen, erre CSS-t érdemes
De ha valami oknál fogva mégis Javascripttel szeretnéd, akkor a setInterval helyett használd a requestAnimationFrame függvényt.
Köszönöm! :)