您可以检查是否已向下滚动到页脚,然后删除 stick 类:
function sticky_relocate() {
var window_top = $(window).scrollTop();
var footer_top = $("#footer").offset().top;
var div_top = $('#sticky-anchor').offset().top;
var div_height = $("#sticky").height();
if (window_top + div_height > footer_top)
$('#sticky').removeClass('stick');
else if (window_top > div_top) {
$('#sticky').addClass('stick');
} else {
$('#sticky').removeClass('stick');
}
}
(你可以结合 if 来删除重复的 .removeClass,这里是演示)
但是,当您开始滚动时,您的 css 会出现令人讨厌的“跳跃” - 在您的小提琴中,正确的内容出现在 #sticky 下方,然后当您粘贴 #sticky 时,正确的内容会跳跃以填补空白。使用上面的代码,当 offset() 填充/取消填充间隙时,您会得到一些竞争条件。
要解决这个问题,只需将float:left 添加到您的#sticky css。
更新小提琴:http://jsfiddle.net/0mLzseby/472/
我怀疑你想更进一步,当你到达底部时,div 然后开始随着页面滚动。您可以通过调整.stick 的“位置:固定”顶部来完成此操作。不在页脚下方时不要忘记重置它:
function sticky_relocate() {
var window_top = $(window).scrollTop();
var footer_top = $("#footer").offset().top;
var div_top = $('#sticky-anchor').offset().top;
var div_height = $("#sticky").height();
var padding = 20; // tweak here or get from margins etc
if (window_top + div_height > footer_top - padding)
$('#sticky').css({top: (window_top + div_height - footer_top + padding) * -1})
else if (window_top > div_top) {
$('#sticky').addClass('stick');
$('#sticky').css({top: 0})
} else {
$('#sticky').removeClass('stick');
}
}
padding 只是让它在一个更自然的地方开始滚动 - 你可能可以从其他 css 属性中获得它,例如其他组件的 margin 和 padding。
更新小提琴:http://jsfiddle.net/0mLzseby/473/