Sensor component for React that notifies you when it goes in or out of the window viewport.
npm install react-visibility-sensor
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.
- Plain: https://unpkg.com/react-visibility-sensor@3.4.0/dist/visibility-sensor.js
- Minified https://unpkg.com/react-visibility-sensor@3.4.0/dist/visibility-sensor.min.js
Take a look at the umd example to see this in action
To run the example locally:
npm run build-example
- open
example/index.html
in a browser
General usage goes something like:
function render () {
var VisibilitySensor = require('react-visibility-sensor');
var onChange = function (isVisible) {
console.log('Element is now %s', isVisible ? 'visible' : 'hidden');
};
return (
<VisibilitySensor onChange={onChange} />
);
}
You can also pass a child function, which can be convenient if you don't need to store the visibility anywhere:
return (
<VisibilitySensor>
{({isVisible}) =>
<div>I am {isVisible ? 'visible' : 'invisible'}</div>
}
</VisibilitySensor>
);
onChange
: callback for whenever the element changes from being within the window viewport or not. Function is called with 1 argument(isVisible: boolean)
active
: (defaulttrue
) boolean flag for enabling / disabling the sensor. Whenactive !== true
the sensor will not fire theonChange
callback.partialVisibility
: (defaultfalse
) 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 settingoffset={{top:10}}
means that the visibility changes hidden when there is less than 10px to top of the viewport. Offset works along withpartialVisibility
minTopValue
: (default0
) 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
: (defaulttrue
) the default usage of Visibility Sensor is to trigger a check on user scrolling, by checking this as true, it gives you the possibility to check if the element is in view even if it wasn't because of a user scrollintervalDelay
: (default1500
) 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
: (defaultfalse
) 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.
Special thanks to contributors:
- Andrew Hong
- Oleg Slobodskoi
- EugeneHlushko
- Stefan B
- Radu-Sebastian Amarie
- Roope Merikukka
- Christian Davis
- Anton Fedchenko
- Mateusz Burzyński
- Zak Linder
- Andarist
- Andy Edwards
- Bram Schulting
- Dan Abramov
- Daniel Stefanovic
- Eric Bower
- Julien Bachmann
- Neehar Venugopal
- Rubens Mariuzzo
- Tim Tyrrell
MIT