jQuery 滚动延迟(滞后)在 chrome 上但在 firefox 上平滑

Posted

技术标签:

【中文标题】jQuery 滚动延迟(滞后)在 chrome 上但在 firefox 上平滑【英文标题】:jQuery Scroll delays (lags) on chrome but smooth on firefox 【发布时间】:2020-10-11 23:44:19 【问题描述】:

我试图在不使用任何滚动库的情况下制作整页动画,滚动在 firefox 浏览器上运行良好且流畅,但在 Google Chrome 上滚动动画无缘无故滞后一秒钟。 我认为 chrome 中的这种滞后是由于 scrollTop jQuery Animate 方法,但我找不到任何解决方法。 我已经附上了整个代码 sn-p,我会很感激关于如何在 chrome 上实现平滑滚动的建议。

  (function ($) 

            let $htmlBody = $('html, body');
            let $window = $(window);
            let $sections = $('section.fv');

            let $currentSection = 0;
            let $scrollDirection = 'up'; // wheel scroll direction

            // When Page First Load
            $sections.removeClass('active');
            document.body.scrollTop = 0;
            document.documentElement.scrollTop = 0;

            createDots();

            let $dots = $("#fv-nav ul a");

            changeActiveStatus($currentSection);

            function scrollTo($section) 

                $htmlBody.stop().animate(
                    
                        scrollTop: $sections.eq($section).offset().top
                    , 
                    easing: 'linear',
                    duration: 500,
                ).promise().then(function () 
                    changeActiveStatus($section);
                );
            

            function changeActiveStatus($section) 
                $sections.removeClass('active').eq($section).addClass('active');
                $dots.removeClass('active').eq($section).addClass('active');
            
            function createDots() 
                var div = $("<div>").attr("id", "fv-nav").append('<ul>');
                $sections.each(function (i) 
                    div.find('ul').append(`<li><a data-scroll="$i" href="#" class=""><span></span></a></li>`)
                )
                $('body').append(div);
            

            $dots.click(function (e) 
                e.preventDefault();
                if (!$(':animated').length) 
                    $currentSection = $(this).attr("data-scroll");
                    scrollTo($currentSection);
                
            );

            $window.on('mousewheel DOMMouseScroll', function (event) 

                if (event.originalEvent.wheelDelta > 0 || event.originalEvent.detail < 0) 
                    // scroll up
                    $scrollDirection = "up";
                
                else 
                    // scroll down
                    $scrollDirection = "down";
                

                // Check if Already scrolling
                if (!$(':animated').length) 
                    if ($scrollDirection === "down" && $currentSection < $sections.length - 1) 
                        $currentSection++;
                        scrollTo($currentSection)
                    

                    if ($scrollDirection === "up" && $currentSection > 0) 
                        $currentSection--;
                        scrollTo($currentSection)
                    
                

            );

        (jQuery));
* 
            padding: 0;
            margin: 0;
            box-sizing: border-box;
        

        html 
            scroll-behavior: smooth;
            -webkit-box-sizing: border-box;
            box-sizing: border-box;
            text-rendering: optimizeLegibility;
            -webkit-font-smoothing: antialiased;
            -webkit-tap-highlight-color: transparent;
            -ms-text-size-adjust: 100%;
            -webkit-text-size-adjust: 100%;
            -webkit-font-smoothing: antialiased;
            -moz-osx-font-smoothing: grayscale;
            font-size: 16px;
        

        *,
        *:before,
        *:after 
            -webkit-box-sizing: inherit;
            box-sizing: inherit;
        

        body 
            -ms-overflow-style: none;
            overflow-x: hidden;
            overflow-y: hidden;
        

        section 
            background-color: azure;
            display: flex;
            align-items: center;
            justify-content: center;
            transform: translateZ(0) rotateZ(360deg);
            backface-visibility: hidden;
            perspective: 1000;
            will-change: transform;
            overflow: hidden;
        

        #s2,
        #s4 
            background-color: #282c34;
            color: #ffffff;
        

        .fv 
            height: 100vh;
        

        #fv-nav 
            position: fixed;
            top: 50%;
            left: 98%;
            transform: translate(-50%, -50%);
        

        #fv-nav ul 
            display: flex;
            flex-direction: column;
            justify-content: center;
            align-items: center;
            list-style: none;
        

        #fv-nav ul li a 
            display: flex;
            justify-content: center;
            align-items: center;
            width: 9px;
            height: 9px;
            margin: 7px;
            text-align: center;
        

        #fv-nav ul a span 
            display: block;
            width: 7px;
            height: 7px;
            transition: 0.2s ease all;
        

        #fv-nav ul a.active span 
            width: 9px;
            height: 9px;
        

        #fv-nav ul a:hover span 
            width: 9px;
            height: 9px;
        

        #fv-nav ul li a span 
            display: block;
            z-index: 1;
            cursor: pointer;
            text-decoration: none;
            background-color: #1c85e1;
            border-radius: 50%;
        

        #fv-nav ul li a.active span 
            background-color: #01427a;
        
<section id="s1" class="fv">
        <h2>Section 1</h2>
    </section>
    <section id="s2" class="fv">
        <h2>Section 2</h2>
    </section>
    <section id="s3" class="fv">
        <h2>Section 3</h2>
    </section>
    <section id="s4" class="fv">
        <h2>Section 4</h2>
    </section>
   <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

【问题讨论】:

【参考方案1】:

我找到了解决方案(或解决方法):

我只需要更改一些 CSS 样式:

html  overflow-x: hidden; overflow-y: hidden; height: 100%; 
body  overflow: hidden; height: 100%;

现在滚动它在 firefox 和 chrome 上都可以流畅地制作动画

【讨论】:

以上是关于jQuery 滚动延迟(滞后)在 chrome 上但在 firefox 上平滑的主要内容,如果未能解决你的问题,请参考以下文章

jQuery - .animate() 在滚动时非常延迟

Jquery - 动画滚动对角线,野生动物园不工作,镀铬滞后

jQuery 滚动事件 - 检测元素滚动到视图中 - Chrome 上的性能不佳

如何防止这种奇怪的 jQuery .animate() 滞后?

Jquery 缓动动画在 iPad 上滞后

为啥我的网站在我滚动时在 Chrome 中显示滞后?