-
[JS ํฌํธํด๋ฆฌ์ค ๋ง๋ค๊ธฐ] ํ์ด์ง ์๋จ์ผ๋ก ๋ฐ๋ก ์ด๋ํ๋ ๋ฒํผ ๋ง๋ค๊ธฐMini Projects/make Portfolio 2022. 3. 21. 20:58
2022.03.21
๐คโ ์คํฌ๋กค ํ ์๋จ์ผ๋ก ๋ฐ๋ก ์ด๋ํ ์ ์๋ ๋ฒํผ์ ๋ง๋ค์
์คํฌ๋กค์ ํ ํ ์๋จ์ผ๋ก ์ด๋ํ๊ณ ์ถ์ ๋, ๋ฐ๋ก ์ด๋ํ ์ ์๋ ๋ฒํผ์ ์ฐฝ ํ๋จ์ ๋ง๋๋ ค๊ณ ํ๋ค.
๐โ์๋์์ ํ์ธํด๋ณด์
1) ๋ฒํผ์ด ์ฐฝ ํ๋จ์ ๊ณ์ ์์นํ๋๋ก ๋ง๋ ๋ค.
(1) ์ถ๊ฐํ๋ ๋ฒํผ์ html ๊ฐ์ฅ ํ๋จ์ ์ ์ํด์ผํ๋ค.
- ๊ทธ๋ ์ง ์์ผ๋ฉด ํ์ด์ง ์ ์ฒด์ ํด๋น ๋ด์ฉ์ด ์ ์ฉ์ด ์๋๋ค.
<!-- arrow btn --> <button class="arrowBtn"> <i class="fa-solid fa-arrow-up"></i> </button> </body>
(2) ์๋จ์ผ๋ก ์ด๋ํ๋ ๋ฒํผ์ด ์คํฌ๋กค ๋์ด๋ ์ฐฝ ํ๋จ์ ๊ณ์ ์์นํ๋๋ก css๋ฅผ ์ด์ฉํ์ฌ ๋ง๋ค์๋ค.
/* arrow btn */ .arrowBtn { /*๋ชจ์์ ๋๊ทธ๋๊ฒ ๋ง๋ฌ*/ width: 50px; height: 50px; background-color: var(--color-pink); border-radius: 50%; margin-left: auto; /* ํ๋จ์ ๋ถ์ด์๋๋ก ๋ง๋ฆ */ display: flex; position: sticky; bottom: 20px; right: 20px; } .arrowBtn > i { margin: auto; text-align: center; font-size: var(--font-medium); color: var(--color-dark-gray); }
ํ๋จ์ ์์นํ๋๋ก position: sticky๋ฅผ ์ด์ฉํ๋ค.
์ฒ์์๋ ํท๊ฐ๋ ค์ fixed๋ฅผ ์ผ๋๋ฐ
2) ์ฒ์์ ์๋ณด์ด๋ค๊ฐ ์ผ์ ๋ถ๋ถ ์คํฌ๋กค ๋๋ฉด ๋ณด์ด๋๋ก ๋ง๋ค์
์ด๊ฑด ๋๊ฐ์ง๋ก ํํํ๋ค. ๋๋ฅผ ๋ ๋ง๋ค ํด๋์ค๋ฅผ ์ถ๊ฐํ๊ณ ์ ๊ฑฐํ๋ ๊ฒ๊ณผ opacity๊ฐ์ ๋ฐ๊พธ๋ ๊ฒ.
(1) classList.add / remove
//arrow btn const arrowBtn = document.querySelector('.arrowBtn'); document.addEventListener('scroll', () => { //ํ๋์ด์ ๋ฐ์ ๋ ์คํฌ๋ฆฐ์ด ์์นํ์ ๋, ์๋จ์ผ๋ก ์ฌ๋ผ๊ฐ๋ ๋ฒํผ์ ๋ณด์ด๋๋ก ๋ง๋ค์๋ค. if( homeHeight/2 < window.scrollY ) { arrowBtn.classList.add('visible'); } else { arrowBtn.classList.remove('visible'); } });
์ ์ผ ์ฒ์์ผ๋ก๋ HTML์์ ์ ์ํ ํด๋์ค๋ฅผ JS๋ก ๋ถ๋ฌ์จ๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋น ํ์ด์ง(document)์ ํ๋์ด์ ๋ฐ์ ๋ ์คํฌ๋ฆฐ์ด ์คํฌ๋กค ๋์ ๋,
์๋จ์ผ๋ก ์ด๋ํ๋ ๋ฒํผ์ 'visible'์ด๋ผ๋ ํด๋์ค๋ฅผ ์ถ๊ฐํ๊ณ
๊ทธ๋ ์ง ์์ผ๋ฉด 'visible'์ด๋ผ๋ ํด๋์ค๋ฅผ ์ ๊ฑฐํ๋๋ก ๋ง๋ ๋ค.
.arrowBtn.visible { ..... }
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์์ ์ ์ํ css์ html ์์์ ํด๋น ๋ฒํผ์ด visible์ผ ๋ ์กฐ๊ฑด์ด ์ ์ฉ๋๋๋ก ํด๋์ค๋ฅผ ์ถ๊ฐํด์ค๋ค.
(2) opacity
document.addEventListener('scroll', () => { if( homeHeight/2 < window.scrollY ) { arrowBtn.style.opacity = 1; } else { arrowBtn.style.opacity = 0; } })
1๋ฒ์์์ ๋์ผํ๋, ํด๋์ค๋ฅผ ๋ฃ๊ณ ๋นผ๋ ๋์ ์ ํฌ๋ช ๋๋ฅผ ๋ฐ๊ฟ์คฌ๋ค.
ํฌ๋ช ๋๋ฅผ ์กฐ์ ํด์ฃผ๋ ์กฐ๊ฑด์ css์์ ์ ์ฉํ ์๋ ์์์ง๋ง js๋ด์ css๋ฌธ๋ฒ์ ๋ฃ์ ๋ ์ด๋ ๊ฒ ๋ฃ๋๊ตฌ๋!๋ฅผ ์ฒดํ?ํด๋ณด๊ธฐ ์ํด ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ๊ตฌ์ฑํ๋ค.
.arrowBtn { .... opacity: 0; }
css์์ opacity๊ธฐ๋ณธ๊ฐ์ 0์ผ๋ก ์ค์ ํ์์ ์๋ณด์ด๋๋ก ๋ง๋ค์๋ค.
3) ๋ฒํผ์ด ๋ถ๋๋ฝ๊ฒ ๋ํ๋๋๋ก ๋ง๋ค๊ณ ์ถ๋ค.
๋ฒํผ์ด ๋ฟ ํ๊ณ ๋ํ๋ฌ๋ค๊ฐ ๋ฟ ํ๊ณ ์ฌ๋ผ์ง๋๊น ๋ญ๊ฐ ๋ถ๋๋ฝ๊ฒ ์ ๋๋ฉ์ด์ ์ด ๋ณด์ด๋๋ก ๋ง๋ค๊ณ ์ถ์ด์ก๋ค.
css์์ ์๋จ๋ฒํผ ํด๋์ค(arrowBtn)์๋ค๊ฐ transition ์ต์ ์ ๋ฃ์ด์คฌ๋ค.
arrowBtn { ... transition: all 200ms ease-in-out; ... }
2๋ฒ์์ 2๊ฐ์ง ๊ฒฝ์ฐ๋ก ์ฝ๋๋ฅผ ๋ง๋ค์๋๋ฐ
class๋ฅผ ์ถ๊ฐํ๋ฉด button ๋ชจ์์ด ์ฌ๊ฐํ์์ ์๋ชจ์์ผ๋ก ๋ฐ๋๋ ๊ฒ๋ ์ ๋๋ฉ์ด์ ์ผ๋ก ๋ณด์ฌ์ง๋ค. (์๋๋ฉด ์ฌ๊ฐํ button์ ๋๊ทธ๋ผ๋ฏธ๋ก ๋ง๋ค๊ธฐ ์ํด border๋ฅผ 50%๋ฅผ ์คฌ๊ธฐ ๋๋ฌธ)
ํ์ง๋ง opacity๋ก ํ๋ฉด ๋ชจ์๋ณํ์์ด ๋ฒํผ์ด ๋ํ๋๋ค.
๋ญ๊ฐ, ์ฌ๊ฐํ์์ ๋๊ทธ๋ผ๋ฏธ๋ก ๋ณํ๋ ๊ฒ๋ ๋ง์์ ๋๋ ๊ฒ ๊ฐ๋ค... ๋ผ๊ณ ์๊ฐํ๋๋ฐ ๋ค์ ๊ตฌ๋ํด๋ณด๋ opacity๊ฐ ๋ ์์ฐ์ค๋ฝ๊ณ ๊ด์ฐฎ์ ๊ฒ ๊ฐ๋ค.
4) ๋ฒํผ์ ๋๋ฅด๋ฉด ์๋จ์ผ๋ก ์ฌ๋ผ๊ฐ๋๋ก ๋ง๋ค์
arrowBtn.addEventListener('click', () => { window.scrollTo({ top: 0, behavior: "smooth" }) });
scrollTo๋ฅผ ์ด์ฉํ์ฌ ๋ฒํผ์ ๋๋ฅด๋ฉด top:0 ์ธ ๊ฐ์ผ๋ก ์ฌ๋ผ๊ฐ๋๋ก ๋ง๋ค์๋ค.
๊ฐ์๊ธฐ ๋ฟ ํ๊ณ ์ด๋ํ๋ฉด ๋นํฉ์ค๋ฌ์ฐ๋๊น ๋ถ๋๋ฝ๊ฒ ์ด๋ํ๋๋ก behavior๋ฅผ ๋ฃ์ด์ฃผ์๋ค.
5) ์์ฑ
๊ตณ ์์ฃผ ์ ์๋ํ๋ค.
๊ทธ๋ผ ๋ค์ ์คํ ์ผ๋ก ๋์ด๊ฐ๋ณด๋๋ก ํ์!
eunne's github: https://github.com/eunne/Project_Portfolio.git
'Mini Projects > make Portfolio' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ