so che questa domanda è stato chiesto qualche tempo fa, tuttavia, il problema di prestazioni esiste ancora. Di seguito è una soluzione alternativa che non si basa su un listener di eventi di scorrimento. Ciò minimizza jank e lag causati dal thread di scorrimento separato comune tra i browser Web, aggiornando il css a intervalli regolari piuttosto che quando si scorre la finestra. Ciò significa che l'avviso della console di sviluppo non verrà visualizzato. Personalmente non sarei troppo preoccupato per l'avviso o per gli eventi di scorrimento per piccole cose come girare una marcia o cambiare una classe di css, tuttavia, se l'esperienza dell'utente dipende direttamente dall'effetto, distruggerà la fruibilità della pagina.
var gear;
var lastPosition;
var refreshRate = 60; // fps; reduce for less overhead
var animation = "rotate(*deg)"; // css style to apply [Wildcard is *]
var link = 0.5; //what to multiply the scrollTop by
function replace(){
if(lastPosition != document.body.scrollTop){ // Prevents unnecessary recursion
lastPosition = document.body.scrollTop; // updates the last position to current
gear.style.transform = animation.replace("*", Math.round(lastPosition * link)); // applies new style to the gear
}
}
function setup(){
lastPosition = document.body.scrollTop;
gear = document.querySelector(".gear");
setInterval(replace, 1000/refreshRate); // 1000/60 = 16.666... Invokes function "replace" to update for each frame
}
window.addEventListener("DOMContentLoaded", setup);
Un esempio di lavoro può essere utilizzato on my GitHub. L'ho provato su Firefox, Chrome e Edge (funziona).
Altre alternative evitando l'avvertimento devono utilizzare css sticky elements o utilizzare il element.classList.add() e element.classList.remove() metodi limnked ad un window.onscroll evento.
Nota: Prestare attenzione all'utilizzo delle transizioni css in cui la lunghezza della transizione è più lunga dell'intervallo in cui lo stile CSS verrà aggiornato dallo script (ad esempio con le modifiche basate su eventi di scorrimento). I browser basati su Webkit e EdgeHTML si comportano in modi inaspettati a questo, di solito rimangono nella loro posizione iniziale fino a quando l'elemento smette di essere aggiornato dallo script. A meno che questo non sia l'effetto che intendevi, nel qual caso non funziona allo stesso modo in Firefox.
Servo Webrender, se integrato in Firefox risolverà questi problemi in una certa misura (o almeno migliorerà le prestazioni in modo considerevole). Anche se ci saranno ancora altri browser per mantenere la compatibilità con.
Grazie Nickolay, come dici tu la pagina non è molto chiara ma hai sicuramente aiutato! –
@MichaelHancock: nota che MDN è un wiki, quindi se hai suggerimenti su come rendere la pagina più chiara alle persone che non stanno costruendo un browser, sono i benvenuti. Ricordo che hanno avuto problemi con gli spammer, quindi creare un nuovo account potrebbe essere più difficile di quanto debba essere, ma in ogni caso se sei interessante nell'aiutare, per favore [mettiti in contatto] (https://developer.mozilla.org/it-iT/docs/MDN/Comunità/Conversazioni)! – Nickolay