我正在创建一个类似于 Chrome for Android 地址栏的标题。效果是标题是一个伪粘性标题,当您向下滚动时会滚动到视图之外,然后您开始向上滚动标题滚动回到视图中。
现在它在桌面上运行良好(大约 60fps),但在 Chrome for Android 上(在 Nexus 7 2013 上)它充满了卡顿。
演示:jsFiddle
标题和内容区域都使用 transform translateY 移动,它比 pos:top 性能更高
我还使用 requestAnimationFrame 来消除滚动并仅在浏览器最方便时更改属性。
标题是position: fixed; top: 0;
,然后使用 滚动进出视图transform: translateY(...);
。另外,我没有使用 margin-top 从标题下方获取内容,而是使用transform: translateY(...);
我的 js 的基本结构如下:
var latestScrollTop = 0;
var lastReactedScrollTop = 0;
var ticking = false;
function DoScroll()
{
var builtUpScrollTop = latestScrollTop - lastReactedScrollTop;
// Fold the top bar while we are scrolling (lock it to scrolling)
$('header.main-header').css('transform', 'translateY(' ... 'px)');
HeaderHeightChange();
lastReactedScrollTop = latestScrollTop;
ticking = false;
}
function HeaderHeightChange()
{
// We need to update the margin-top for the content so we don't overlap it
$('main.content-area').css('transform', 'translateY(' ... 'px)');
}
function requestTick() {
if(!ticking) {
requestAnimationFrame(function(){
DoScroll();
});
}
ticking = true;
}
$(window).on('scroll', function(e) {
latestScrollTop = $(window).scrollTop();
requestTick();
});
效果不完整,因为它需要在完成滚动(并且已编码)后解决折叠问题,但我不想让问题复杂化,因为只有滚动移动锁定到标题导致卡顿。我在上下滚动时看到了绘制矩形,即使我正在更改我认为 gpu 正在处理并且不应该绘制的变换。
编辑:似乎在使用 ADB 进行调试时,每帧中都有一堆清晰的灰色轮廓时间。