Fala mano, boa tarde. Eu acho esse efeito muito irado e repliquei no meu novo site pessoal que estou desenvolvendo.
A mágica toda quem faz é a lib de animação framer-motion:
Se você for ao código do Zeno vai ter esse cara: import { AnimateSharedLayout } from 'framer-motion';
Atualmente ele foi removido e basta vc usar o layoutId. https://www.framer.com/motion/guide-upgrade/#50
Aqui o exemplo do meu site usando o layoutId:
Github: https://github.com/yurimutti/yurimutti.com/blob/main/src/components/layouts/navbar/index.tsx Deploy: https://yurimutti-com.vercel.app/
JSX:
<S.Anchor onHoverStart={() => setHovered(page)}> {isHovered && ( <S.NavHovered layoutId="shape" initial={{ opacity: 0 }} animate={{ opacity: 1 }} exit={{ opacity: 0 }} /> )} {page} </S.Anchor>
Estilos para deixar ele atrás dos links:
export const Anchor = styled(motion.a, { position: 'relative', height: '40px', zIndex: 1, padding: '2 ′ ,color: ′ slate12', cursor: 'pointer',
color: '$slate1', }, });
export const NavHovered = styled(motion.span, { position: 'absolute', inset: 0, backgroundColor: 'slate6 ′ ,borderRadius: ′ default', zIndex: -1, });
Links úteis: https://codesandbox.io/s/framer-motion-2-animatesharedlayout-animate-between-different-components-dy0bv
Valeeu, yuri!! Sensacional.