elice/WIL

[과제] μžκΈ°μ†Œκ°œ νŽ˜μ΄μ§€ μ œμž‘

건망디 2022. 2. 4. 03:05

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λ₯Ό μƒκ°λ§ŒνΌ 자유자재둜 λ‹€λ£¨λŠ” 것은 μ—¬μ „νžˆ 쉽지 μ•Šμ•˜λ‹€. μ•„직도 갈 길이 λ©€λ‹€πŸ˜‚

μžκΈ°μ†Œκ°œ νŽ˜μ΄μ§€μ— 적힌 것 처럼 μ—΄μ‹¬νžˆ 배우며, μ„±μž₯을 κ±°λ“­ν•˜λŠ” κ°œλ°œμžκ°€ 되기 μœ„ν•΄ κΎΈμ€€νžˆ λ…Έλ ₯ν•΄μ•Όκ² λ‹€.