JSPM

  • Created
  • Published
  • Downloads 2762158
  • Score
    100M100P100Q208179F
  • License MIT

Monitor if a component is inside the viewport, using IntersectionObserver API

Package Exports

  • react-intersection-observer

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (react-intersection-observer) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

react-intersection-observer

Greenkeeper badge Travis Dependency Status npm

React component that triggers a function when the component enters or leaves the viewport. No complex configuration needed, just wrap your views and it handles the events.

import Observer from 'react-intersection-observer'

<Observer>
  {inView => <h2>{`Header inside viewport ${inView}.`}</h2>}
</Observer>

Demo

See https://thebuilder.github.io/react-intersection-observer/ for a demo.

Scroll monitor

This module is used in react-scroll-percentage to monitor the scroll position of elements in view. This module is also a great example of using react-intersection-observer as the basis for more complex needs.

Installation

Install using Yarn:

yarn add react-intersection-observer

or NPM:

npm install react-intersection-observer --save

Polyfill for 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'

Props

The <Observer /> accepts the following props:

Name Type Default Required Description
tag String false Element tag to use for the wrapping component
children func/node false Children should be either a function or a node
triggerOnce Bool false true Only trigger this method once
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
render Func false Use render method to only render content when inView

Example code

Child as function

The basic usage pass a function as the child. It will be called whenever the state changes, with the new value of inView.

import Observer from 'react-intersection-observer'

<Observer>
  {inView => <h2>{`Header inside viewport ${inView}.`}</h2>}
</Observer>

Render callback

For simple usecases where you wan't to only render a component when it enters view, you can use the render prop.

import Observer from 'react-intersection-observer'

<Observer
  style={{ height: 200, position: 'relative' }}
  render={() => (
    <div
      style={{
        position: 'absolute',
        top: 0,
        bottom: 0,
      }}
    >
      <p>
        {'Make sure that the Observer controls the height, so it does not change change when element is added.'}
      </p>
    </div>
  )}
/>

OnChange callback

You can monitor the onChange method, and control the state in your own component. The child node will always be rendered.

import Observer from 'react-intersection-observer'

<Observer onChange={(inView) => console.log('Inview:', inView)}>
  <h2>
    Plain children are always rendered. Use onChange to monitor state.
  </h2>
</Observer>