Recherche…


Syntaxe

  • window.requestAnimationFrame ( callback );
  • window.webkitRequestAnimationFrame ( rappel );
  • window.mozRequestAnimationFrame ( rappel );

Paramètres

Paramètre Détails
rappeler "Un paramètre spécifiant une fonction à appeler quand il est temps de mettre à jour votre animation pour la prochaine repeindre." ( https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame)

Remarques

Quand il s'agit d'animer des éléments DOM avec fluidité, nous sommes limités aux transitions CSS suivantes:

  • POSITION - transform: translate (npx, npx);
  • SCALE - transform: scale(n) ;
  • ROTATION - transform: rotate(ndeg);
  • OPACITY - opacity: 0;

Cependant, leur utilisation ne garantit pas la fluidité de vos animations, car le navigateur lance de nouveaux cycles de paint , indépendamment de ce qui se passe. Fondamentalement, la paint est faite de manière inefficace et votre animation est "janky" parce que les images par seconde (FPS) en souffrent.

Pour garantir des animations DOM aussi simples que possible, requestAnimationFrame doit être utilisé avec les transitions CSS ci-dessus.

La raison pour laquelle cela fonctionne est que l'API requestAnimationFrame permet au navigateur de savoir qu'une animation doit avoir lieu au cycle de paint suivant, au lieu d'interrompre ce qui se produit pour forcer un nouveau cycle de peinture lorsqu'une animation non-RAF est appelée .

Les références URL
Qu'est ce que c'est jank? http://jankfree.org/
Animations Haute Performance http://www.html5rocks.com/en/tutorials/speed/high-performance-animations/ .
RAIL https://developers.google.com/web/tools/chrome-devtools/profile/evaluate-performance/rail?hl=fr
Analyse du chemin de rendu critique https://developers.google.com/web/fundamentals/performance/critical-rendering-path/analyzing-crp?hl=en
Performance de rendu https://developers.google.com/web/fundamentals/performance/rendering/?hl=fr
Analyse des temps de peinture https://developers.google.com/web/updates/2013/02/Profiling-Long-Paint-Times-with-DevTools-Continuous-Painting-Mode?hl=en
Identifier les goulots d'étranglement https://developers.google.com/web/fundamentals/performance/rendering/simplify-paint-complexity-and-reduce-paint-areas?hl=en

Utilisez requestAnimationFrame pour fondre l'élément

<html>
    <body>
        <h1>This will fade in at 60 frames per second (or as close to possible as your hardware allows)</h1>
        
        <script>
            // Fade in over 2000 ms = 2 seconds.
            var FADE_DURATION = 2.0 * 1000; 
            
            // -1 is simply a flag to indicate if we are rendering the very 1st frame
            var startTime=-1.0; 
            
            // Function to render current frame (whatever frame that may be)
            function render(currTime) { 
                var head1 = document.getElementsByTagName('h1')[0]; 
            
                // How opaque should head1 be?  Its fade started at currTime=0.
                // Over FADE_DURATION ms, opacity goes from 0 to 1
                var opacity = (currTime/FADE_DURATION);
                head1.style.opacity = opacity;
            }
            
            // Function to 
            function eachFrame() {
                // Time that animation has been running (in ms)
                // Uncomment the console.log function to view how quickly 
                // the timeRunning updates its value (may affect performance)
                var timeRunning = (new Date()).getTime() - startTime;
                //console.log('var timeRunning = '+timeRunning+'ms');
                if (startTime < 0) {
                    // This branch: executes for the first frame only.
                    // it sets the startTime, then renders at currTime = 0.0
                    startTime = (new Date()).getTime();
                    render(0.0);
                } else if (timeRunning < FADE_DURATION) {
                    // This branch: renders every frame, other than the 1st frame,
                    // with the new timeRunning value.
                    render(timeRunning);
                } else {
                    return;
                }
            
                // Now we're done rendering one frame.
                // So we make a request to the browser to execute the next
                // animation frame, and the browser optimizes the rest.
                // This happens very rapidly, as you can see in the console.log();
                window.requestAnimationFrame(eachFrame);
            };
            
            // start the animation
            window.requestAnimationFrame(eachFrame);    
        </script>
    </body>
</html>

Annulation d'une animation

Pour annuler un appel à requestAnimationFrame , vous avez besoin de l'identifiant renvoyé lors de son dernier appel. C'est le paramètre que vous utilisez pour cancelAnimationFrame . L'exemple suivant démarre une animation hypothétique, puis la met en pause après une seconde.

// stores the id returned from each call to requestAnimationFrame
var requestId;

// draw something
function draw(timestamp) {
    // do some animation
    // request next frame
    start();
}

// pauses the animation
function pause() {
    // pass in the id returned from the last call to requestAnimationFrame
    cancelAnimationFrame(requestId);
}

// begin the animation
function start() {
    // store the id returned from requestAnimationFrame
    requestId = requestAnimationFrame(draw);
}

// begin now
start();

// after a second, pause the animation
setTimeout(pause,1000);

Garder la compatibilité

Bien sûr, comme la plupart des choses dans le navigateur JavaScript, vous ne pouvez pas compter sur le fait que tout sera le même partout. Dans ce cas, requestAnimationFrame peut avoir un préfixe sur certaines plates-formes et est nommé différemment, tel que webkitRequestAnimationFrame . Heureusement, il existe un moyen très simple de regrouper toutes les différences connues pouvant exister jusqu’à une fonction:

window.requestAnimationFrame = (function(){
    return window.requestAnimationFrame ||
        window.webkitRequestAnimationFrame ||
        window.mozRequestAnimationFrame ||
        function(callback){
            window.setTimeout(callback, 1000 / 60);
        };
})();

Notez que la dernière option (qui se remplit quand aucun support existant n'a été trouvé) ne retournera pas un identifiant à utiliser dans cancelAnimationFrame . Il existe cependant un polyfill efficace qui corrige cela.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow