这些 if 语句总是让我头晕目眩。如果有一个带有标题的页面,并且在标记上方有一个隐藏的标题。
<div id="headerfloat" style="display:none;">
<p>Floated header</p>
</div>
<div id="header">
<p>Header</p>
</div>
这个想法是,每当页面向下滚动超过 225px 时,#headerfloat
应该出现,而当 topScroll 小于 225px 时消失。我设法用 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 );
}
};