Ho creato uno script che dissolve il colore di sfondo di un elemento. Uso setTimeout() per apportare una modifica incrementale al colore ogni 5 ms. La sceneggiatura funziona alla grande se sto solo sbiadendo il colore di sfondo di una cosa alla volta, ma se ho, diciamo, 50 elementi che sto sbiadendo tutti contemporaneamente, la velocità è molto più lenta di 5 ms a causa di tutti il simultaneo setTimeout() s in esecuzione in una volta. Una dissolvenza che normalmente dovrebbe essere eseguita in 1 secondo, ad esempio, potrebbe richiedere 30 secondi se sto sbiadendo 50 elementi alla volta.JavaScript setTimeout() rallenta sotto carico intenso
Qualche idea su come posso superare questo?
Ecco lo script nel caso in cui qualcuno ha un idee:
function fadeBackground(elementId, start, end, time) {
var iterations = Math.round(time/5);
var step = new Array(3);
step[0] = (end[0] - start[0])/iterations;
step[1] = (end[1] - start[1])/iterations;
step[2] = (end[2] - start[2])/iterations;
stepFade(elementId, start, step, end, iterations);
}
function stepFade(elementId, cur, step, end, iterationsLeft) {
iterationsLeft--;
document.getElementById(elementId).style.backgroundColor
= "rgb(" + cur[0] + "," + cur[1] + "," + cur[2] + ")";
cur[0] = Math.round(end[0] - step[0] * iterationsLeft);
cur[1] = Math.round(end[1] - step[1] * iterationsLeft);
cur[2] = Math.round(end[2] - step[2] * iterationsLeft);
if (iterationsLeft > 1) {
setTimeout(function() {
stepFade(elementId, cur, step, end, iterationsLeft);
}, 5);
}
else {
document.getElementById(elementId).style.backgroundColor
= "rgb(" + end[0] + "," + end[1] + "," + end[2] + ")";
}
}
E 'usato in questo modo:
fadeBackground("myList", [98,180,232], [255,255,255], 1000);
Stavo pensando che un timer potrebbe essere la strada da percorrere, ma ho temuto di dover implementare la modifica. :) In realtà ho deciso di lanciare da solo perché stavo usando jQuery per animare() e non è riuscito a svanire in realtà circa il 10% delle volte. Sfortunatamente, questo è un tasso di errore inaccettabile. Controllerò l'articolo. Grazie mille! – core
Heh. Stackoverflow ha anche il problema "non riesce ad animare". – Nosredna