Skip to content

Commit 77d4d92

Browse files
committed
changed animation of the navbar
1 parent 828b8c9 commit 77d4d92

File tree

2 files changed

+70
-22
lines changed

2 files changed

+70
-22
lines changed

src/components/Navbar.jsx

Lines changed: 44 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React, { useState, useEffect } from 'react';
22

33
const Navbar = ({ onToggle }) => {
44
const [isOpen, setIsOpen] = useState(false);
5+
const [hoveredItem, setHoveredItem] = useState(null);
56

67
const handleMouseEnter = () => {
78
setIsOpen(true);
@@ -11,35 +12,53 @@ const Navbar = ({ onToggle }) => {
1112
const handleMouseLeave = () => {
1213
setIsOpen(false);
1314
onToggle(false);
15+
setHoveredItem(null); // Reset hovered item on mouse leave
1416
};
1517

16-
useEffect(() => {
17-
const handleResize = () => {
18-
if (window.innerWidth >= 600) {
19-
setIsOpen(false);
20-
onToggle(false);
21-
}
22-
};
23-
24-
window.addEventListener('resize', handleResize);
18+
const handleItemHover = (item) => {
19+
setHoveredItem(item);
20+
};
2521

26-
return () => {
27-
window.removeEventListener('resize', handleResize);
28-
};
29-
}, []);
22+
const handleItemLeave = () => {
23+
setHoveredItem(null);
24+
};
3025

3126
const smoothScroll = (targetId) => {
3227
const targetElement = document.getElementById(targetId);
3328
if (targetElement) {
3429
const offsetTop = targetElement.getBoundingClientRect().top + window.pageYOffset;
35-
3630
window.scrollTo({
3731
top: offsetTop,
3832
behavior: 'smooth',
3933
});
4034
}
4135
};
4236

37+
// Helper function to render animated text
38+
const renderAnimatedText = (item, text, shortText) => {
39+
return (
40+
<span className="inline-block overflow-hidden">
41+
{isOpen ? (
42+
<span className="flex">
43+
{text.split('').map((letter, index) => (
44+
<span
45+
key={index}
46+
className={`letter ${
47+
hoveredItem === item ? 'animate-letter' : ''
48+
}`}
49+
style={{ animationDelay: `${index * 0.1}s` }}
50+
>
51+
{letter}
52+
</span>
53+
))}
54+
</span>
55+
) : (
56+
shortText
57+
)}
58+
</span>
59+
);
60+
};
61+
4362
return (
4463
<nav
4564
className={`fixed top-1/2 right-0 w-16 sm:w-32 h-[300px] bg-gray-800 bg-opacity-70 text-white transition-all duration-300 transform -translate-y-1/2 ${
@@ -58,11 +77,13 @@ const Navbar = ({ onToggle }) => {
5877
href="#"
5978
className="hover:text-blue-400 whitespace-nowrap text-shadow-lg"
6079
onClick={(e) => {
61-
e.preventDefault();
80+
e.preventDefault();
6281
smoothScroll('hero');
6382
}}
83+
onMouseEnter={() => handleItemHover('home')}
84+
onMouseLeave={handleItemLeave}
6485
>
65-
{isOpen ? 'Home' : 'H'}
86+
{renderAnimatedText('home', 'Home', 'H')}
6687
</a>
6788
</li>
6889
<li className="mb-4">
@@ -71,10 +92,12 @@ const Navbar = ({ onToggle }) => {
7192
className="hover:text-blue-400 whitespace-nowrap text-shadow-lg"
7293
onClick={(e) => {
7394
e.preventDefault();
74-
smoothScroll('portfolio');
95+
smoothScroll('portfolio');
7596
}}
97+
onMouseEnter={() => handleItemHover('projects')}
98+
onMouseLeave={handleItemLeave}
7699
>
77-
{isOpen ? 'Projects' : 'P'}
100+
{renderAnimatedText('projects', 'Projects', 'P')}
78101
</a>
79102
</li>
80103
<li>
@@ -85,8 +108,10 @@ const Navbar = ({ onToggle }) => {
85108
e.preventDefault();
86109
smoothScroll('contact');
87110
}}
111+
onMouseEnter={() => handleItemHover('contact')}
112+
onMouseLeave={handleItemLeave}
88113
>
89-
{isOpen ? 'Contact' : 'C'}
114+
{renderAnimatedText('contact', 'Contact', 'C')}
90115
</a>
91116
</li>
92117
</ul>

src/styles.css

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,13 @@ nav {
3030
background-color: rgba(44, 44, 44, 0.85);
3131
position: fixed;
3232
top: 50%;
33-
right: 0;
33+
right: 10%;
3434
transform: translateY(-50%);
3535
border-radius: 9999px;
3636
height: 300px;
3737
width: 60px;
3838
transition: width 0.3s ease, background-color 0.3s ease, opacity 0.3s ease;
3939
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
40-
border: 2px solid white;
4140
}
4241

4342
/* Apply frosted glass effect when the navbar is open */
@@ -115,12 +114,36 @@ nav ul li a.text-shadow-lg {
115114
background-color: var(--light-gray); /* Light gray line */
116115
opacity: 0.3; /* Make the line subtle */
117116
}
117+
/* Letter animation */
118+
/* Letter animation */
119+
.letter {
120+
display: inline-block;
121+
opacity: 1; /* Ensure letters are always visible */
122+
transform: translateY(0); /* Reset transform */
123+
transition: opacity 0.3s ease, transform 0.3s ease;
124+
}
125+
126+
.animate-letter {
127+
opacity: 1;
128+
transform: translateY(0);
129+
animation: fadeInUp 0.3s ease forwards;
130+
}
118131

132+
@keyframes fadeInUp {
133+
0% {
134+
opacity: 0;
135+
transform: translateY(20px);
136+
}
137+
100% {
138+
opacity: 1;
139+
transform: translateY(0);
140+
}
141+
}
119142
/* Hero Section Styles */
120143
.hero {
121144
flex: 1;
122145
text-align: right; /* Align text to the right (right-to-left) */
123-
padding-right: 20px; /* Add padding to avoid overlap with the line */
146+
padding-right: 0px; /* Add padding to avoid overlap with the line */
124147
}
125148

126149
.hero h1 {

0 commit comments

Comments
 (0)