I'm trying to create a progress bar that shows how much of a certain element the user still has left to view. Here are some details:
.postProgressBar
appears by default under.postHeroImage
- When the user scrolls, I want the
.postProgressBar
to slowly fill up based on how much of the.spacer
element there is left to scroll to. - When the
.postProgressBar
hits the bottom of myheader
, I want it to becomefixed
to the bottom of theheader
(and to unfix when.postHeroImage
is in view again).
See my current approach:
$(function() {
gsap.registerPlugin(ScrollTrigger);
$(window).scroll(function() {
var scroll = $(window).scrollTop();
if (scroll >= 1) {
$(".header").addClass("fixed");
} else {
$(".header").removeClass("fixed");
}
});
var action = gsap.set('.postProgressBar', { position:'fixed', paused:true});
gsap.to('progress', {
value: 100,
ease: 'none',
scrollTrigger: {
trigger: "#startProgressBar",
scrub: 0.3,
markers:true,
onEnter: () => action.play(),
onLeave: () => action.reverse(),
onLeaveBack: () => action.reverse(),
onEnterBack: () => action.reverse(),
}
});
});
body {
background-color: lightblue;
--white: #FFFFFF;
--grey: #002A54;
--purple: #5D209F;
}
.header {
position: absolute;
top: 0;
width: 100%;
padding: 20px 15px;
z-index: 9999;
background-color: var(--white);
}
.header.fixed {
position: fixed;
background-color: var(--white);
border-bottom: 1px solid var(--grey);
}
.postHeroImage {
padding: 134px 0 0 0;
margin-bottom: 105px;
position: relative;
}
.postHeroImage__bg {
background-size: cover;
background-repeat: no-repeat;
width: 100%;
min-height: 400px;
}
progress {
position: absolute;
bottom: -15px;
left: 0;
-webkit-appearance: none;
appearance: none;
width: 100%;
height: 15px;
border: none;
background: transparent;
z-index: 9999;
}
progress::-webkit-progress-bar {
background: transparent;
}
progress::-webkit-progress-value {
background: var(--purple);
background-attachment: fixed;
}
progress::-moz-progress-bar {
background: var(--purple);
background-attachment: fixed;
}
.spacer {
height: 1000vh;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.9.0/gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.9.0/ScrollTrigger.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet">
<body>
<header class="header">Header</header>
<section class="postHeroImage" id="startProgressBar">
<progress class="postProgressBar" max="100" value="0"></progress>
<div class="container">
<div class="row">
<div class="col-12">
<div class="postHeroImage__bg" style="background-image: url( 'https://picsum.photos/200/300' );" loading="lazy"></div>
</div>
</div>
</div>
</section>
<div class="spacer">lorum ipsum</div>
</body>
Current issues:
- The
.postProgressBar
doesn't becomefixed
(can't seefixed
inline style in inspect mode) - The
.postProgressBar
is showing progress that isn't accurate based on the amount of.spacer
there is left to scroll.
from GSAP: Pin progress bar when it hits element + progress bar not accrate
No comments:
Post a Comment