Skip to content

Commit 0df8926

Browse files
committed
add backToTop component with animation
1 parent 442d3b0 commit 0df8926

File tree

3 files changed

+59
-5
lines changed

3 files changed

+59
-5
lines changed

src/components/BackToTop.tsx

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { faArrowCircleUp } from '@fortawesome/free-solid-svg-icons';
2+
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
3+
import { useEffect, useState } from 'react';
4+
5+
const BackToTop = () => {
6+
const [visible, setVisible] = useState(false);
7+
const [top, setTop] = useState(0);
8+
9+
const handleClick = () => {
10+
window.scrollTo({ top: 0, behavior: 'smooth' });
11+
};
12+
13+
useEffect(() => {
14+
const intersectionObserver = new IntersectionObserver(entries => {
15+
setTop(entries[0].boundingClientRect.top);
16+
if (top <= 0) {
17+
return setVisible(true);
18+
} else setVisible(false);
19+
});
20+
window.addEventListener('scroll', () => {
21+
intersectionObserver.observe(document.querySelectorAll('section')[1]);
22+
});
23+
}, [top]);
24+
25+
return (
26+
<div
27+
className="animate-slideLeft fixed bottom-6 right-0 z-50 w-14 rounded-l-full bg-red-500 shadow-lg"
28+
hidden={!visible}
29+
>
30+
<button
31+
onClick={handleClick}
32+
className="animate-fadeIn grid h-10 w-10 place-content-center rounded-full p-2 text-2xl text-white"
33+
>
34+
<FontAwesomeIcon icon={faArrowCircleUp} />
35+
</button>
36+
</div>
37+
);
38+
};
39+
40+
export default BackToTop;

src/routes/Home.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import BackToTop from '../components/BackToTop';
12
import Contact from '../components/Contact';
23
import Container from '../components/Container';
34
import Footer from '../components/Footer';
@@ -8,6 +9,7 @@ import RecentWork from '../components/RecentWork';
89
const Home = () => {
910
return (
1011
<>
12+
<BackToTop />
1113
<main className="bg-gray-50 dark:bg-dark-900">
1214
<section
1315
id="hero"

tailwind.config.js

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,25 @@ export default {
2121
},
2222
},
2323
animation: {
24-
'wiggly-motion': 'wiggle 3s linear infinite alternate',
24+
slideUp: 'slideUp 0.5s ease-in-out forwards',
25+
slideLeft: 'slideLeft 0.5s ease-in-out forwards',
26+
fadeIn: 'fadeIn 0.5s ease-in-out forwards',
2527
},
2628
keyframes: {
27-
wiggle: {
28-
'0%': { transform: 'translate(10px, 10px)' },
29-
'50%': { transform: 'translate(0)' },
30-
'100%': { transform: 'translate(-10px, -10px)' },
29+
slideUp: {
30+
'0%': { transform: 'translateY(100px) scale(0.8)' },
31+
'100%': { transform: 'translateY(0) scale(1)' },
32+
},
33+
slideLeft: {
34+
'0%': { transform: 'translateX(100px) scale(1.2, 1)' },
35+
'50%': { transform: 'translateX(0) scale(1.3, 1)' },
36+
'70%': { transform: 'translateX(0) scale(1.1, 1)' },
37+
'90%': { transform: 'translateX(0) scale(0.9, 1)' },
38+
'100%': { transform: 'translateX(0) scale(1)' },
39+
},
40+
fadeIn: {
41+
'0%': { opacity: 0 },
42+
'100%': { opacity: 1 },
3143
},
3244
},
3345
},

0 commit comments

Comments
 (0)