Creé un cursor personalizado y quiero cambiar su escala dinámicamente en movimientos rápidos. Es un cursor como este: Cuberto.com
Mi cursor: CodeSandBox
Cuando el cursor se mueve rápidamente hacia la derecha o hacia la izquierda, scaleX debería crecer y volverse más pequeño nuevamente. Cuando el cursor se mueve hacia arriba o hacia abajo, scaleY debería crecer y así sucesivamente...
Editar: Nuevo desafío - Obtener rotación en
¡Gracias a Terry, que logró este objetivo! Pero ahora tenemos un nuevo desafío. Si movemos el cursor en diagonal, el cursor todavía tiene que girar para obtener un resultado perfecto.
Yo dividiría la velocidad por '2'. Si ahora movemos el cursor en diagonal, podemos ver que falta la rotación para lograr el efecto deseado.
¿Alguien tiene alguna idea?
const scaleX = 1 + velocityX / 2; const scaleY = 1 + velocityY / 2;Para crear este efecto, aquí hay algunos pasos para lograrlo, comenzando desde el final:
scaleX() y scaleY() en transformaciones CSSMouseEvent )Con esta estrategia en mente, así es como podría hacerse:
data almacene en caché las coordenadas XY y la marca de tiempo anteriores Esto se puede hacer simplemente actualizando el objeto data :
data() { return { hideCursor: false, prevX: 0, prevY: 0, prevTimeStamp: 0, }; },mousemove : Necesitamos almacenar estos valores al final de la devolución de llamada de mousemove , y colocar el resto de nuestra lógica antes de eso (lo abordaremos más adelante).
document.addEventListener("mousemove", (e) => { // SOME LOGIC HERE // Update cached values this.prevX = e.pageX; this.prevY = e.pageY; this.prevTimeStamp = e.timeStamp; });Para calcular la velocidad en los ejes X e Y, debe calcular la diferencia absoluta entre los valores X/Y anteriores y actuales, y dividirlos por el tiempo transcurrido:
const deltaX = Math.abs(e.pageX - this.prevX); const deltaY = Math.abs(e.pageY - this.prevY); const deltaTime = e.timeStamp - this.prevTimeStamp; const velocityX = deltaX / deltaTime; const velocityY = deltaY / deltaTime;Esto se determina de manera completamente arbitraria y depende de usted . Para mí, dividir la velocidad calculada por 10 da un efecto que no encuentro demasiado discordante/abrupto y aún perceptible para el usuario. Es posible que sea necesario cambiar este valor en función del tamaño de píxel absoluto del cursor.
const scaleX = 1 + velocityX / 10; const scaleY = 1 + velocityY / 10; cursor.style.top = `${e.pageY}px`; cursor.style.left = `${e.pageX}px`; cursor.style.transform = `translate(-50%, -50%) scaleX(${scaleX}) scaleY(${scaleY})`;mouseout en la ventana gráficaEsto es para que el cursor no se atasque en un estado extraño cuando el mouse sale de la ventana gráfica:
document.addEventListener('mouseout', () => { cursor.style.transform = 'none'; });Vea un ejemplo actualizado basado en su CodeSandbox: