Лично я считаю, что выбор типа отображения элемента body
плохой выбор.Это корневой контейнер, и кто знает, как каждый браузер указал его отображение.ИМХО, лучше создать свой собственный корневой элемент и начать с него.
Пример CodePen
var $main = $('main');
$main.on('scroll', () => {
var pos = $main.scrollTop();
var isTop = pos == 0;
$main.toggleClass('top', isTop);
var isBottom = pos + $main.innerHeight() >= $main.prop('scrollHeight');
$main.toggleClass('bottom', isBottom);
console.log('is triggering', pos);
});
html, body {
height: 100vh;
margin: 0;
padding: 0;
}
#root {
height: 100vh;
display: flex;
flex-direction: column;
}
.sticky-header, .sticky-footer {
flex: 0 0 auto;
background: purple;
}
.sticky-content {
flex: 1 1 auto;
overflow-y: scroll;
background-color: green;
}
.top {
background-color: yellow;
}
.bottom {
background-color: orange;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="root">
<header class="sticky-header">
<h1>I'm Sticky</h1>
</header>
<main class="sticky-content top">
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
<p>This is a large amount of scrollable content.</p>
</main>
<footer class="sticky-footer">
<small>I'm sticky</small>
</footer>
</div>