[κ³Όμ ] μκΈ°μκ° νμ΄μ§ μ μ
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λ₯Ό μκ°λ§νΌ μμ μμ¬λ‘ λ€λ£¨λ κ²μ μ¬μ ν μ½μ§ μμλ€. μμ§λ κ° κΈΈμ΄ λ©λ€π
μκΈ°μκ° νμ΄μ§μ μ ν κ² μ²λΌ μ΄μ¬ν λ°°μ°λ©°, μ±μ₯μ κ±°λνλ κ°λ°μκ° λκΈ° μν΄ κΎΈμ€ν λ Έλ ₯ν΄μΌκ² λ€.