es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Dibuja un camino punteado utilizando Framer Motion en React.

Estoy tratando de dibujar una trayectoria discontinua, o al menos dar esa ilusión, usando Framer Motion. Piensa en animar una trayectoria de pies en un mapa del tesoro. Animar la longitud de la trayectoria parece ser un método común, y por eso lo he implementado de la siguiente manera.

<motion.span initial="{{" pathlength:="" 0="" }}="" animate="{{" pathlength:="" 1="" }}="" d="...una lista de coordenadas" stroke="#000" strokewidth="5" strokedasharray="8"></motion.span>

Pero parece que animar la longitud de la trayectoria no funciona bien con strokeDasharray. Cuando agrego el valor de strokeDasharray usando el atributo, la longitud de la trayectoria se anima pero el valor de strokeDasharray, al inspeccionarlo, muestra 2000px en lugar de 8px. Y cuando agrego strokeDasharray usando CSS o estilos en línea, la trayectoria tiene un patrón discontinuo correcto, pero la animación no funciona.

Según lo que he leído, strokeDasharray utiliza la longitud de la trayectoria cuando realiza sus cálculos, por lo que supongo que el valor inicial “0” está causando problemas. Puede que esté muy alejado de la solución. No lo sé.

¿Hay una solución sencilla aquí? ¿O debería evaluar cómo hacer la animación de otra manera? ¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución para animar una ruta discontinua en Framer Motion

    La animación de una ruta discontinua utilizando Framer Motion puede dar la ilusión de un sendero en un mapa del tesoro. Sin embargo, el método común de animar la longitud de la ruta puede no funcionar bien con el atributo strokeDasharray. Hay dos enfoques para resolver este problema:

    1. Uso del método calcPathLength
      Se puede utilizar el método calcPathLength de SVG para calcular la longitud total de la ruta y establecerlo como atributo strokeDasharray. Luego, se anima el atributo strokeDashoffset para dar la ilusión de una ruta discontinua. El código se vería así:
    import { motion } from "framer-motion";
    
    const RutaAnimada = () => {
      const pathRef = useRef(null);
      const pathLength = useSpring(0, { from: 0, to: 1 });
    
      useEffect(() => {
        const totalLength = pathRef.current.getTotalLength();
        pathLength.set(totalLength);
      }, []);
    
      return (
        <motion.path ref="{pathRef}" stroke="#000" strokewidth="5" strokelinecap="round" strokedasharray="{`${pathLength}" ${pathlength}`}="" strokedashoffset="{pathLength.to((value)" ==""> -value)}
          d="...una lista de coordenadas"
          initial={{ strokeDashoffset: pathLength }}
          animate={{ strokeDashoffset: 0 }}
          transition={{ duration: 2 }}
        />
      )
    }
    
    

    Observa el uso de useRef y useEffect para obtener la totalLength de la ruta y establecerla en la variable pathLength. Además, se utiliza useSpring de react-spring para animar el valor de pathLength y el atributo strokeDashoffset.

    1. Uso de SVGPathElement.getTotalLength
      Alternativamente, se puede obtener la longitud total de la ruta utilizando el método getTotalLength del SVGPathElement. Luego, se establece el atributo strokeDasharray utilizando un valor calculado y se anima el atributo strokeDashoffset como antes. El código se vería así:
    import { motion, useMotionValue, useTransform } from "framer-motion";
    
    const RutaAnimada = () => {
      const pathRef = useRef(null);
      const pathLength = useMotionValue(0);
      const dashArray = useTransform(pathLength, (value) => `${value} ${value}`);
    
      useEffect(() => {
        const totalLength = pathRef.current.getTotalLength();
        pathLength.set(totalLength);
      }, []);
    
      return (
        <motion.path ref="{pathRef}" stroke="#000" strokewidth="5" strokelinecap="round" strokedasharray="{dashArray}" strokedashoffset="{pathLength.to((value)" ==""> -value)}
          d="...una lista de coordenadas"
          initial={{ strokeDashoffset: pathLength }}
          animate={{ strokeDashoffset: 0 }}
          transition={{ duration: 2 }}
        />
      )
    }
    
    

    Observa el uso de useMotionValue y useTransform de framer-motion para establecer el valor de dashArray y animar los atributos pathLength y strokeDashoffset.

    Cualquiera de los enfoques debería dar el resultado deseado de animar una ruta discontinua en Framer Motion.</motion.path></motion.path>

Comments are closed.