Take the button out of document flow and pin it to the viewport instead. Natively, it sits outside the scroll container, laid directly on the screen; on the web that's `position: fixed` (or `sticky` relative to an app-internal scroll container). No matter how far the content scrolls, the button's screen coordinates never move.
The most common trap is on the content side — since the CTA is a separate layer floating over the content, forgetting to add `padding-bottom` equal to the CTA's height at the end of the scroll area means the last paragraph or button ends up permanently hidden behind it, unreachable.
The other is the safe area. On a device with a home indicator, pinning the CTA flush to the very bottom puts it right in the gesture zone, so it needs inset padding like `padding-bottom: max(16px, env(safe-area-inset-bottom))` to float just above it.
When to use
Use it on screens with unpredictable scroll length but one action that must always stay reachable — product detail, checkout, an application form. Avoid stacking more than one sticky CTA.