滚动位置 (scrollTop) 硬件是否在浏览器中加速



我最初的猜测是答案是否定的,因为这里提供了证据:

https://github.com/inuyaksa/jquery.nicescroll/wiki/Native-scroll-vs-Hardware-accelerated-one

我可以定性地注意到"硬件加速"版本在我的计算机上滚动更流畅。我运行一台 120Hz 的显示器。这表明第二种方法更快、更有效。

对于 HTML 元素,例如

<div id="a" style="overflow-y: hidden; height: 100px">
    Content <em>which exceeds 100px in height</em>
    <img src='lolcat.png' alt='lolcat'/>
</div>

我想实现 3D 硬件加速布局的一种简单方法是渲染div 的全高,然后将此输出作为全高纹理加载,然后用于渲染实际div 的纹理坐标一次只能显示 100px。

我的问题与scrollTop属性在理论上应该如何做到这一点有关,但目前似乎通过使用两个元素获得我描述的行为的机会要大得多,如下所示:

<div id="a" style="overflow-y: hidden; height: 100px; position: relative">
    <div style="position: relative">
        Content <em>which exceeds 100px in height</em>
        <img src='lolcat.png' alt='lolcat'/>
    </div>
</div>

其中,我没有设置 scrollTop 属性 document.getElementById('a')而是将 CCS3 -webkit/moz/ms/o-transform 属性设置为具有相应负 Y 轴像素值的 3D 值。

使用 CSS3 进行滚动的最有效方法是什么?特别是,我如何构建我的 DOM 以获得最直接的滚动实现的最佳机会(在滚动元素时不会导致内部内容的重新绘制)?

更新:我一直在使用一个非常好的Chrome平滑滚动插件,它似乎使用JS在页面上分配scrollTop偏移量以实现滚动渲染,这似乎表明如果这不是硬件加速,性能无法真正跟上屏幕刷新率(120Hz)没有大量的CPU使用率。尽管如此,这种猜测仍然是极其不科学的。在这一点上,我要得出的结论是,浏览器可以自由地在合理范围内加速他们选择的任何内容,所以答案是一个响亮的可能

根据您提到的页面,硬件加速取决于浏览器是否支持硬件加速。

带有包装器的div 可以硬件加速。(如果浏览器支持)

所以我认为你嵌套两个div的想法将创造一种更简单的方法来实现你想要的。但要回答您的问题,scrollTop仅在支持硬件加速的浏览器中进行硬件加速。

  1. Firefox 4.0 beta 5 支持硬件加速。
  2. IE 9 测试版支持硬件加速。
  3. Chrome 6+ 支持硬件加速合成

Safari和Opera尚未支持硬件加速。

这是根据2010年的这个页面。 http://www.webmonkey.com/2010/09/a-guide-to-hardware-acceleration-in-modern-browsers/

根据 http://arstechnica.com/information-technology/2012/06/opera-12-arrives-with-webcam-apis-and-experimental-webgl-support/的说法,Opera 12支持硬件加速。

根据TechCrunch的说法,Safari 5 for Windows支持硬件加速。

根据Apple Safari的网站,Safari 6支持硬件加速。

不好意思!我有指向TechCrunch文章和Safari网站的链接,但我只能使用两个超链接。

编辑:

为了更好地回答这个问题,我补充了这个问题。使用 CSS3 进行滚动的最有效方法是 overflow: scroll;overflow-x: scroll; .overflow: CSS属性比scrollTop更高效的CSS,因为scrollTop是一个使用JavaScript的jQuery标签。所以使用scrollTop不是CSS,而是JavaScript。此外,使用CSS也是实现水平滚动的最直接方法,因为它不需要导入jQuery库或启用JavaScript。

我完全同意你的看法,即通过使用两个div标签和CSS而不是使用jQuery/JavaScript来获得你所描述的行为的机会要大得多。

除非您希望能够自动滚动到另一个位置,否则在使用scrollTop时,您可以使用按钮或链接有效地滚动到不同的位置。

$(document).ready(function() {
    $('a[href=#top]').click(function(){
        $('html, body').animate({scrollTop:0}, 'slow');
        return false;
    });
});

这个使用 scrollTop 的 jQuery 代码使所有<a href="#top">top</a>都以动画形式滚动到顶部,而不仅仅是跳转。使用 CSS 滚动时,您不会获得这些动画滚动。此外,您可以使用此方法通过设置多个 div 标签的 ID 并编辑上面的代码以满足您的需求,水平或垂直滚动到不同的点。这是来自 http://www.electrictoolbox.com/jquery-scroll-top/。

scrollTop不是硬件加速的。我发现即使在移动设备上也可以生成平滑滚动的最佳方法是强制将 css3 硬件加速与过渡相结合。

我假设你有jQuery,所以我使用该语法是为了清楚起见,我所做的只是设置css属性和其他基本调用。

var $body = $('body');
function scrollTop(scrollPosition) {
    // account for the current scroll position
    var scrollDiff = $body.scrollTop() - scrollPosition;
    // use css transition
    $body.css('transition', '.5s');
    // translate3d forces hardware acceleration, second param is 'y'
    $body.css('transform', 'translate3d(0, ' + scrollDiff + 'px, 0)');
    // revert back to native scrollTop
    $body.bind('transitionend webkitTransitionEnd', function(event) {
        $body
        .scrollTop(scrollPosition)
        .css({'transition': '', 'transform': ''})
        .unbind(event);
    });
}

注意:我确实注意到transitionend事件在移动设备上并不总是可靠的;这使得代码的"恢复到本机scrollTop"部分看起来有故障。我认为最好的方法是更进一步并在不使用scrollTop的情况下实现自己的滚动条。translate3d()的第二个参数除以容器的高度将是滚动条在跟踪栏上的位置(以百分比表示)。

document.getElementById("a").scrollTop更有效率,因为它已经存在了更长的时间。浏览器已经有超过 10 年的时间来优化它。

最新更新