UNPKG

@thecoderzeus/scroll-reveal-fx

Version:

Uma suíte de animação de alta performance, modular e sem dependências, para criar interações ricas e elegantes baseadas no scroll e no mouse.

56 lines (48 loc) 2.16 kB
/** * applySkewReveal - Reveals elements with a subtle skew and slide that settles to normal. * * @param {object} [options={}] - Configuration options. * @param {string} [options.selector='.skew-reveal'] - CSS selector for elements to reveal. * @param {'x'|'y'} [options.axis='y'] - Axis to skew along. * @param {number} [options.angle=10] - Skew angle in degrees. * @param {number} [options.distance=20] - Initial translate distance in px. * @param {number} [options.duration=700] - Duration in ms. * @param {string} [options.easing='ease-out'] - CSS easing. * @param {boolean} [options.once=true] - Run only once. */ export function applySkewReveal(options = {}) { const defaults = { selector: '.skew-reveal', axis: 'y', angle: 10, distance: 20, duration: 700, easing: 'ease-out', once: true }; const config = { ...defaults, ...options }; const elements = document.querySelectorAll(config.selector); if (!elements.length) { console.warn(`applySkewReveal: No elements found with selector: "${config.selector}"`); return; } const skewProp = config.axis === 'x' ? 'skewX' : 'skewY'; const translate = config.axis === 'x' ? `translateX(${config.distance}px)` : `translateY(${config.distance}px)`; elements.forEach(el => { el.style.opacity = 0; el.style.transform = `${skewProp}(${config.angle}deg) ${translate}`; el.style.transition = `opacity ${config.duration}ms ${config.easing}, transform ${config.duration}ms ${config.easing}`; el.style.willChange = 'opacity, transform'; }); const observer = new IntersectionObserver((entries, observer) => { entries.forEach(entry => { if (entry.isIntersecting) { const el = entry.target; el.style.opacity = 1; el.style.transform = `${skewProp}(0deg) translate(0, 0)`; if (config.once) observer.unobserve(el); } }); }, { threshold: 0.1 }); elements.forEach(el => observer.observe(el)); }