react-scroll-percentage
![npm](https://img.shields.io/npm/v/react-scroll-percentage.svg)
React component that reports the current scroll percentage of a element inside
the viewport. It uses React Intersection
Observer to only
report the percentage when the element is inside the viewport.
import ScrollPercentage from 'react-scroll-percentage'
<ScrollPercentage>
{( percentage ) => (
<h2>{`Percentage scrolled: ${percentage.toPrecision(2)}%.`}</h2>
)}
</ScrollPercentage>
Demo
See https://thebuilder.github.io/react-scroll-percentage/ for a demo.
Installation
Install using Yarn:
yarn add react-scroll-percentage
or NPM:
npm install react-scroll-percentage --save
Polyfills
intersection-observer
The component requires the intersection-observer
API
to be available on the global namespace. At the moment you should include a
polyfill to ensure support in all browsers.
You can import the
polyfill directly or use
a service like polyfill.io that can add it when
needed.
yarn add intersection-observer
Then import it in your app:
import "intersection-observer";
If you are using Webpack (or similar) you could use dynamic
imports, to load the
Polyfill only if needed. A basic implementation could look something like this:
loadPolyfills()
.then(() => )
function loadPolyfills() {
const polyfills = []
if (!supportsIntersectionObserver()) {
polyfills.push(import('intersection-observer'))
}
return Promise.all(polyfills)
}
function supportsIntersectionObserver() {
return (
'IntersectionObserver' in global &&
'IntersectionObserverEntry' in global &&
'intersectionRatio' in IntersectionObserverEntry.prototype
)
}
requestAnimationFrame
To optimize scroll updates,
requestAnimationFrame
is used. Make sure your target browsers support it, or include the required
polyfill.
Props
The <ScrollPercentage />
accepts the following props:
Name | Type | Default | Required | Description |
---|
tag | Node | | false | Element tag to use for the wrapping component |
children | func/node | | false | Children should be either a function or a node |
threshold | Number | 0 | false | Number between 0 and 1 indicating the the percentage that should be visible before triggering |
onChange | Func | | false | Call this function whenever the in view state changes |
Example code
Child as function
The basic usage pass a function as the child. It will be called whenever the
state changes, with the current value of percentage
and inView
.
import ScrollPercentage from 'react-scroll-percentage'
<ScrollPercentage>
{(percentage, inView ) => (
<h2>{`Percentage scrolled: ${percentage.toPrecision(2)}%.`}</h2>
)}
</ScrollPercentage>
OnChange callback
You can monitor the onChange method, and control the state in your own
component. The child node will always be rendered.
import ScrollPercentage from 'react-scroll-percentage'
<ScrollPercentage onChange={(percentage, inView) => console.log(percentage, inView)}>
<h2>
Plain children are always rendered. Use onChange to monitor state.
</h2>
</ScrollPercentage>