これらの if ステートメントは、常に私をめまいさせます。ヘッダーのあるページがあり、マークアップでその上に非表示のヘッダーがある場合。
<div id="headerfloat" style="display:none;">
<p>Floated header</p>
</div>
<div id="header">
<p>Header</p>
</div>
これは、ページが 225 ピクセル以上下にスクロールされるたびに が表示され、#headerfloat
topScroll が 225 ピクセル未満になると消えるという考え方です。そして、私はこれをjavascriptとjQueryでうまく動かすことができましたが、iPhoneでテストすると非常に遅くなります。そして、コードが各スクロールイベントで実行されるためだと確信しています。が表示されていても#headerfloat
、コードは実行されます。その時点でそうする必要はありませんが。
そのため、コードが必要なときに一度だけ実行されるようにする必要があります。.open
私が最初に考えたのは、やのようなクラスを追加および削除することでし.closed
た#headerfloat
。そして、スクロール イベント中に if ステートメントを実行します。しかし、それはそれを行う最も効率的な方法ですか?
私のこれまでのところ、醜いスニペット:
jQuery(window).scroll(function () {
var headerfloat = $("#header_float");
var top = jQuery(window).scrollTop();
if (top > 225) // height of float header
{
if (!$(headerfloat).hasClass("closed")) {
$(headerfloat).addClass("boxshadow", "", 100, "easeInOutQuad").slideDown().addClass("open").removeClass("closed");
}
} else {
$(headerfloat).removeClass("boxshadow", "", 100, "easeInOutQuad").removeClass("closed").slideUp();
}
});
編集: laconbass の素晴らしい応答の後、これは私が最終的に得たコードです:
var mainHeader = $('#header')
, top_limit = mainHeader.outerHeight()
, $window = $(window)
;
var header_float = $('#header_float')
bindEvent();
function bindEvent() {
$window.scroll( scrollEvent );
}
function scrollEvent() {
var top = $window.scrollTop();
// avoid any logic if nothing must be done
if ( top < top_limit && !header_float.is(':visible')
|| top > top_limit && header_float.is(':visible')
) return;
// unbind the scroll event to avoid its execution
// until slide animation is complete
$window.unbind( 'scroll' );
// show/hide the header
if ( top > top_limit ) {
header_float.slideDown( 400, bindEvent );
} else {
header_float.slideUp( 400, bindEvent );
}
};