UNPKG

@vkm-js/animate

Version:

An Alpinejs to animate things with Intersection Observer.

47 lines (40 loc) 1.64 kB
export default function (Alpine) { Alpine.directive('animate', (el, { value, modifiers }) => { const animationTypes = ['fade', 'zoom', 'up', 'down']; // Determine animation type: from modifier or use 'fade' const type = modifiers.find(mod => animationTypes.includes(mod)) || 'fade'; // Determine duration: from modifier or directive value or fallback const modifierDuration = modifiers.find(mod => /^\d+$/.test(mod)); const duration = modifierDuration || value || '1000'; // Apply base transition el.style.transition = `all ${duration}ms ease`; // Initial state switch (type) { case 'fade': el.style.opacity = 0; break; case 'up': el.style.opacity = 0; el.style.transform = 'translateY(20px)'; break; case 'down': el.style.opacity = 0; el.style.transform = 'translateY(-50px)'; break; case 'zoom': el.style.opacity = 0; el.style.transform = 'scale(0.8)'; break; } // Intersect logic const observer = new IntersectionObserver(([entry]) => { if (entry.isIntersecting) { el.style.opacity = 1; if (type === 'up' || type === 'down') el.style.transform = 'translateY(0)'; if (type === 'zoom') el.style.transform = 'scale(1)'; observer.unobserve(el); } }, { threshold: 0.1 }); observer.observe(el); }); }