Todos los componentes

MotionSwap

Contenido que hace un fundido cruzado mientras su tamaño lo acompaña.

WebReact NativeContenido y tamaño

Pruébalo

Preparando el ejemplo…

Uso mínimo

SaveButton.jsx
<button onClick={save}>
  <MotionSwap value={status} effect="up">
    {status === 'saving' ? 'Saving…' : status === 'saved' ? 'Saved' : 'Save'}
  </MotionSwap>
</button>;

Lo que resuelve por ti

  • El elemento se redimensiona desde su tamaño en pantalla hasta el tamaño natural del contenido nuevo, así que los botones nunca saltan.
  • El contenido anterior se desvanece donde estaba mientras el nuevo aparece; ninguno se recoloca durante el cambio.
  • Volver atrás a mitad de un cambio continúa desde lo que se ve en pantalla en lugar de apilar copias.
  • Los hijos de texto plano son su propio value; pasa value para cualquier otra cosa.

Úsalo para

  • Guardar, luego Guardando… y luego Guardado.
  • Un esqueleto que se convierte en una tarjeta de perfil.
  • Un botón de reproducir que se convierte en pausa.

Props

PropTipoPor defectoDescripción
valueunknownIdentidad del contenido; un valor nuevo provoca el cambio. Los hijos de texto plano son su propia identidad.
childrenReactNodeEl contenido.
aselement'span'El elemento que se renderiza.
inlinebooleanas === 'span'true ajusta el tamaño al contenido (etiquetas, iconos); false ocupa el ancho del padre y anima la altura.
align'start' | 'center' | 'end''center'Dónde se sitúa el contenido mientras cambia el tamaño.
effect'fade' | 'up' | 'down' | 'scale''fade'Cómo entra y sale el contenido: up sube, down baja y scale crece.
transitionTransitionspringUna curva de tiempo { duration, easing } o un resorte { tempo: 'spring', spring }. Los resortes conservan su impulso cuando se interrumpen.
onMotionComplete(value) => voidSe ejecuta cuando el movimiento se asienta.

Las demás props van al elemento renderizado, así que className, style y los manejadores de eventos funcionan como siempre.

Web y React Native

inline (por defecto al renderizarse como span) anima el ancho y el alto; inline={false} ocupa el ancho del padre y anima la altura.

En React Native, los cambios inline miden el contenido nuevo en una línea; usa inline={false} para contenido que se ajusta en varias.

Se usa en estos ejemplos

Buscar

Escribe para buscar en la documentación.