๊ด€๋ฆฌ ๋ฉ”๋‰ด

UI Code Lab

๐Ÿ“Š ์Šคํฌ๋กค ํผ์„ผํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ ˆ์Šค ๋ฐ” ๋งŒ๋“ค๊ธฐ – ๋ฐ”๋‹๋ผ JS๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์‹ค์ „ UI ๋ณธ๋ฌธ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธUI

๐Ÿ“Š ์Šคํฌ๋กค ํผ์„ผํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ ˆ์Šค ๋ฐ” ๋งŒ๋“ค๊ธฐ – ๋ฐ”๋‹๋ผ JS๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์‹ค์ „ UI

๐Ÿฏ๊ฟ€์ƒ์ด๐Ÿ 2025. 7. 22. 10:51

์Šคํฌ๋กค ํผ์„ผํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ ˆ์Šค ๋ฐ” ๋งŒ๋“ค๊ธฐ

 

 

 

์›น์‚ฌ์ดํŠธ๋ฅผ ์ฝ๋‹ค ๋ณด๋ฉด ์ƒ๋‹จ์— ์–‡์€ ๋ฐ”๊ฐ€ ์Šค๋ฅด๋ฅต ์ฐจ์˜ค๋ฅด๋Š” ๊ฑธ ๋ณธ ์  ์žˆ์œผ์‹ ๊ฐ€์š”?

์ด๊ฑด ๋ฐ”๋กœ ์Šคํฌ๋กค ํผ์„ผํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ ˆ์Šค ๋ฐ”(progress bar)์ž…๋‹ˆ๋‹ค.

 

์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์–ผ๋งˆ๋‚˜ ์ฝ์—ˆ๋Š”์ง€ ์ง๊ด€์ ์œผ๋กœ ๋ณด์—ฌ์ฃผ๋Š” UI๋กœ,

์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ๋†’์ด๋Š” ๋ฐ ํšจ๊ณผ์ ์ด์—์š”.

 

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด ๋ฐ”๋‹๋ผ JavaScript๋งŒ์œผ๋กœ

์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

 

๐ŸŽฏ ๊ตฌํ˜„ ๋ชฉํ‘œ

  • ์‚ฌ์šฉ์ž๊ฐ€ ์Šคํฌ๋กคํ•œ ๋น„์œจ์— ๋”ฐ๋ผ ์ƒ๋‹จ ๋ฐ”์˜ ๋„ˆ๋น„๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€ํ•จ
  • HTML, CSS, JavaScript๋งŒ ์‚ฌ์šฉ
  • ๋ฐ˜์‘ํ˜• ์›น์—์„œ๋„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ž‘๋™

 

๐Ÿงฉ HTML ๊ตฌ์กฐ

 
<div class="progress-container">
  <div class="progress-bar"></div>
</div>
  • progress-container: ์ „์ฒด ํ”„๋กœ๊ทธ๋ ˆ์Šค ๋ฐ” ์˜์—ญ
  • progress-bar: ์‹ค์ œ ๋„ˆ๋น„๊ฐ€ ๋ณ€ํ•˜๋Š” ๋ฐ” ์š”์†Œ

 

๐ŸŽจ CSS ์Šคํƒ€์ผ๋ง

 
.progress-container {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 6px;
  background-color: #eee;
  z-index: 9999;
}

.progress-bar {
  height: 100%;
  width: 0%;
  background-color: #3b82f6;
  transition: width 0.1s ease-out;
}
  • ์ƒ๋‹จ์— ๊ณ ์ •๋˜๋„๋ก position: fixed ์‚ฌ์šฉ
  • transition์œผ๋กœ ๋ถ€๋“œ๋Ÿฌ์šด ๋„ˆ๋น„ ๋ณ€ํ™” ํšจ๊ณผ ์ ์šฉ

 

โš™๏ธ JavaScript ๋กœ์ง

 
window.addEventListener("scroll", () => {
  const scrollTop = document.documentElement.scrollTop;
  const scrollHeight = document.documentElement.scrollHeight;
  const clientHeight = document.documentElement.clientHeight;

  const scrollPercent = (scrollTop / (scrollHeight - clientHeight)) * 100;
  document.querySelector(".progress-bar").style.width = scrollPercent + "%";
});
  • scrollTop: ํ˜„์žฌ ์Šคํฌ๋กค ์œ„์น˜
  • scrollHeight: ์ „์ฒด ๋ฌธ์„œ ๋†’์ด
  • clientHeight: ํ™”๋ฉด ๋†’์ด
  • ๊ณ„์‚ฐ๋œ scrollPercent๋ฅผ ๋ฐ” ๋„ˆ๋น„๋กœ ๋ฐ˜์˜

 

๐Ÿ’ก ํ™•์žฅ ์•„์ด๋””์–ด

  • ์ƒ‰์ƒ ๋ณ€๊ฒฝ: ์Šคํฌ๋กค ์œ„์น˜์— ๋”ฐ๋ผ ์ƒ‰์ƒ ๋ณ€ํ™”
  • ์„น์…˜๋ณ„ ์ง„ํ–‰๋ฅ : ํŠน์ • ์„น์…˜๋งˆ๋‹ค ๋ณ„๋„ ๋ฐ” ํ‘œ์‹œ
  • ์„ฑ๋Šฅ ์ตœ์ ํ™”: throttle ๋˜๋Š” requestAnimationFrame ํ™œ์šฉ

 

๐Ÿงพ ๋งˆ๋ฌด๋ฆฌ

 

์Šคํฌ๋กค ํผ์„ผํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ ˆ์Šค ๋ฐ”๋Š” ๋‹จ์ˆœํ•˜์ง€๋งŒ

์‚ฌ์šฉ์ž์—๊ฒŒ ์ฝ๊ธฐ ์ง„ํ–‰๋ฅ ์„ ์ง๊ด€์ ์œผ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ํ›Œ๋ฅญํ•œ UI์ž…๋‹ˆ๋‹ค.

 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด๋„ ์ถฉ๋ถ„ํžˆ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋ฉฐ,

๋‹ค์–‘ํ•œ ํ™•์žฅ ๊ธฐ๋Šฅ์œผ๋กœ UX๋ฅผ ๋”์šฑ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”.

 

์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ธ”๋กœ๊ทธ๋‚˜ ํ”„๋กœ์ ํŠธ์— ์ง์ ‘ ์ ์šฉํ•ด๋ณด์„ธ์š”!

๋‹ค์Œ ๊ธ€์—์„œ๋Š” ๋‹คํฌ ๋ชจ๋“œ ํ† ๊ธ€ ๊ธฐ๋Šฅ์„ ์†Œ๊ฐœํ•  ์˜ˆ์ •์ด๋‹ˆ ๊ธฐ๋Œ€ํ•ด์ฃผ์„ธ์š”. ๐Ÿ˜„