[๊ณผ์ œ] ์ž๊ธฐ์†Œ๊ฐœ ํŽ˜์ด์ง€ ์ œ์ž‘
elice/WIL

[๊ณผ์ œ] ์ž๊ธฐ์†Œ๊ฐœ ํŽ˜์ด์ง€ ์ œ์ž‘

2์ฃผ์ฐจ ๋งˆ์ง€๋ง‰ ๋‚ ์˜ ๊ณผ์ œ๋กœ HTML, CSS, JavaScript๋ฅผ ์ด์šฉํ•ด์„œ ์ž๊ธฐ์†Œ๊ฐœ ํŽ˜์ด์ง€๋ฅผ ์ œ์ž‘ํ•˜๋Š” ๊ณผ์ œ๊ฐ€ ์ฃผ์–ด์กŒ๋‹ค.

๋ฉ‹์‚ฌ์—์„œ ํ™œ๋™ํ–ˆ์„ ๋•Œ๋„ HTML/CSS๋ฅผ ๋ฐฐ์šฐ๊ณ  ๊ฐ€๋ณ๊ฒŒ ์ž๊ธฐ์†Œ๊ฐœ ํŽ˜์ด์ง€ ์ œ์ž‘ ๊ณผ์ œ๋ฅผ ํ–ˆ์—ˆ๋Š”๋ฐ, ํ™•์‹คํžˆ ๊ทธ ๋•Œ๋ณด๋‹ค ์ด๋Ÿฐ์ €๋Ÿฐ ์š”์†Œ๋“ค์„ ์ œ๋ฒ• ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๊ฒƒ์„ ๋А๊ผˆ๋‹ค.

๊ทธ ๋•Œ ๊ฐ™์ด ํ™œ๋™ํ–ˆ๋˜ ๋™์•„๋ฆฌ์› ์ค‘, ์›น ํ™”๋ฉด์— ํŽ˜์ด์ง€๋ฅผ ๊ฝ‰ ์ฑ„์›Œ์„œ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋“ค์„ ์Šคํฌ๋กค ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ œ์ž‘ํ•˜์‹  ๋ถ„์ด ๊ณ„์…จ๋Š”๋ฐ, ๋‹น์‹œ ์›น ๊ฐœ๋ฐœ ํ–‡๋ณ‘์•„๋ฆฌ์˜€๋˜ ๋‚˜๋Š” ๊ทธ๋Ÿฐ ์‹ ์„ธ๊ณ„(?) ๋””์ž์ธ์€ ์ฒ˜์Œ ์ ‘ํ•ด๋ดค์—ˆ๊ณ  ๋‹ค์Œ์— ํ•œ ๋ฒˆ ์ €๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด ๋ณด๊ณ ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ์—ˆ๋‹ค.

๊ทธ ์™ธ์—๋„ ๋Šฅ๋ ฅ์ด ๋ถ€์กฑํ•ด์„œ ํ•ด๋ณด๊ณ ๋Š” ์‹ถ์ง€๋งŒ ๊ตฌํ˜„์„ ๋ชปํ–ˆ๋˜ ๊ฒƒ๋“ค์ด ๋งŽ์•˜์–ด์„œ, ์ด๋ฒˆ ๊ณผ์ œ์˜ ํŽ˜์ด์ง€ ๋””์ž์ธ์€ ๋‹น์‹œ๋ฅผ ํšŒ์ƒํ•˜๋ฉด์„œ ํ–ˆ๋‹ค.

๊ณผ์ œ์˜ ์ฃผ์ œ๊ฐ€ ํ•„์ˆ˜ ๋‚ด์šฉ๋“ค์„ ์‚ฝ์ž…ํ•˜๋˜, ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด HTML/CSS, JavaScript๋ฅผ ํ™œ์šฉํ•ด์„œ ์ž์‹ ์„ ์†Œ๊ฐœํ•˜๋Š” ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ„๋‹จํ•˜๊ฒŒ JavaScript๋ฅผ ์‘์šฉํ•ด๋ณด๋Š” ํŽ˜์ด์ง€๋„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

navbar๋Š” ์œ„์น˜๋ฅผ ๊ณ ์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ position: relative / absolute๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ๋˜ ul๊ณผ li๋ฅผ ์ด์šฉํ•ด์„œ ํƒญ์„ ๋งŒ๋“ค์—ˆ๊ณ , flex ์†์„ฑ์„ ํ†ตํ•ด ๊ฐ€๋กœ์ •๋ ฌ์„ ํ•ด์คฌ๋‹ค. ๊ฐ li๋Š” ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ…์ŠคํŠธ๋ฅผ aํƒœ๊ทธ๋กœ ๊ฐ์ŒŒ๋‹ค.

<ul>
	<li><a href="" class="menu1" onclick="location.replace(location.href);"><span>HOME</span></a></li>
	<li><a href="#section2" class="menu2"><span>ABOUT</span></a></li>
	<li><a href="#section3" class="menu3"><span>INTEREST</span></a></li>
	<li><a href="#section4" class="menu4"><span>GOAL</span></a></li>
	<li><a href="#section5" class="menu5"><span>FAVORITE</span></a></li>
	<li><a href="#section6" class="menu6"><span>CHANGE</span></a></li>
	<li><a href="#section7" class="menu7"><span>END</span></a></li>
</ul>

๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ๋ฐฉ์‹์€ html์˜ aํƒœ๊ทธ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ๋ฐฉ์‹์ธ๋ฐ, ์ง€๊ธˆ ๋ณด๋‹ˆ JavaScript window ๊ฐ์ฒด์˜ scrollTo ๋ฉ”์„œ๋“œ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ๊ตฌํ˜„ํ•ด ๋ณด์•˜๋‹ค๋ฉด ๋” ์ข‹์ง€ ์•Š์•˜์„๊นŒ ํ•˜๋Š” ์•„์‰ฌ์›€์ด ๋“ ๋‹ค.

 

๋ฉ”์ธ ํŽ˜์ด์ง€์˜ ํƒ€์ดํ•‘ ํšจ๊ณผ๋Š” JavaScript์˜ innerHTML์„ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ–ˆ๋‹ค. ์ด ๋ธ”๋กœ๊ทธ์˜ ๊ธ€์„ ์ฐธ๊ณ ํ–ˆ๊ณ , ์ •๋ง ๋งŽ์€ ๋„์›€์ด ๋˜์—ˆ๋‹ค!

const content = "Welcome!";
const text = document.querySelector(".welcome");
let i = 0;

function typing() {
  if (i < content.length) {
    let txt = content.charAt(i);
    text.innerHTML += txt;
    i++;
  }
}
setInterval(typing, 300)

 

๊ทธ๋ฆฌ๊ณ  ๊ฐ ํŽ˜์ด์ง€๋ฅผ ์Šคํฌ๋กคํ•˜๋ฉฐ ์ด๋™ํ•  ๋•Œ, Scroll snap์„ ์ด์šฉํ•ด์„œ ์ผ์ • ๋ถ€๋ถ„ ์ด์ƒ์ด ์Šคํฌ๋กค๋˜๋ฉด ๋‹ค์Œ ํŽ˜์ด์ง€๊ฐ€ ์ž๋™์œผ๋กœ ํ™”๋ฉด ์ƒ๋‹จ์œผ๋กœ ์Šค๋ƒ…๋˜๋Š” ํšจ๊ณผ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค.

.container {
  width: 100%;
  height: 100vh;
  overflow: auto;
  scroll-behavior: smooth;
  scroll-snap-type: y mandatory;
}

.section {
  position: relative;
  height: 100vh;
  scroll-snap-align: start;
  background-color: #ffecb3;
}

 

๊ฐ ํŽ˜์ด์ง€ ์˜ค๋ฅธ์ชฝ ํ•˜๋‹จ์—๋Š” scroll back to top ๋ฒ„ํŠผ์„ ์ƒ์„ฑํ•ด์„œ, ์–ด๋А ํŽ˜์ด์ง€์—์„œ๋“  ์›น ํŽ˜์ด์ง€์˜ ์ตœ์ƒ๋‹จ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋‹ค. ์ด ๋•Œ์˜ ์Šคํฌ๋กค ๊ธฐ๋Šฅ ๋˜ํ•œ aํƒœ๊ทธ๋ฅผ ์ด์šฉํ–ˆ๋‹ค.

<a href="#top_line"><span><img class="top_img" src="top-icon.jpg"></span></a>

 

๋‚ด๊ฐ€ ์ข‹์•„ํ•˜๋Š” ๊ฒƒ๋“ค์„ ๋‚˜ํƒ€๋‚ด๋Š” ํŽ˜์ด์ง€๋Š”, ์ข‹์•„ํ•˜๋Š” ๊ฒƒ๋“ค์„ ์•”์‹œํ•˜๋Š” ๋Œ€ํ‘œ ์ด๋ฏธ์ง€๋“ค์„ ์‚ฝ์ž…ํ•˜๊ณ  ํ•ด๋‹น ์ด๋ฏธ์ง€๋“ค์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ ธ์„ ๋•Œ ํ…์ŠคํŠธ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค. CSS์˜ hover๋กœ ๊ฐ„๋‹จํžˆ ๊ตฌํ˜„๋  ์ค„ ์•Œ์•˜๋Š”๋ฐ, ์ด๋ฏธ์ง€์™€ ํ…์ŠคํŠธ๊ฐ€ ๊ฐ๊ฐ ๋‹ค๋ฅธ ํƒœ๊ทธ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด์„œ, ์ด๋ฏธ์ง€๊ฐ€ hover ๋˜์—ˆ์„ ๋•Œ ํ…์ŠคํŠธ์˜ display๋ฅผ none์—์„œ block์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ƒ๊ฐ๋ณด๋‹ค ๊นŒ๋‹ค๋กœ์› ๋‹ค. ๊ทธ๋ž˜์„œ JavaScript๋ฅผ ์ด์šฉํ•ด์„œ ํšจ๊ณผ๊ฐ€ ์ž‘์„ฑ๋œ class๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.

const fav_image = document.querySelectorAll('.fav_image');

fav_image.forEach((fav) => fav.addEventListener('mouseover', hoverEvent));
fav_image.forEach((fav) => fav.addEventListener('mouseout', hoveroutEvent));

function hoverEvent() {
  this.querySelector('.fav_image > img').classList.add('hovered_img');
  this.querySelector('.img_title').classList.add('hovered_front');
}

function hoveroutEvent() {
  this.querySelector('.fav_image > img').classList.remove('hovered_img');
  this.querySelector('.img_title').classList.remove('hovered_front');

 

๋งˆ์ง€๋ง‰์œผ๋กœ JavaScript ์‘์šฉ ํŽ˜์ด์ง€๋Š” ๋‹ค์Œ์ฃผ์— ํ•™์Šตํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ์˜ˆ์Šตํ•˜๋Š” ์ฐจ์›์—์„œ, e.target์„ ์ด์šฉํ•ด์„œ ๋งŒ๋“ค์—ˆ๋‹ค. ๋ฐฉ๋ฌธ์ž์˜ ์ด๋ฆ„์„ ๋ฐ›์•„์™€์„œ ์ถœ๋ ฅํ•˜๊ณ , 6์ž๋ฆฌ์˜ ์ƒ‰์ƒ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„์„œ ์ž๊ธฐ์†Œ๊ฐœ ํŽ˜์ด์ง€์˜ ๋ฐฐ๊ฒฝ ์ƒ‰์ƒ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค.

const color_input = document.querySelector('.color_input');
const section = document.querySelectorAll('.section');
const section6_mid = document.querySelector('.section6_mid');

color_input.addEventListener('change', (e) => {
  section.forEach((s) => s.style.setProperty("background", `#${e.target.value}`));
  section6_mid.innerHTML = `<span>์ž…๋ ฅํ•˜์‹  ์ƒ‰์ƒ ์ฝ”๋“œ๋Š” #${e.target.value} ์ž…๋‹ˆ๋‹ค.</span>`;
});

const reset_btn = document.querySelector('.reset_btn');

reset_btn.addEventListener('click', () => {
  section.forEach((s) => s.style.setProperty("background", `#ffecb3`));
  section6_img.src = "2.png";
  section6_bubble.innerHTML = `<input type="text" class="name_input" placeholder="๋ฐฉ๋ฌธ์ž๋‹˜, ๋‹น์‹ ์˜ ์ด๋ฆ„์€ ๋ฌด์—‡์ธ๊ฐ€์š”?">`;
  section6_mid.innerHTML = `<input type="text" class="color_input" placeholder="์›ํ•˜๋Š” ์ƒ‰์ƒ์ฝ”๋“œ ์—ฌ์„ฏ์ž๋ฆฌ๋ฅผ ์ž…๋ ฅํ•ด๋ณด์„ธ์š”! ์˜ˆ) e9e9e9">`;
});

const name_input = document.querySelector('.name_input');
const section6_img = document.querySelector('.section6_img');
const section6_bubble = document.querySelector('.section6_bubble');

name_input.addEventListener('change', (e) => {
  section6_img.src = "3.png";
  section6_bubble.innerHTML = `
  <span>์•ˆ๋…•ํ•˜์„ธ์š”, ${e.target.value} ๋‹˜!
  <br>
  ์•„๋ž˜์˜ ์ž…๋ ฅ์นธ์„ ํ†ตํ•ด ์ œ ํ™ˆํŽ˜์ด์ง€ ์ƒ‰์„ ๋ณ€๊ฒฝํ•ด๋ณด์„ธ์š” ๐ŸŽจ
  </span>`;
});

 

 

๐ŸŒ  ์ตœ์ข…์ ์œผ๋กœ ์™„์„ฑ๋œ ๊ฒฐ๊ณผ๋ฌผ์€ ์—ฌ๊ธฐ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 


 

๊ณผ์ œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ๊ณผ๊ฑฐ์— ๋น„ํ•ด ๋งŽ์ด ๋ฐœ์ „๋œ ๊ฒƒ์„ ๋А๋‚„ ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ, ํ•œํŽธ์œผ๋กœ๋Š” ์•„์ง๋„ ๋ถ€์กฑํ•จ์ด ๋งŽ์ด ๋А๊ปด์ง€๊ธฐ๋„ ํ–ˆ๋‹ค.

CSS์˜ position์ด๋‚˜ transform์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์— ์žˆ์–ด์„œ ์•„์ง ๋ฏธ์ˆ™ํ•œ ์ ์ด ์žˆ์—ˆ๊ณ , JavaScript๋ฅผ ์ƒ๊ฐ๋งŒํผ ์ž์œ ์ž์žฌ๋กœ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ ์‰ฝ์ง€ ์•Š์•˜๋‹ค. ์•„์ง๋„ ๊ฐˆ ๊ธธ์ด ๋ฉ€๋‹ค๐Ÿ˜‚

์ž๊ธฐ์†Œ๊ฐœ ํŽ˜์ด์ง€์— ์ ํžŒ ๊ฒƒ ์ฒ˜๋Ÿผ ์—ด์‹ฌํžˆ ๋ฐฐ์šฐ๋ฉฐ, ์„ฑ์žฅ์„ ๊ฑฐ๋“ญํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด ๊พธ์ค€ํžˆ ๋…ธ๋ ฅํ•ด์•ผ๊ฒ ๋‹ค.