Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

react-visibility-sensor

joshwnj935.1kMIT5.1.1TypeScript support: included

Sensor component for React that notifies you when it goes in or out of the window viewport.

react, react-component, visibility

readme

React Visibility Sensor

Build Status

Sensor component for React that notifies you when it goes in or out of the window viewport.

Sponsored by X-Team

Install

npm install react-visibility-sensor

Including the script directly

Useful if you want to use with bower, or in a plain old <script> tag.

In this case, make sure that React and ReactDOM are already loaded and globally accessible.

Take a look at the umd example to see this in action

Example

View an example on codesandbox

Or if you'd like to try building an example yourself locally, here's another:

View the example

To run the example locally:

  • npm run build-example
  • open example/index.html in a browser

General usage goes something like:

const VisibilitySensor = require('react-visibility-sensor');

function onChange (isVisible) {
  console.log('Element is now %s', isVisible ? 'visible' : 'hidden');
}

function MyComponent (props) {
  return (
    <VisibilitySensor onChange={onChange}>
      <div>...content goes here...</div>
    </VisibilitySensor>
  );
}

You can also pass a child function, which can be convenient if you don't need to store the visibility anywhere:

function MyComponent (props) {
  return (
    <VisibilitySensor>
      {({isVisible}) =>
        <div>I am {isVisible ? 'visible' : 'invisible'}</div>
      }
    </VisibilitySensor>
  );
}

Props

  • onChange: callback for whenever the element changes from being within the window viewport or not. Function is called with 1 argument (isVisible: boolean)
  • active: (default true) boolean flag for enabling / disabling the sensor. When active !== true the sensor will not fire the onChange callback.
  • partialVisibility: (default false) consider element visible if only part of it is visible. Also possible values are - 'top', 'right', 'bottom', 'left' - in case it's needed to detect when one of these become visible explicitly.
  • offset: (default {}) with offset you can define amount of px from one side when the visibility should already change. So in example setting offset={{top:10}} means that the visibility changes hidden when there is less than 10px to top of the viewport. Offset works along with partialVisibility
  • minTopValue: (default 0) consider element visible if only part of it is visible and a minimum amount of pixels could be set, so if at least 100px are in viewport, we mark element as visible.
  • intervalCheck: (default true) when this is true, it gives you the possibility to check if the element is in view even if it wasn't because of a user scroll
  • intervalDelay: (default 100) integer, number of milliseconds between checking the element's position in relation the the window viewport. Making this number too low will have a negative impact on performance.
  • scrollCheck: (default: false) by making this true, the scroll listener is enabled.
  • scrollDelay: (default: 250) is the debounce rate at which the check is triggered. Ex: 250ms after the user stopped scrolling.
  • scrollThrottle: (default: -1) by specifying a value > -1, you are enabling throttle instead of the delay to trigger checks on scroll event. Throttle supercedes delay.
  • resizeCheck: (default: false) by making this true, the resize listener is enabled. Resize listener only listens to the window.
  • resizeDelay: (default: 250) is the debounce rate at which the check is triggered. Ex: 250ms after the user stopped resizing.
  • resizeThrottle: (default: -1) by specifying a value > -1, you are enabling throttle instead of the delay to trigger checks on resize event. Throttle supercedes delay.
  • containment: (optional) element to use as a viewport when checking visibility. Default behaviour is to use the browser window as viewport.
  • delayedCall: (default false) if is set to true, wont execute on page load ( prevents react apps triggering elements as visible before styles are loaded )
  • children: can be a React element or a function. If you provide a function, it will be called with 1 argument {isVisible: ?boolean, visibilityRect: Object}

It's possible to use both intervalCheck and scrollCheck together. This means you can detect most visibility changes quickly with scrollCheck, and an intervalCheck with a higher intervalDelay will act as a fallback for other visibility events, such as resize of a container.

Thanks

Special thanks to contributors

License

MIT

changelog

Changelog

5.1.1

  • Upgrade outdated dependencies to resolve vulnerabilities (#162)

5.1.0

  • Add TypeScript definition (#153)

5.0.0

  • Update to ES6 style React and replaced Browserify with Webpack (#123)
  • Update code to the latest version of react, remove useless params/function (#115)

4.1.0

  • Update lifecycle method for React 16.3 (#119)

4.0.0

  • Upgrade outdated deps and node version (#127)

3.14.0

  • re-register node in componentDidUpdate if children diffs (#103)

3.13.0

  • Check if the component has size and is not hidden (#114)

3.12.0

  • round down viewport values (#116)

3.11.0

  • add react 16 as a peer dep (#94)

3.10.1

  • prevent unnecessary rerendering (#85)

3.10.0

  • allow passing a children function that takes state and chooses what to render from it (#76)

3.9.0

  • Migrated deprecated React.PropTypes and React.createClass (#73)

3.8.0

  • Improving offset and adding resize listener (#69)

3.7.0

  • added offset prop (#64)

3.6.2

  • fixed a problem where .debounceCheck is not cleared properly (#62)

3.6.1

  • fixed typo from delay to scrollDelay (#59)

3.6.0

  • added support for "scrollCheck" as well as the default "intervalCheck" (#54)

3.5.0

  • simpler logic for partialVisible (#41)

3.4.0

  • partialVisibility prop can now either be a boolean (any edge can be visible) or a string of top|right|bottom|left to indicate which edge determines visibility (#42)

3.3.0

  • Mark partially visible when center is visible (#40)

3.2.1

  • Fixed error case where component can be null (#38)

3.2.0

  • Added minTopValue and delayedCall props (#30)

3.1.1

  • Removed dist file from git (as suggested in #18)
  • Added npm run build, which is also run on prepublish
  • updated the build script so browserify produces a standalone umd script
  • added example-umd to show how to use it with plain <script> tags

3.0.1

  • return the new state from .check method

3.0.0

  • upgraded to react 0.14
  • removed the package.browserify field, which is no longer needed and was causing some conflicts (#11)

2.1.0

  • new optional prop partialVisibility changes the behaviour of the sensor, so that it considers an element to be visible if it is at least partially visible (#15)

2.0.0

  • sensor DOM node is passed in as children rather than the component always rendering its own <div> (#13)
  • this also means the component also no longer accepts className or style props.

Migrating from v1.x:

If you're not setting a className or style, no change is required.

Otherwise add your own element as a child and move the className or style there. Eg:

  • before: <VisibilitySensor className='something' />
  • after: <VisibilitySensor><div className='something' /></VisibilitySensor>