Tilt parallax card
A layered 3D card response that moves foreground content slightly more than its surface.
[data-sc-effect="tilt-parallax-card"] { perspective: 900px; }
[data-sc-effect="tilt-parallax-card"] .sc-tilt-surface { transform: rotateX(var(--sc-rotate-x, 0deg)) rotateY(var(--sc-rotate-y, 0deg)); transition: transform 180ms ease; transform-style: preserve-3d; }
[data-sc-effect="tilt-parallax-card"] .sc-tilt-foreground { transform: translateZ(22px); }
@media (prefers-reduced-motion: reduce) { [data-sc-effect="tilt-parallax-card"] .sc-tilt-surface { transform: none; transition: none; } }
const tiltCards = document.querySelectorAll('[data-sc-effect="tilt-parallax-card"]');
tiltCards.forEach((card) => { const surface = card.querySelector('.sc-tilt-surface'); card.addEventListener('pointermove', (event) => { const box = card.getBoundingClientRect(); const x = (event.clientX - box.left) / box.width - .5; const y = (event.clientY - box.top) / box.height - .5; surface.style.setProperty('--sc-rotate-x', `${y * -8}deg`); surface.style.setProperty('--sc-rotate-y', `${x * 10}deg`); }); card.addEventListener('pointerleave', () => { surface.style.setProperty('--sc-rotate-x', '0deg'); surface.style.setProperty('--sc-rotate-y', '0deg'); }); });