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! :)