-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCustomCursor.js
More file actions
91 lines (77 loc) · 2.23 KB
/
CustomCursor.js
File metadata and controls
91 lines (77 loc) · 2.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import React, { useState, useEffect } from 'react';
const CustomCursor = () => {
const [cursorPos, setCursorPos] = useState({ x: 0, y: 0 });
const [isHovered, setIsHovered] = useState(false);
const handleMouseMove = (event) => {
const { clientX, clientY } = event;
setCursorPos({ x: clientX, y: clientY });
};
const handleMouseEnter = () => {
setIsHovered(true);
};
const handleMouseLeave = () => {
setIsHovered(false);
};
useEffect(() => {
window.addEventListener('mousemove', handleMouseMove);
return () => {
window.removeEventListener('mousemove', handleMouseMove);
};
}, []);
useEffect(() => {
const handleElementEnter = () => {
setIsHovered(true);
};
const handleElementLeave = () => {
setIsHovered(false);
};
const elements = document.querySelectorAll('button, a');
elements.forEach((element) => {
element.addEventListener('mouseenter', handleElementEnter);
element.addEventListener('mouseleave', handleElementLeave);
element.style.cursor = 'none';
});
return () => {
elements.forEach((element) => {
element.removeEventListener('mouseenter', handleElementEnter);
element.removeEventListener('mouseleave', handleElementLeave);
element.style.cursor = 'auto';
});
};
}, []);
const cursorSize = isHovered ? 60 : 40;
const cursorStyle = {
position: 'fixed',
top: cursorPos.y - cursorSize / 2,
left: cursorPos.x - cursorSize / 2,
width: cursorSize,
height: cursorSize,
borderRadius: '50%',
border: '2px solid #63cccb',
backgroundImage: `radial-gradient(circle, #63cccb 20%, transparent 80%)`,
pointerEvents: 'none',
zIndex: 9999,
transition: 'width 0.2s ease, height 0.2s ease',
transform: isHovered ? 'scale(1.1)' : 'scale(1)',
};
const dotStyle = {
width: '8px',
height: '8px',
borderRadius: '50%',
backgroundColor: 'black',
position: 'absolute',
top: '50%',
left: '50%',
transform: 'translate(-50%, -50%)',
};
return (
<div
style={cursorStyle}
onMouseEnter={handleMouseEnter}
onMouseLeave={handleMouseLeave}
>
<div style={dotStyle}></div>
</div>
);
};
export default CustomCursor;