Still attaching scroll listeners to trigger animations or load content?
Here’s the practical, reliable way to ship smooth UIs at scale:
Intersection Observer
WHY?
The Hidden Cost of Scroll Listeners
At first glance, scroll listeners seem harmless.
You scroll → JavaScript runs → something animates.
The problem is how often that code runs.
Scroll Events Fire A Lot
When a user scrolls, the browser can fire the scroll event up to 60 times per second (once every frame).
That means your code is running:
- While the browser is drawing pixels
- While it’s calculating layouts
- While it’s handling user input
Your scroll handler is now competing with the browser’s most time‑critical work.
Small Checks Can Trigger Big Work
element.getBoundingClientRect();
But under the hood, it may force the browser to:
- Recalculate styles
- Recompute layout
- Flush the rendering pipeline
The Cost Grows with Every Element
- If you check one element, it’s manageable.
- If you check 10 elements, that work runs 10 times.
- If you check 100 elements, the browser struggles.
- This is why scroll‑based logic often feels fine at first……and suddenly becomes janky as the page grows.
Why Throttling Isn’t Enough:
“I’ll just throttle my scroll handler.”
Throttling helps reduce CPU usage, but it doesn’t fix everything:
- Animations can fire late
- Elements appear after they’re visible
- Fast scrolling causes missed triggers
- Touch scrolling still feels laggy
In other words: fewer explosions, same fire.
A Quick Performance Smell Test
Open Chrome DevTools → Performance, record a scroll, and look for:
- Long “Event (scroll)” blocks
- Frequent Layout or Recalculate Style steps
If you see them repeating during scroll, your page is doing too much work.
Key Takeaway
- Scroll listeners aren’t bad because they’re wrong.
- They’re bad because they make you do the browser’s job—over and over again.
- That’s exactly the problem Intersection Observer was designed to solve.
Top comments (0)