| μΌ | μ | ν | μ | λͺ© | κΈ | ν | 
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 | 
| 9 | 10 | 11 | 12 | 13 | 14 | 15 | 
| 16 | 17 | 18 | 19 | 20 | 21 | 22 | 
| 23 | 24 | 25 | 26 | 27 | 28 | 29 | 
| 30 | 
- λ·νλ¦μ€μ λλ©μ΄μ 
 - UXλμμΈ
 - κ°μμμ΄λ
 - μλ°μ€ν¬λ¦½νΈui
 - JavaScript
 - μΌλ°ν
 - μ€ν¬λ‘€μ λλ©μ΄μ 
 - λ°λλΌμ€ν¬λ¦½νΈ
 - λ°λλΌjs
 - μ¬μ보μ΄μ¦
 - λ€ν¬λͺ¨λ
 - UIUX
 - Golden
 - uiμ»΄ν¬λνΈ
 - λΉλ³΄λμ°¨νΈ
 - kpopdemonhunters
 - μΉμ κ·Όμ±
 - νλ‘ νΈμλ
 - λ·νλ¦μ€ost
 - ννΈλ¦μ€
 - λ€ν¬λͺ¨λν κΈ
 - μΌμ΄νλ°λͺ¬νν°μ€
 - λ°λ§μΌν
 - jsμ€ν¬λ‘€μ΄λ²€νΈ
 - μΉUI
 - μλ°μ€ν¬λ¦½νΈ
 - μ κ·Όμ±
 - 골λ
 - μΉλμμΈ
 - μΉκ°λ°
 
- Today
 
- Total
 
UI Code Lab
μλ°μ€ν¬λ¦½νΈλ‘ λ§λλ μλ¦Ό(Toast) μ»΄ν¬λνΈ λ³Έλ¬Έ
μλ°μ€ν¬λ¦½νΈλ‘ λ§λλ μλ¦Ό(Toast) μ»΄ν¬λνΈ
π―κΏμμ΄π 2025. 7. 4. 10:37
π κ°μ
Toast μλ¦Όμ μ¬μ©μμκ² λΉ λ₯΄κ³ κ°λ¨ν νΌλλ°±μ μ 곡νλ UI μμμ λλ€.
μλ₯Ό λ€μ΄ “μ μ₯λμμ΅λλ€”μ²λΌ νλ©΄ μλ¨μ΄λ νλ¨μ μ§§κ² λνλλ μλ¦Ό λ§μ΄μ£ .
μ΄ κΈμμλ λ°λλΌ μλ°μ€ν¬λ¦½νΈ(Vanilla JS)λ§μΌλ‘
μ¬μ¬μ© κ°λ₯ν toast μ»΄ν¬λνΈλ₯Ό λ§λλ λ²μ μκ°ν©λλ€.
- β μμ JSλ‘ κ°λ³κ² ꡬν
 - β μμΉ, μ§μ μκ°, μ λλ©μ΄μ  μ€μ  κ°λ₯
 - β μ€ν¬λ¦° 리λ μ¬μ©μλ κ³ λ €ν μ κ·Όμ±
 
π‘ Toast UIλ?
Toastλ νλ©΄ νμͺ½μ λͺ μ΄κ° νμλλ μΌμμ μΈ λ©μμ§μ λλ€.
μ¬μ©μκ° λ³λμ μ‘°μ μμ΄ νΌλλ°±μ λ°μ μ μμ΄ UX ν₯μμ ν¨κ³Όμ μ΄μ£ .
π μμ£Ό μ°μ΄λ μν© μμ
- νΌ μ μΆ ν “μ μΆμ΄ μλ£λμμ΅λλ€”
 - λ³΅μ¬ λ²νΌ ν΄λ¦ μ “ν΄λ¦½λ³΄λμ 볡μ¬λ¨”
 - μ μ₯, μμ , μ€λ₯ μλ΄ λ±
 
π οΈ HTML ꡬ쑰
<div id="toast-container"></div>
toast-containerλ ν μ€νΈ λ©μμ§λ₯Ό κ°μΈλ 컨ν μ΄λμ λλ€.
μλ°μ€ν¬λ¦½νΈμμ λμ μΌλ‘ λ©μμ§λ₯Ό μ½μ ν΄ μ¬μ©ν μμ μ΄μμ.
π¨ CSS μ€νμΌ
#toast-container {
  position: fixed;
  top: 1.5rem;
  right: 1.5rem;
  z-index: 9999;
}
.toast {
  background: #333;
  color: #fff;
  padding: 0.75rem 1.2rem;
  margin-top: 0.5rem;
  border-radius: 4px;
  opacity: 0;
  transform: translateY(-10px);
  transition: opacity 0.3s ease, transform 0.3s ease;
}
.toast.show {
  opacity: 1;
  transform: translateY(0);
}
βοΈ μλ°μ€ν¬λ¦½νΈ λ‘μ§
function showToast(message, duration = 3000) {
  const container = document.getElementById('toast-container');
  const toast = document.createElement('div');
  toast.className = 'toast';
  toast.innerText = message;
  container.appendChild(toast);
  // νμ
  requestAnimationFrame(() => toast.classList.add('show'));
  // μ¬λΌμ§κΈ°
  setTimeout(() => {
    toast.classList.remove('show');
    toast.addEventListener('transitionend', () => toast.remove());
  }, duration);
}
β μ κ·Όμ± κ³ λ € (a11y)
toast.setAttribute('role', 'alert');
toast.setAttribute('aria-live', 'assertive');
- role="alert": μ€ν¬λ¦° 리λκ° μ¦μ μ½μ΄μ€λλ€.
 - aria-live="assertive": κΈ΄κΈνκ² μ λ¬ν νμκ° μμ κ²½μ° μ¬μ©ν©λλ€.
 
π§ͺ μ¬μ© μμ
<button onclick="showToast('볡μ¬λμμ΅λλ€!')">볡μ¬</button>
π νμ₯ ν¬μΈνΈ
- β ν μ€νΈ μμΉ μ»€μ€ν°λ§μ΄μ§ (μΌμͺ½, κ°μ΄λ° λ±)
 - β μμ΄μ½, μμ λ³κ²½
 - β ν(queue) μ²λ¦¬: μ¬λ¬ toastκ° κ²ΉμΉμ§ μκ²
 - β μ¬μ΄λ μΆκ° λ± λ€μν μΈν°λμ 
 
π κ΄λ ¨ ν€μλ (SEO)
- μλ°μ€ν¬λ¦½νΈ toast λ§λ€κΈ°
 - λ°λλΌ JS μλ¦Ό UI
 - toast λ©μμ§ μμ 
 - μλ°μ€ν¬λ¦½νΈ λμ  μ»΄ν¬λνΈ
 - μΉ μ κ·Όμ± μλ¦Ό ꡬν
 
π§© λ§λ¬΄λ¦¬νλ©°
JavaScriptλ§μΌλ‘λ νΈλ¦¬ UIλ₯Ό μΆ©λΆν νλΆνκ² κ΅¬νν μ μμ΅λλ€.
κΈ°λ³Έ κΈ°λ₯μμ μΆλ°ν΄ μμ΄μ½, λλκ·Έ μ€ λλ‘, κ²μ, κ·Έλ¦¬κ³ μ κ·Όμ±κΉμ§ μ±κΈ°λ©΄μ
μ¬μ©μ κ²½νμ λ μ κ΅νκ² λ€λ¬λ κ³Όμ μ νλ°νΈμλ κ°λ°μ μ§μ§ μ¬λ―Έλ₯Ό λλ μ μκ² ν΄ μ€λλ€.
μ΄μ  μ¬λ¬λΆμ νΈλ¦¬ UIλ λ¨μν νμΌ κ΅¬μ‘° ννμ λμ΄,
λꡬμκ²λ μΉμ ν μΈν°νμ΄μ€λ‘ νμ₯λ μ€λΉκ° λμμ΄μ.
μ¬κΈ°μ μ λλ©μ΄μ , API μ°λ, 컀μ€ν°λ§μ΄μ§ μ΅μ  λ± μνλ κΈ°λ₯μ λ§λΆμ΄λ©΄
λλ§μ λ©μ§ μ»΄ν¬λνΈκ° μμ±λκ² μ£ . π§
κΆκΈν μ μ΄λ λ λ€λ€μΌλ©΄ νλ UI μ£Όμ κ° μλ€λ©΄ λκΈλ‘ μλ €μ£ΌμΈμ!
κ·ΈλΌ λ€μ ν¬μ€νΈμμ λ λ§λμ. π