我最初的猜测是答案是否定的,因为这里提供了证据:
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
仅在支持硬件加速的浏览器中进行硬件加速。
- Firefox 4.0 beta 5 支持硬件加速。
- IE 9 测试版支持硬件加速。
- 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 年的时间来优化它。