Top ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋งจ ์๋ก ์ฌ๋ผ๊ฐ๋ ๊ฒ์ ๊ตฌํํด๋ดค์ต๋๋ค.
react-icons
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํด์ ์๋ฅผ ๊ฐ๋ฆฌํค๋ ํ์ดํ ์์ด์ฝ์ ๊ฐ์ ธ์๋ค. $yarn add react-icons
๊ฒ์๋ฐ์ arrow ์น๋ฉด ๊ต์ฅํ ๋ง์ด๋์ด ๐
๊ทธ์ค์์ ๋ง์ ๋๋ ํ์ดํ๋ฅผ ๊ณจ๋ผ์ ๊ฐ์ ธ๋ค ์ฐ๋ฉด ๋๋ค.
import { BsFillArrowUpCircleFill } from 'react-icons/bs'
์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด ๋๋๋ฐ ์์ด์ฝ๋ช
์๊ธ์๋ฅผ ๋ฐ์ from์๋ค ์ฐ๋ฉด ๋๋ค. ๋ด๊ฐ ์ ํํ ์์ด์ฝ์ ์๊ธ์๋ bs๋ผ react-icons/bs
๋ก ๋ถ๋ฌ์๋ค.
import styles from './TopButton.module.scss'
import { BsFillArrowUpCircleFill } from 'react-icons/bs'
export default function TopButton() {
// ๐ ํด๋ฆญ ์ ๋งจ ์๋ก ์ฌ๋ผ๊ฐ๋๋ก
const handleScroll = () => {
if (!window.scrollY) return
window.scrollTo({
top: 0,
behavior: 'smooth',
})
}
return (
<div className={styles.topBtn_wrap}>
<button className={styles.topBtn} onClick={handleScroll}>
<BsFillArrowUpCircleFill />
</button>
</div>
)
}
์ ๋ง ๊ฐ๊ฒฐํ ๋ก์ง์ผ๋ก ๊ตฌํํ ์ ์๋ค. ์ด์ ๋ฒํผ ํด๋ฆญํ๋ฉด ์ ์ฌ๋ผ๊ฐ๋ค.
์์
ํ๋ฉด์ ์ ์ผ ๊ณจ์น ์ํ ๋๊ฒ ์คํ์ผ์ด ์ ์ผ ๋นก์
๋ค..
๋๋ถ๋ถ ์์
์๋ค์ด position: fixed
๋ก ๊ตฌํ ํ ๊ฑธ ๋ดค๋๋ฐ, fixed๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ด ๊ธฐ์ค์ ์ ์ก์์ค์ผ๋ผ์ ์๊ฐ์น ๋ชปํ๋ ๋ฒ๊ทธ(?)๊ฐ ๋ฐ์ ๋๋ค. ์ด๋ค ๋ฌธ์ ๋๋ฉด ๋์ด ๊ธฐ์ค์ (950px) ๋๋ฌธ์ ์ด ๋ฒํผ์ ๋ถ๋ชจ ํ๊ทธ๋ก ๊ฐ์ธ ๋์ด ๊ธฐ์ค์ ์ ์ฃผ์ด์ ๋ค๋ฅธ ๋งํฌ๋ก ๋์ด ๊ฐ๊ณ ์ถ์ ๋ TOP ๋ฒํผ๊ณผ ๋์ผํ ์์น์ ์์ ๊ฒฝ์ฐ ๋งํฌ๊ฐ ์๋๋ฆฌ๋ ํ์๊ฐ์ ๋ฒ๊ทธ.. ๊ทธ๋์ ์ด๊ฑธ ๋ ํด๊ฒฐํ๊ธฐ ์ํด ๋ถ๋ชจ ํ๊ทธ๋ฅผ ์์ ๊ณ right๋ฅผ %๋ก ์ฃผ์๋ ๋ธ๋ผ์ฐ์ ์ฐฝ์ ์ค์ด๋ฉด ์ค์ผ์๋ก ๋ฒํผ์ด ๋ด๊ฐ ์ํ๋ ์์น๊ฐ ์๋ ๋ค๋ฅธ ์์น๋ก ๋๋ง๊ฐ๋ค. ์๋ฌดํผ ์ฌ๋ฌ ์ํ์ฐฉ์ค๋ฅผ ๊ฑฐ์น ๋ค ์ฌ๋ฌ ์์ ์ ํตํด ์ง์ง ์ฌํํ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ๋ค.
.topBtn_wrap {
position: sticky;
bottom: 70px;
float: right;
}
.topBtn {
font-size: 3.8rem;
color: #ffc949 !important;
}
position:sticky
๋ก ํด๋ ๋ฒํผ์ด ์คํฐํคํ๊ฒ ์ ๋ถ์ด ๋ฐ๋ผ๋ค๋๊ธฐ ๋๋ฌธ์ ์ด๊ฑธ ์ฌ์ฉํด์ float:right
๋ฅผ ํด์ ๋งจ ์ค๋ฅธ์ชฝ์ ์์นํ๋๋ก ํ๋ค. ์ด์ ๋ถ๋ชจํ๊ทธ์ ๊ธฐ์ค ๋๋น๊ฐ ์ก์ ํ์๋ ์๊ณ ๋ด๊ฐ ๊ฐ๊ณ ์ ํ๋ ๋งํฌ์ ๋์ผํ ์์น์ ์์ ๋ ๋งํฌ ํด๋ฆญ๋ ๊ฐ๋ฅํ๊ฒ ๋๋ค. ํด๊ฒฐ ์๋ฃ ๐
์คํฌ๋กค์ ๋ด๋ ธ์ ๋๋ง scroll to top ๋ฒํผ์ด ๋ ธ์ถ๋๊ฒ ํ๊ณ ์ถ์ผ๋ฉด ์๋์ ๊ฐ์ ์ฝ๋๋ก ์์ฑํ๋ฉด ๋๋ค.
import styles from './TopButton.module.scss'
import { useState, useEffect } from 'react'
import { BsFillArrowUpCircleFill } from 'react-icons/bs'
export default function TopButton() {
const [showButton, setShowButton] = useState<boolean>(false)
const handleScroll = () => {
if (!window.scrollY) return
window.scrollTo({
top: 0,
behavior: 'smooth',
})
}
useEffect(() => {
const handleShowButton = () => {
if (window.scrollY > window.innerHeight) {
setShowButton(true)
} else {
setShowButton(false)
}
}
window.addEventListener('scroll', handleShowButton)
return () => {
window.removeEventListener('scroll', handleShowButton)
}
}, [])
return (
<div className={styles.topBtn_wrap}>
{showButton && (
<button className={styles.topBtn} onClick={handleScroll}>
<BsFillArrowUpCircleFill />
</button>
)}
</div>
)
}