【问题标题】:Transform on Scroll - as smooth as on medium.com在 Scroll 上变换 - 和在 medium.com 上一样流畅
【发布时间】:2015-10-21 21:41:07
【问题描述】:

我很确定你们中的一些人知道网站 medium.com 文章页面。

例如,这里:Click

当您向下滚动时,此页面上有一个非常“简单”的效果——不透明度和变换变化。乍一看没什么大不了的。我已经在网站上实现了相同的效果可能超过 10 次。

但如果你仔细观察它,你会发现这是多么完美的平滑。似乎文本完美地滑过表面。 (我在最新的 Chrome 上查看)

如果这只是想象,我很感兴趣,并迅速建立了相同的东西来检查这一点。所以我想出了这个代码:

        var windowTop;
        var limit = 420;    

        function parallax(){

            parallaxElem.css({

                "opacity": (1 - (windowTop / limit)),
                "-webkit-transform":"translate3d(0," + (100 * (windowTop / limit)) + "px,0)",
                "-ms-transform":"translate3d(0," + (100 * (windowTop / limit)) + "px,0)",
                "transform":"translate3d(0," + (100 * (windowTop / limit)) + "px,0)"

            });

        }

        $(window).on('scroll', function(){

            windowTop = $(window).scrollTop();

            parallax();

        });

而且它远没有 Medium 网站上的代码流畅。

任何人都知道,他们在做什么来获得这种超级平滑的滚动变换效果?我就是找不到——他们的代码对我来说太复杂/太压缩了,无法从中获取任何信息。

非常感谢您提前回答!

问候 标记

【问题讨论】:

    标签: javascript jquery html css transform


    【解决方案1】:

    最大的改进就是从这个出发:

    $(window).on('scroll', function(){
      windowTop = $(window).scrollTop();
      parallax();
    });
    

    到:

    $(window).on('scroll', function(){
      window.requestAnimationFrame(parallax);
    });
    

    将 windowTop 存储在视差函数中。将其设为超出范围的变量是没有意义的。

    此外,尽管您的示例代码中没有“parallaxElem”应该是一个超出范围的变量,因为您不想对每个元素都进行 DOM 搜索滚动。

    【讨论】:

    • 起初 - 非常感谢,现在似乎更顺畅了!我已经阅读了 window.requestAnimationFrame 的定义,但我没有得到它,因为我没有在这里制作任何动画。您能否快速解释一下为什么我应该使用它以及何时使用它?
    • 您正在制作动画,只是不像您想的那样。您对 css 转换所做的操作仍然会导致浏览器重新绘制。仅在滚动或 setInterval 中进行更改会发生什么,当您的代码触发时,浏览器可能还没有准备好进行重绘。 requestAnimationFrame 告诉浏览器在有时间的时候尝试对 DOM 进行更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    相关资源
    最近更新 更多