Skip to main content
Version: 4.0 Beta

ParallaxProvider

The <ParallaxProvider /> component is meant to wrap a root level component in your application and is necessary to provide access through the React context API to the Parallax Controller.

import { ParallaxProvider } from 'react-scroll-parallax';

Examples​

This component should only be used once in your app, for instance in an <AppContainer /> component that won't be mounted/unmounted during route changes. Like so:

const AppContainer = () => (
<ParallaxProvider>
<Router>
<App />
</Router>
</ParallaxProvider>
);
info

You can have multiple providers, however they will all be independent instances of a ParallaxController. It's recommended to only use one when possible.

Props​

The following props configure the <ParallaxProvider> component:

NameTypeDefaultDescription
scrollAxisstringverticalOptionally pass the scroll axis for setting horizontal/vertical scrolling. One of vertical or horizontal
scrollContainerHTMLElement<body>Optionally set the container that has overflow and will contain parallax elements. Defaults to the document scroll body.
isDisabledbooleanfalseDisables the ParallaxController and all animations.

More Examples​

Using props you can configure the provider for the following conditions.

Horizontal Scrolling​

If your app's overflow is horizontal, you'll need to change the scrollAxis:

const AppContainer = () => (
<ParallaxProvider scrollAxis="horizontal">
<Router>
<App />
</Router>
</ParallaxProvider>
);

Scroll Container​

By default the <ParallaxProvider> uses the document scrolling element. If your app's overflow is a unique element you need to provide the element as the scrollContainer.

Here's how you can do that using React hooks to set a ref to a DOM element. The useEffect will be called once after mounting then update state with the element to be passed to the provider.

ScrollContainer.tsx
import * as React from 'react';
import { ParallaxProvider } from 'react-scroll-parallax';

const ScrollContainer = () => {
const [scrollEl, setScrollElement] = React.useState<HTMLDivElement>(null);
const ref = React.useRef<HTMLDivElement>();
React.useEffect(() => {
setScrollElement(ref.current);
});

return (
<div className="your-scroll-container" ref={ref}>
<ParallaxProvider scrollContainer={scrollEl}>
{props.children}
</ParallaxProvider>
</div>
);
};

Disabling All Parallax Elements​

With the isDisabled prop you may disable every parallax element in the provider when a condition is met, instead of individually. This can be helpful to disable parallax in certain situations like on mobile devices, or for users who prefers-reduced-motion. Elements will be re-enabled when isDisabled is true.

const App = () => {
const userPrefersReducedMotion = useMediaQuery({
query: '(prefers-reduced-motion)',
});

return (
<ParallaxProvider isDisabled={userPrefersReducedMotion}>
{props.children}
</ParallaxProvider>
);
};