[英]Make scrolling sidebar stop at footer
我目前正在使用以下内容:
http://jsfiddle.net/0mLzseby/469/
让我的侧边栏跟随页面。 虽然我有一个很大的页脚,但我希望 div 在到达页脚时停止,而不是继续滚动。
我目前拥有的代码是:
function sticky_relocate() {
var window_top = $(window).scrollTop();
var div_top = $('#sticky-anchor').offset().top;
if (window_top > div_top) {
$('#sticky').addClass('stick');
} else {
$('#sticky').removeClass('stick');
}
}
$(function () {
$(window).scroll(sticky_relocate);
sticky_relocate();
});
您可以检查是否已向下滚动到页脚,然后删除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() 在填充/取消填充间隙时移动时,您将获得一些竞争条件。
要修复这个差距,只需在 #sticky css 中添加一个float:left
即可。
更新小提琴: http : //jsfiddle.net/0mLzseby/472/
我怀疑您想更进一步,当您到达底部时,div 开始随页面滚动。 您可以通过调整.stick
的 'position:fixed' 顶部来做到这.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');
}
}
填充只是让它在更自然的地方开始滚动 - 您可能可以从其他 css 属性(例如其他组件的边距和填充)中获得它。
更新小提琴: http : //jsfiddle.net/0mLzseby/473/
这现在可以在不使用 javascript 的情况下使用position: sticky
来实现。
更新小提琴: http : //jsfiddle.net/p1gku0mx/3/
关键是将粘性元素包装在另一个div
。 由于粘性元素不能移动到其包装器 div 之外,因此当页脚进入视图时它会向上滚动。
您不需要为此使用 javascript。 您只能使用 CSS 来做到这一点:
position: sticky;
body{ padding: 0 20px; } #content { height: 1200px; } header { width: 100%; height: 150px; background: #aaa; } main { float: left; width: 65%; height: 100%; background: #444; } aside { float: right; width: 30%; height: 500px; position: sticky; top: 100px; background: #777; } footer { width: 100%; height: 300px; background: #555; }
<body> <header>Header</header> <div id="content"> <main>Content</main> <aside>Sidebar</aside> </div> <footer>Footer</footer> </body>
您忘记添加类,如果我们在页脚中,并刷新页面,则侧边栏将不会显示:
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').addClass('stick'); //////// here is to get fixed when we refrech page when we are in the footer
$('#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');
}
}
您可以检查是否向下滚动添加粘性类,当您滚动页脚和页眉区域时,它将删除粘性类
function Stickyheaderfooterbar() {
var windowTop = jQuery(window).scrollTop();
var footerTop = jQuery(".footer").offset().top - 498;
var stickydivTop = jQuery('#sticky-anchor').offset().top;
var stickydivHeight = jQuery("#sticky").height();
console.log('footer' + footerTop);
console.log('stickydivTop' + stickydivTop);
console.log('stickydivHeight' + stickydivHeight);
console.log('windowTop' + windowTop);
if (windowTop + stickydivHeight > footerTop)
jQuery('#sticky').removeClass('stick');
else if (windowTop > stickydivTop) {
jQuery('#sticky').addClass('stick');
} else {
jQuery('#sticky').removeClass('stick');
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.