Chrome for Android のアドレス バーのように機能するヘッダーを作成しています。その効果は、ヘッダーが疑似スティッキー ヘッダーであり、下にスクロールするとビューの外にスクロールし、次に上にスクロールし始めると、ヘッダーがスクロールしてビューに戻るということです。
現在、デスクトップ (約 60fps) では正常に動作しますが、Chrome for Android (Nexus 7 2013) ではジャンクがいっぱいです。
デモ: jsFiddle
ヘッダーとコンテンツ領域の両方が、pos:top よりもパフォーマンスの高い変換 translateY で移動されます。
また、 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 でデバッグすると、各フレームに明確な灰色の輪郭が描かれた時間がたくさんあるようです。