A necessidade de position: sticky
existia há anos antes de ser implementada nativamente, e posso me gabar de tê-la implementado com JavaScript e scroll
eventos por muito tempo. Por fim, conseguimos position: sticky
e ele funciona bem do ponto de vista visual, mas eu queria saber como podemos determinar quando o elemento foi realmente fixado devido à rolagem.
Podemos determinar se um elemento se tornou fixo graças à função API IntersectionObserver!
Fixar um elemento na parte superior de seu contêiner é tão fácil quanto uma diretiva CSS:
.myElement { position: sticky; }
A questão ainda permanece sobre como podemos detectar que um elemento está sendo fixado. O ideal seria que houvesse um :stuck
que poderíamos usar, mas, em vez disso, o melhor que podemos fazer é aplicar uma classe CSS quando o elemento se torna fixo usando um truque de CSS e alguma mágica de JavaScript:
.myElement { position: sticky; /* use "top" to provide threshold for hitting top of parent */ top: -1px; } .is-pinned { color: red; }
const el = document.querySelector(".myElement") const observer = new IntersectionObserver( ([e]) => e.target.classList.toggle("is-pinned", e.intersectionRatioAs soon as
myElement
becomes stuck or unstuck, theis-pinned
class is applied or removed. Check out this demo:See the Pen WNwVXKx by David Walsh (@darkwing) on CodePen.
While there's not too much JavaScript involved, I hope we eventually get a CSS pseudo-class for this. Something like
:sticky
,:stuck
, or:pinned
seems as reasonable as:hover
and:focus
do.