私は現在以下を使用しています:
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()がギャップを埋める/埋めないときに移動するときに、いくつかの競合状態が発生します。
このギャップを修正するには、#stickycssにfloat:left
を追加するだけです。
更新されたフィドル: http://jsfiddle.net/0mLzseby/472/
さらに一歩進んで、一番下に到達すると、divがページとともにスクロールを開始するのではないかと思います。これを行うには、.stick
の 'position:fixed'上部を調整します。フッターの下にない場合は、リセットすることを忘れないでください。
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/
これは、position: sticky
を使用してJavaScriptなしで実現できるようになりました。
更新されたフィドル: http://jsfiddle.net/p1gku0mx/3/
重要なのは、スティッキー要素を別のdiv
でラップすることです。スティッキー要素はラッパーdivの外側に移動できないため、フッターが表示されると上にスクロールされます。
フッターにいる場合はクラスを追加するのを忘れて、ページを更新すると、サイドバーが表示されません。
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');
}
}
あなたこれに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 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');
}
}