Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

303
Visualizações
Personalice el puntero del cursor usando un componente de reacción

Estoy tratando de personalizar el puntero del cursor, así que usé un gancho para obtener la posición del mouse y luego coloqué el componente en absoluto en esas coordenadas.

Aquí un código de trabajo.

Hay un indicador ( USE_PNG ) que puede alternar para probar si usar un componente React o un png (preferiría la primera idea, pero también me interesa la segunda si tiene algunas ventajas).

  • USE_PNG = false -> usar un componente React

    Como puedes ver, el código es muy simple y funciona bastante pero tiene algunos problemas:

    1. cuando el mouse está en el lado izquierdo de la ventana, la mitad izquierda del cursor se corta, pero cuando está en el lado derecho, no lo está y aparece la barra horizontal
    2. parece que no es tan fluido. ¿Hay algunos trucos que pueda usar para optimizar el código?
  • USE_PNG = true -> usar un png

    También intenté usar un png (quizás más simple) pero ya no puedo ver el cursor

¿Cuál es el problema?


Uso una referencia en lugar de un estado y el rendimiento ha mejorado. El primer problema permanece: el desplazamiento horizontal y vertical cuando el cursor está en el lado derecho o inferior de la ventana.

ingrese la descripción de la imagen aquí


No creo que simplemente ocultar las barras de desplazamiento sea una solución óptima porque el tamaño de la ventana ha cambiado y el usuario puede desplazarse. Creo que tenemos que encontrar una solución más limpia.

ingrese la descripción de la imagen aquí

about 4 years ago · Juan Pablo Isaza
3 Respostas
Responde à pergunta

0

Parpadeando:

#01:

Simplemente introduzca un estilo de transición en el componente Cursor, por ejemplo, transition: "all 50ms" . Hace que el cambio de posición sea mucho más suave y cancela el parpadeo.

#02:

Sin embargo, como Guy mencionó anteriormente, manejar la posición del cursor en un estado significa una gran cantidad de renderizado para su componente, lo que hace que su aplicación sea más lenta al final.

Recomiendo hacer una ref para el cursor y actualizarla directamente desde un detector de eventos. Con ese cambio, incluso puede eliminar el gancho useMouse :

 const App = () => { const containerNodeRef = useRef(null); const cursorRef = useRef(null) const updateMouse = (e) => { // you can directly access the mouse's position in `e` // you don't even need the useMouse hook cursorRef.current.style.top = `${ey - SIZE / 2}px` cursorRef.current.style.left = `${ex - SIZE / 2}px` } useEffect(() => { window.addEventListener('mousemove', updateMouse) return () => { window.removeEventListener('mousemove', updateMouse) } }) return ( <div ref={containerNodeRef} style={{ width: window.innerWidth, height: window.innerHeight, display: "flex", flexDirection: "column", justifyContent: "center", alignItems: "center", cursor: 'none' }} > <Cursor ref={cursorRef} /> <h1>Hello CodeSandbox</h1> <h2>Start editing to see some magic happen!</h2> </div> ); } const Cursor = forwardRef(({ size = SIZE }, ref) => ( <div ref={ref} style={{ position: "absolute", width: size, height: size, backgroundColor: "black", color: "white", fontWeight: "bold", display: "flex", justifyContent: "center", alignItems: "center" }}> Hello </div> ) )

Problema de corte:

Dado que se está moviendo alrededor de un div real como su cursor, cuando alcanza el borde de su document , lo estira para hacer que el div encaje -> es por eso que el documento ya no cabe en su ventana, por lo que se representan las barras de desplazamiento .

Puedes arreglarlo a través de css:

 body { overflow: hidden }

+1:

No estoy seguro de cómo debe verse el cursor al final, pero si fuera una imagen, hay otra solución posible. Agregue esta regla css a su contenedor, que carga una imagen como un cursor y luego el navegador se encarga de la representación automáticamente:

 <div ref={containerNodeRef} style={{ // ... cursor: 'url("url"), auto' }} >

Si usara esta solución, ya no necesitaría todo el componente Cursor ni el cálculo de la posición. Sin embargo, la desventaja es que solo funciona con imágenes.

about 4 years ago · Juan Pablo Isaza Relatório

0

Editar: cuerpo desbordado (también conocido como tercer problema)

si agregará esto a su etiqueta de cuerpo, debería resolverlo:

 margin: 0; height: 100%; overflow: hidden

editar - Con respecto a su segundo problema

para evitar que aparezcan las barras de desplazamiento, puede usar overflow-y: hidden; (para deshabilitar en el eje x, simplemente cambie overflow-y a overflow-x , overflow: hidden; para ambos)

PERO si desea habilitar el desplazamiento pero simplemente ocultar la barra de desplazamiento, use el siguiente código:

 /* hide scrollbar but allow scrolling */ body { -ms-overflow-style: none; /* for Internet Explorer, Edge */ scrollbar-width: none; /* for Firefox */ overflow-y: scroll; } body::-webkit-scrollbar { display: none; /* for Chrome, Safari, and Opera */ }

aquí hay un gif de un ejemplo de trabajo en mi navegador: https://imgur.com/a/wOV7car


No se corta para mí en el lado derecho (ver imagen a continuación). Parece que el segundo problema ocurre porque su cursor se vuelve a renderizar cada vez que lo mueve, ¡y eso es mucho trabajo para su sitio!

debe eliminar los atributos de estilo del componente Cursor y ajustar el código dentro de su detector de eventos para un evento de movimiento del mouse. se verá así:

 onMouseMove = {e => { const cursor = document.querySelector('.cursor') cursor.style.top = ׳${e.pageY}px׳ cursor.style.left = ׳${e.pageX}px׳ }}

no ser cortado

about 4 years ago · Juan Pablo Isaza Relatório

0

Ya hay 2 buenas respuestas, pero también agregaré esta, porque otras respuestas complican demasiado la solución.

  1. Parpadeando

no importa si usa ref o estado, solo debe extraer el cursor para separar el Componente, de esa manera su componente de la aplicación no se volverá a procesar

  1. Barras de desplazamiento

como se mencionó en otras respuestas, usando body { overflow: hidden; } resolverá este problema, pero parcialmente. Su cursor está tratando de ir más allá del tamaño de la página, por lo tanto, la página muestra barras de desplazamiento, agregar una limitación para la posición del cursor resolverá esto: cursor.y = Math.max(0, Math.min(currentPositionY, page.width)) (pseudocódigo ) ahora cursor.y no excederá 0 o page.width

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda