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

UI Code Lab

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋‚ ์งœ ์„ ํƒ๊ธฐ(Date Picker) ์ง์ ‘ ๋งŒ๋“ค๊ธฐ – ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋ณธ๋ฌธ

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

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋‚ ์งœ ์„ ํƒ๊ธฐ(Date Picker) ์ง์ ‘ ๋งŒ๋“ค๊ธฐ – ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

๐Ÿฏ๊ฟ€์ƒ์ด๐Ÿ 2025. 7. 7. 14:57

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋‚ ์งœ ์„ ํƒ๊ธฐ ์ง์ ‘ ๋งŒ๋“ค๊ธฐ

 

๐Ÿงญ ์™œ ์ง์ ‘ ๋‚ ์งœ ์„ ํƒ๊ธฐ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ• ๊นŒ?

 

๋Œ€๋ถ€๋ถ„์˜ ์›น ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋‚ ์งœ ์ž…๋ ฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

 

๋ฌผ๋ก  input [type="date"] ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ,

 

๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ๋””์ž์ธ์ด ๋‹ค๋ฅด๊ณ  ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ์–ด๋ ต๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์ฃ .

 

๊ทธ๋ž˜์„œ ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ˆœ์ˆ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋‚ ์งœ ์„ ํƒ๊ธฐ UI๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ› ๏ธ ๊ตฌํ˜„ ๋ชฉํ‘œ

  • ๋‹ฌ๋ ฅ UI๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑ
  • ํ˜„์žฌ ์›” ๊ธฐ์ค€์œผ๋กœ ๋‚ ์งœ ํ‘œ์‹œ
  • ์ด์ „/๋‹ค์Œ ๋‹ฌ ์ด๋™ ๊ธฐ๋Šฅ
  • ๋‚ ์งœ ํด๋ฆญ ์‹œ ์„ ํƒ๋œ ๋‚ ์งœ ์ถœ๋ ฅ

 

 

๐Ÿงฑ HTML ๊ตฌ์กฐ

 
<div class="datepicker">
  <div class="header">
    <button id="prev">โ—€</button>
    <span id="month-year"></span>
    <button id="next">โ–ถ</button>
  </div>
  <table id="calendar">
    <thead>
      <tr>
        <th>์ผ</th><th>์›”</th><th>ํ™”</th><th>์ˆ˜</th><th>๋ชฉ</th><th>๊ธˆ</th><th>ํ† </th>
      </tr>
    </thead>
    <tbody></tbody>
  </table>
</div>
<p>์„ ํƒํ•œ ๋‚ ์งœ: <span id="selected-date">์—†์Œ</span></p>

 

 

๐ŸŽจ CSS ์Šคํƒ€์ผ (๊ฐ„๋‹จ ๋ฒ„์ „)

 
.datepicker {
  width: 300px;
  border: 1px solid #ccc;
  padding: 10px;
  font-family: sans-serif;
}
.header {
  display: flex;
  justify-content: space-between;
  align-items: center;
}
#calendar td {
  text-align: center;
  padding: 5px;
  cursor: pointer;
}
#calendar td:hover {
  background-color: #f0f0f0;
}
.selected {
  background-color: #007bff;
  color: white;
}

 

 

โš™๏ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋กœ์ง

 
const calendarBody = document.querySelector("#calendar tbody");
const monthYear = document.getElementById("month-year");
const selectedDate = document.getElementById("selected-date");

let today = new Date();
let currentMonth = today.getMonth();
let currentYear = today.getFullYear();

function renderCalendar(month, year) {
  calendarBody.innerHTML = "";
  const firstDay = new Date(year, month, 1).getDay();
  const lastDate = new Date(year, month + 1, 0).getDate();

  monthYear.textContent = `${year}๋…„ ${month + 1}์›”`;

  let row = document.createElement("tr");
  for (let i = 0; i < firstDay; i++) {
    row.appendChild(document.createElement("td"));
  }

  for (let day = 1; day <= lastDate; day++) {
    if (row.children.length === 7) {
      calendarBody.appendChild(row);
      row = document.createElement("tr");
    }
    const cell = document.createElement("td");
    cell.textContent = day;
    cell.addEventListener("click", () => {
      document.querySelectorAll("#calendar td").forEach(td => td.classList.remove("selected"));
      cell.classList.add("selected");
      selectedDate.textContent = `${year}-${String(month + 1).padStart(2, "0")}-${String(day).padStart(2, "0")}`;
    });
    row.appendChild(cell);
  }
  calendarBody.appendChild(row);
}

document.getElementById("prev").addEventListener("click", () => {
  currentMonth--;
  if (currentMonth < 0) {
    currentMonth = 11;
    currentYear--;
  }
  renderCalendar(currentMonth, currentYear);
});

document.getElementById("next").addEventListener("click", () => {
  currentMonth++;
  if (currentMonth > 11) {
    currentMonth = 0;
    currentYear++;
  }
  renderCalendar(currentMonth, currentYear);
});

renderCalendar(currentMonth, currentYear);

 

 

๐Ÿ” SEO ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ํŒ

  • ํƒ€๊นƒ ํ‚ค์›Œ๋“œ: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ ์งœ ์„ ํƒ๊ธฐ, Date Picker, ๋‹ฌ๋ ฅ UI, JS ๋‹ฌ๋ ฅ ๋งŒ๋“ค๊ธฐ
  • H1~H3 ํƒœ๊ทธ ๊ตฌ์กฐํ™”: ๊ฒ€์ƒ‰์—”์ง„์ด ์ฝ˜ํ…์ธ  ๊ตฌ์กฐ๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ
  • ์ด๋ฏธ์ง€ ALT ํƒœ๊ทธ: ์ฝ”๋“œ ๊ฒฐ๊ณผ๋ฅผ ์บก์ฒ˜ํ•ด ์ด๋ฏธ์ง€๋กœ ์ฒจ๋ถ€ ์‹œ alt="์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‹ฌ๋ ฅ UI ์˜ˆ์‹œ" ๋“ฑ์œผ๋กœ ์„ค๋ช… ์ถ”๊ฐ€
  • ๋‚ด๋ถ€ ๋งํฌ: ๊ด€๋ จ ๊ธ€์ด ์žˆ๋‹ค๋ฉด ์—ฐ๊ฒฐ (์˜ˆ: ๋ชจ๋‹ฌ, ํ† ์ŠคํŠธ ์•Œ๋ฆผ ๋“ฑ)
  • ์™ธ๋ถ€ ๋งํฌ: MDN ๋ฌธ์„œ๋‚˜ ๊ณต์‹ JS ๋ฌธ์„œ ๋งํฌ ํ™œ์šฉ

 

 

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

 

์ด๋ ‡๊ฒŒ ์ง์ ‘ ๋งŒ๋“  ๋‚ ์งœ ์„ ํƒ๊ธฐ๋Š” ๋””์ž์ธ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ์ž์œ ๋กญ๊ณ , ๊ธฐ๋Šฅ ํ™•์žฅ๋„ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด ๋‚ ์งœ ๋ฒ”์œ„ ์„ ํƒ, ์ฃผ๋ง ๋น„ํ™œ์„ฑํ™”, ์˜ค๋Š˜ ๋‚ ์งœ ๊ฐ•์กฐ ๋“ฑ๋„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด์š”.

 

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์…จ๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ ค์š”! ๐Ÿ˜Š

 

๋‹ค์Œ ๊ธ€์—์„œ๋Š” ์‹œ๊ฐ„ ์„ ํƒ๊ธฐ(Time Picker)๋„ ๋งŒ๋“ค์–ด๋ณผ๊นŒ์š”?