Skip to content

Instantly share code, notes, and snippets.

@tlux
Last active October 30, 2021 12:19
Show Gist options
  • Save tlux/6d4a53d19837c2b65ef7fe8f8a6ce23b to your computer and use it in GitHub Desktop.
Save tlux/6d4a53d19837c2b65ef7fe8f8a6ce23b to your computer and use it in GitHub Desktop.
Svelte Viewport Action
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
let eventType: string;
if (entry.isIntersecting) {
eventType = 'viewportenter';
} else {
eventType = 'viewportleave';
}
entry.target.dispatchEvent(new CustomEvent(eventType));
});
});
export default function viewport(element: Element) {
observer.observe(element);
return {
destroy() {
observer.unobserve(element);
},
};
}
// Usage:
//
// <div use:viewport on:viewportenter={...} on:viewportleave={...}>
// ...
// </div>
// TypeScript extension:
declare namespace svelte.JSX {
interface HTMLAttributes<T> {
onviewportenter: () => void
onviewportleave: () => void
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment