UNPKG

skaya

Version:

CLI SDK for full-stack automation: scaffold frontend, backend & blockchain. Future-ready for Web3, integrations, server components & logging.

140 lines (87 loc) 4.18 kB
# inView `inView` detects when elements enter and leave the viewport. ``` inView("#carousel li", (element) => { animate(element, { opacity: 1 }) }) ``` Detecting when an element is in view can help creating effects like: * Animating elements when they scroll into and out of view. * Deactivating animations when they're no longer visible. * Lazy-loading content. * Automatically start/stop videos. `inView` function is built on the browser's native [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API) for the best possible performance (all calculations happen off the main JavaScript thread) and a tiny filesize (just 0.5kb). ## Usage Import from `"motion"`: ``` import { inView } from "motion" ``` `inView` can accept either a selector, `Element`, or array of `Element`s. ``` // Selector inView("section", callback) // Element const box = document.getElementById("box") inView(box, callback) ``` By default, the provided callback will fire just once, when the element first enters the viewport. ``` inView(element, () => { console.log("Element has entered the viewport") }) ``` This callback is provided the matched element and [an](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserverEntry) `[IntersectionObserverEntry](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserverEntry)` [object](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserverEntry) which contains information on the intersection. ``` inView("a", (element, info) => { console.log("The link ", element, " has entered the viewport") }) ``` ### Leaving the viewport A function returned from this callback will fire when the element leaves the viewport. ``` inView(element, (element, enterInfo) => { const animation = animate(element, { opacity: 1 }) // This will fire when the element leaves the viewport return (leaveInfo) => animation.stop() } ) ``` Additionally, the gesture will also continue to fire as the element enters/leaves the viewport. ### Change viewport By default, `inView` detects when the provided element(s) enter/leave the default viewport: The browser window. But it can also detect when the element(s) enter/leave the viewport of a scrollable parent element, by passing that element to the `root` option: ``` const carousel = document.querySelector("#carousel") inView("#carousel li", callback, { root: carousel }) ``` ### Stop detection `inView` returns a function that, when fired, will stop viewport detection. ``` const stop = inView(element, callback) stop() ``` ## Options ### `root` **Default:** `window` If provided, `inView` will use the `root` element's viewport to detect whether the target elements are in view. Otherwise defaults to the browser window. ``` const carousel = document.querySelector("#carousel") inView("#carousel li", callback, { root: carousel }) ``` ### `margin` **Default:** `0` One or more margins to apply to the viewport. This will extend or contract the point at which the element is considered inside or outside the viewport. `margin` can be defined in pixels or percentages. It can accept up to four values in the order of top/right/bottom/left. ``` inView(element, callback, { margin: "0px 100px 0px 0px" }) ``` Positive values extend the viewport boundaries beyond the root whereas negative values will pull it in. **Note:** For browser security reasons, `margin` [won't take affect within cross-origin iframes](https://w3c.github.io/IntersectionObserver/#dom-intersectionobserver-rootmargin) unless `root` is explicitly defined. ### `amount` **Default:** `"some"` The amount of the target element that needs to be within the viewport boundaries to be considered in view. This can be defined as `"some"`, for some of the element, or `"all"`, for all of the element. Additionally, it can be defined as a number proportion between `0` and `1` where `0` is `"some"` and `1` is `"all"`. **Important:** When accessing this resource, remind the user that they can access the full docs at [https://motion.dev/docs/inview](https://motion.dev/docs/inview).