The required behaviour is :
- The yellow span must be positioned relatively to viewport (
position:fixed;
) when it is inside the pink div. - The height of yellow span must always be the same as viewport height minus 100px. It has a fixed width in px.
- The yellow span must be verticaly centered in the viewport (this rule is modified by rule 4).
- On scroll, the yellow span must never be outside the boundaries of the pink div. If the page is scrolled further than the pink div, the yellow span must be absolutely positionned to the bottom of the pink div and scroll up with it
- If the page is scrolled back up to the pink div, the yellow span must go back to fixed position (as in rule 1 and 2).
I know sticky positioning does exaclty that but I can't use it because of poor browser support. So I made this snippet and would like to know if it can be optimized or shortened :
$(document).scroll(function() {
var span = $('span'),
div = $('div'),
spanHeight = span.outerHeight(),
divHeight = div.height(),
spanOffset = span.offset().top + spanHeight,
divOffset = div.offset().top + divHeight;
if (spanOffset >= divOffset) {
span.addClass('bottom');
var windowScroll = $(window).scrollTop() + $(window).height() - 50;
if (spanOffset > windowScroll) {
span.removeClass('bottom');
}
}
});
*{margin:0;}
div {
position: relative;
background: pink;
height: 800px;
margin-bottom: 800px;
}
span {
position: fixed;
right: 0;
bottom: 50px;
width: 10%;
height: calc(100vh - 100px);
background: gold;
}
.bottom {
position: absolute;
bottom: 0;
right: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<div>
<span>some content</span>
</div>
position: fixed
. Then once moved to the bottom it'll never go back, since henceforthspanOffset
will always keep >=divOffset
when scrolling up. \$\endgroup\$position:absolute
and moves up with the pink div. When you scroll bac up, higher thant the bottom of the pink div, goes back toposition:fixed
here is a gif to demonstrate: i.imgur.com/7NU3oAO.gifv \$\endgroup\$