代码之家  ›  专栏  ›  技术社区  ›  Toki

如何减少javascript滚动/CSS转换中的FPS下降

  •  0
  • Toki  · 技术社区  · 4 年前

    我已经陷入了性能分析和优化的兔子洞,我无法降低帧速率的下降,这应该是一个相当轻量级的转换,尽管我怀疑这是在卷轴上的事实,尽管它可能是节流的责任?

    我想要实现的就是这种简单的慢/平滑滚动效果,如下所示: JSFiddle

    w = $(window);
    b = $('body');
    c = $('#container');
    
    $(document).ready(function() {
    
        w.scroll(function() {
            c.css('transform','translateY(' + -w.scrollTop() + 'px)');
        });
    
    });
    

    CSS

    html, body { margin: 0; }
    
    body {
        height: 500vh;
    }
    
    #container {
        display: block;
        position: fixed;
        height: 500vh;
        width: 100vw;
        background: #814e4e;
        padding: 20%;
    
        font-size: 30px;
        line-height: 45px;
        color: #fff;
        text-align: center;
    
        transform: translate3d(0,0,0);
        will-change: transform;
        transition: transform 1.5s ease-out;
    }
    

    HTML格式

    <body>
      <div id="container">
          <p>Lorem ipsum...</p>
      </div>
    </body>
    

    我把油门功能从下划线.js,以及在GSAP中重写整个内容,在所有情况下,在不同程度上,平均FPS下降10-20。令人惊讶的是,节流jquery版本在scroll函数上并没有比普通jquery有很大的改进,而GSAP版本使用了新的scroll trigger插件,比上述任何一个都不那么流畅。任何关于这个或其他推荐方法的建议我都将不胜感激!

    0 回复  |  直到 4 年前
        1
  •  1
  •   Zach Saucier    4 年前

    .scrollTop 导致回流,无法执行。这是你的主要问题。

    第二,你用的是 .scroll 函数,它创建一个新的动画,影响滚动位置的每一个滴答,这样也不能执行。

    第三,你要应用一个CSS转换,它试图使属性的每一个记号都具有动画效果,这样也不能执行。

    如果您修复了以上所有问题,您仍然应该限制滚动事件。

    更重要的是,jQuery比普通JS慢得多。


    因为你用GSAP标记了这个并尝试用ScrollTrigger, here's how you can do it with ScrollTrigger . 这是我以前做的演示,但效果是一样的。

    关于为什么它更高效的一些关键:

    • ScrollTrigger计算动画何时开始和结束,并且只在页面的这一部分进行动画。
    • 所有滚动计算都在同一更新方法中完成。
    • 页面的自然滚动位置不受影响。
    • 以前创建的任何动画都会被将来的动画所淘汰。
    • JS和CSS设置的定位没有冲突,CSS试图同时设置动画。