πŸ“… Calendar λ§Œλ“€κΈ°

mynoseis3Β·2024λ…„ 1μ›” 18일

practice

λͺ©λ‘ 보기
9/32
post-thumbnail

πŸ“† λ―Έμ…˜ : date 객체λ₯Ό ν™œμš©ν•œ μΊ˜λ¦°λ” λ§Œλ“€κΈ°


πŸ“ƒ μš”κ΅¬μ‚¬ν•­

  • 달λ ₯을 λ§Œλ“€κ³  쒌우 ν™”μ‚΄ν‘œλ₯Ό λˆ„λ₯΄λ©΄ ν•΄λ‹Ήν•˜λŠ” μ›”λ‘œ λ„˜μ–΄κ°„λ‹€.
  • μΌλ§ˆλ‹€ 선택이 κ°€λŠ₯ν•΄μ•Ό ν•˜λ©°, ν•΄λ‹Ή 일을 μ„ νƒν–ˆμ„ 경우 λ©”λͺ¨μž₯이 λ…ΈμΆœλœλ‹€.
  • λ©”λͺ¨μž₯μ—λŠ” λ©”λͺ¨λ₯Ό μž…λ ₯ν•  수 μžˆλ‹€.
  • λ©”λͺ¨λ₯Ό μž…λ ₯ν•œ ν›„ λ‹€μ‹œ μΊ˜λ¦°λ” ν™”λ©΄μœΌλ‘œ λŒμ•„μ˜€λ©΄
    ν•΄λ‹Ή 일에 μž‘μ€ μ›μœΌλ‘œ λ©”λͺ¨κ°€ μžˆμŒμ„ ν‘œμ‹œν•œλ‹€.
  • λ©”λͺ¨ 기둝이 μžˆλŠ” λ‚ μ§œλ₯Ό 클릭할 경우 기둝 ν–ˆλ˜ λ©”λͺ¨μž₯이 λ…ΈμΆœλœλ‹€.
  • λ©”λͺ¨μž₯에 κΈ°λ‘ν•œ λ‚΄μš©μ„ μˆ˜μ •ν•  수 μžˆλ‹€.

πŸš— 달λ ₯ κΈ°λ³Έ ν‹€ 데렀였기

gptμƒ˜κ»˜ 폭풍 질문 ν•΄μ„œ 받은 달λ ₯ 틀을 λ„£κ³ 
λ‚΄κ°€ μ›ν•˜λŠ” κ΅¬μ„±μœΌλ‘œ μ«Œμ«Œλ”°λ¦¬ λ°”κΎΈκ³  λ””ν…ŒμΌν•œ λΆ€λΆ„κ³Ό
λ©”λͺ¨μž₯ κΈ°λŠ₯을 κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” 것에 μ΄ˆμ μ„ 맞좰 보자.

μ˜€λ§› .. 벨둜그 μ“°λ‹€ 보면 μ‹€ν–‰ 화면을 보여쀄 λ•Œ gif λ”°μ„œ μ²¨λΆ€ν•˜κ±°λ‚˜
캑쳐 사샀삭 ν–ˆμ—ˆλŠ”λ° μ΄λ ‡κ²Œ μ½”λ“œνŽœ 화면을 넣어쀄 μˆ˜λ„ μžˆλ‹€. μ–ν˜Έ !

λ²¨λ‘œκ·Έμ— μ½”λ“œνŽœ μ‚¬μš©ν•˜λŠ” 방법도 λ”°λ‘œ κΈ€λ‘œ μž‘μ„±ν•΄λ‘μžμš”

달λ ₯ ν‹€ 생성


πŸ›©οΈ μŠ€νƒ€μΌ 적용

  • κ·ΈλΌλ””μ–ΈνŠΈ λ°°κ²½ 적용
  • wrapper μ˜μ—­ / calendar μ˜μ—­ 배치
  • ν™”μ‚΄ν‘œ μ•„μ΄μ½˜ μΆ”κ°€
  • wrapper μ˜μ—­ μ•ˆμ— calendar μ˜μ—­ 배치
  • 달λ ₯ ν—€λ”λŠ” calendar μ˜μ—­μ—μ„œ λΉΌκ³  wrapper μ˜μ—­μ— 배치

κ²°κ³Ό ν™”λ©΄ !

++ ν˜„μž¬ μš”μΌ ν‘œμ‹œν•΄μ£ΌκΈ°

++ μ’€ 더 씰룩
색상을 λ°”κΏ”μ„œ λ°°κ²½κ³Ό μ–΄μšΈλ¦¬κ²Œ λ§žμΆ”κ³  달λ ₯ table의 td에 padding 값을 μΆ”κ°€ν•˜μ—¬
좔후에 κ΅¬ν˜„ν•΄μ•Ό ν•  λ©”λͺ¨ ν‘œμ‹œ μ—¬λΆ€λ₯Ό μƒκ°ν•΄μ„œ μ’€ 더 면적을 λ„“ν˜€ μ£Όμ—ˆλ‹€.


01. ν™”μ‚΄ν‘œλ₯Ό λˆ„λ₯΄λ©΄ ν•΄λ‹Ήν•˜λŠ” μ›”λ‘œ λ„˜μ–΄κ°€κΈ°

πŸ“ƒ 쑰건 : 달λ ₯을 λ§Œλ“€κ³  쒌우 ν™”μ‚΄ν‘œλ₯Ό λˆ„λ₯΄λ©΄ ν•΄λ‹Ήν•˜λŠ” μ›”λ‘œ λ„˜μ–΄κ°„λ‹€.

  • calendar.html

  • cal.js

//ν˜„μž¬ 년도 및 μ›” λ³€μˆ˜ μΆ”κ°€
var currentYear = new Date().getFullYear();
var currentMonth = new Date().getMonth();

//달λ ₯을 μƒμ„±ν•˜κ³  ν‘œμ‹œν•˜λŠ” ν•¨μˆ˜
function generateCalendar() {
    // 달λ ₯의 헀더 생성
    var headerHTML = `<h2 style="color:#fff; text-align:center; position:relative; bottom: 55px;">${currentYear}λ…„ ${currentMonth + 1}μ›”</h2>`;

    // 달λ ₯ μ˜μ—­μ— 헀더 μΆ”κ°€
    var headerContainer = document.createElement("div");
    headerContainer.classList.add("header");
    headerContainer.innerHTML = headerHTML;

    // wrapper에 헀더 μΆ”κ°€
    var wrapper = document.querySelector(".header");
    wrapper.innerHTML = ''; // 헀더λ₯Ό μ§€μš°κ³  λ‹€μ‹œ μΆ”κ°€
    wrapper.appendChild(headerContainer);
    
    // 달λ ₯의 λ³Έλ¬Έ 생성
    var calendarHTML = '<table>';
    // μš”μΌ ν‘œμ‹œ
    calendarHTML += '<tr>';
    const daysOfWeek = ['일', 'μ›”', 'ν™”', '수', 'λͺ©', '금', 'ν† '];
    for (let day of daysOfWeek) {
        calendarHTML += `<th>${day}</th>`;
    }
    calendarHTML += '</tr>';

    // 각 주와 λ‚ μ§œ ν‘œμ‹œ
    const totalDaysInMonth = new Date(currentYear, currentMonth + 1, 0).getDate();
    const firstDayOfMonth = new Date(currentYear, currentMonth, 1).getDay();

    let dayCounter = 1;

    for (let i = 0; i < 6; i++) { // μ΅œλŒ€ 6μ£Ό (일주일이 6주일 κ²½μš°λ„ 있음)
        calendarHTML += '<tr>';

        for (let j = 0; j < 7; j++) { // 7일 (μš”μΌ)
            let cellStyle = ''; // 셀에 μ μš©ν•  μŠ€νƒ€μΌ μ΄ˆκΈ°ν™”

            if (i === 0 && j < firstDayOfMonth) {
                // 첫 주의 μ‹œμž‘μΌ 이전은 빈 μ…€λ‘œ 채움
                calendarHTML += '<td></td>';
            } else if (dayCounter > totalDaysInMonth) {
                // λ§ˆμ§€λ§‰ λ‚  μ΄ν›„λŠ” 빈 μ…€λ‘œ 채움
                calendarHTML += '<td></td>';
            } else {
                // μœ νš¨ν•œ λ‚ μ§œμΌ 경우 λ‚ μ§œ ν‘œμ‹œ
                if (j === 0) {
                    // μΌμš”μΌμ€ 빨간색
                    cellStyle = 'color: red;';
                } else if (j === 6) {
                    // ν† μš”μΌμ€ νŒŒλž€μƒ‰
                    cellStyle = 'color: blue;';
                }
                calendarHTML += `<td style="${cellStyle}">${dayCounter}</td>`;
                dayCounter++;
            }
        }

        calendarHTML += '</tr>';

        // λͺ¨λ“  λ‚ μ§œλ₯Ό ν‘œμ‹œν•œ 경우 μ’…λ£Œ
        if (dayCounter > totalDaysInMonth) {
            break;
        }
    }

    calendarHTML += '</table>';
    // μƒμ„±λœ 달λ ₯을 달λ ₯ μ»¨ν…Œμ΄λ„ˆμ— μΆ”κ°€
    var calendarContainer = document.getElementById("calendar");
    calendarContainer.innerHTML = calendarHTML;
}

// νŽ˜μ΄μ§€ λ‘œλ“œ μ‹œ ν˜„μž¬ 월에 ν•΄λ‹Ήν•˜λŠ” 달λ ₯ ν‘œμ‹œ
window.onload = function () {
    generateCalendar();
    // ν˜„μž¬ λ‚ μ§œμ— μŠ€νƒ€μΌ μΆ”κ°€
    highlightCurrentDate();
    
    // 쒌우 ν™”μ‚΄ν‘œ μ•„μ΄μ½˜μ— 클릭 이벀트 μΆ”κ°€
    var prevMonthIcon = document.querySelector('.bxs-chevron-left');
    var nextMonthIcon = document.querySelector('.bxs-chevron-right');

    prevMonthIcon.addEventListener('click', function () {
        changeMonth(-1); // 이전 μ›”λ‘œ 이동
    });

    nextMonthIcon.addEventListener('click', function () {
        changeMonth(1); // λ‹€μŒ μ›”λ‘œ 이동
    });
};

// 이전 μ›” λ˜λŠ” λ‹€μŒ μ›”λ‘œ μ΄λ™ν•˜λŠ” ν•¨μˆ˜
function changeMonth(direction) {
    currentMonth += direction;
    if (currentMonth < 0) {
        currentMonth = 11;
        currentYear--;
    } else if (currentMonth > 11) {
        currentMonth = 0;
        currentYear++;
    }
    generateCalendar();
    highlightCurrentDate();
}
  • κ²°κ³Ό

πŸ’₯ 고치고 싢은 점 : λͺ¨λ“  λ‹¬μ—μ„œ 였늘 λ‚ μ§œμΈ 18일이 μŠ€νƒ€μΌμ΄ 적용되고 μžˆλŠ”λ°
λ”± 였늘 !! μ§€κΈˆ ν˜„μž¬ λ‹¬μ˜ ν˜„μž¬ λ‚ μ§œμ—λ§Œ μŠ€νƒ€μΌμ΄ 적용되게 ν•΄μ•Ό ν•  λ“―

  • μˆ˜μ • μ „

ν˜„μž¬ 년도와 월을 κΈ°μ€€μœΌλ‘œ λ‚ μ§œλ₯Ό ν‘œμ‹œν•˜κ³  ν•΄λ‹Ή μ…€μ—λ§Œ μŠ€νƒ€μΌμ„ 적용되게
λ³€μˆ˜ μ„€μ • μΆ”κ°€ !!

  • μˆ˜μ • ν›„

κ²°κ³Ό


02. λ©”λͺ¨ κΈ°λŠ₯ μΆ”κ°€

πŸ“ƒ 쑰건 :

  • μΌλ§ˆλ‹€ 선택이 κ°€λŠ₯ν•΄μ•Ό ν•˜λ©°, ν•΄λ‹Ή 일을 μ„ νƒν–ˆμ„ 경우 λ©”λͺ¨μž₯이 λ…ΈμΆœλœλ‹€. βœ”οΈ
  • λ©”λͺ¨μž₯μ—λŠ” λ©”λͺ¨λ₯Ό μž…λ ₯ν•  수 μžˆλ‹€. βœ”οΈ
  • λ©”λͺ¨λ₯Ό μž…λ ₯ν•œ ν›„ λ‹€μ‹œ μΊ˜λ¦°λ” ν™”λ©΄μœΌλ‘œ λŒμ•„μ˜€λ©΄
    ν•΄λ‹Ή 일에 μž‘μ€ μ›μœΌλ‘œ λ©”λͺ¨κ°€ μžˆμŒμ„ ν‘œμ‹œν•œλ‹€. βœ”οΈ
  • λ©”λͺ¨ 기둝이 μžˆλŠ” λ‚ μ§œλ₯Ό 클릭할 경우 기둝 ν–ˆλ˜ λ©”λͺ¨μž₯이 λ…ΈμΆœλœλ‹€. βœ”οΈ
  • λ©”λͺ¨μž₯에 κΈ°λ‘ν•œ λ‚΄μš©μ„ μˆ˜μ •ν•  수 μžˆλ‹€. βœ”οΈ

1μ°¨ ν—€λ”© κ²°κ³Ό

2μ°¨ ν—€λ”© κ²°κ³Ό

κΈ°λŠ₯ μžμ²΄λŠ” κ΅¬ν˜„μ„ ν–ˆλŠ”λ° λ¬Έμ œλŠ”
λ™μž‘ μ—°κ²°λ˜λŠ” λΆ€λΆ„ λΆ€λΆ„ λ””ν…ŒμΌμ μΈ κ±°λž‘ μš”μ†ŒλΌλ¦¬ λΆ€λ”ͺν˜€μ„œ λ‚˜νƒ€λ‚˜μ§€ μ•ŠλŠ” 것 같은
λΆ€λΆ„λ“€μ˜ μˆ˜μ •μ΄ ν•„μš”ν•˜λ‹€.

λ°€μƒˆλ©΄μ„œ ν–ˆλŠ”λ°λ„ μ˜¨μ „νžˆ κ΅¬ν˜„μ„ ν•΄λ‚΄μ§„ λͺ»ν•΄μ„œ λ‹΅λ‹΅ν–ˆλ‹€.
μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν•¨μˆ˜ ν•˜λ‚˜ κ΅¬ν˜„ μ„±κ³΅ν•˜λ©΄ μ’‹μ•„ν•˜λ‹€κ°€
λ‹€λ₯Έλ° 보면 λ‹€ λ™μž‘μ΄ λ§κ°€μ Έμžˆλ‹€....
λ¬΄ν•œ ꡴레 ν•˜λ‹€ 보면 λ‚΄κ°€ 뭘 ν–ˆλŠ”μ§€μ‘°μ°¨ 더 ν—·κ°ˆλ €μ§€κ³ 
ν•΄κ²°κ³Όμ • 쓰렀닀가도 였래 λΆ™μž‘κ³  μžˆμ–΄μ„œ 정리쑰차 쉽지 μ•Šλ‹€.

μ•„μœΌ !!!!!!! 이 μ‚¬λžŒμ•„ μ •μ‹  μ°¨λ €

gptμƒ˜μ΄λž‘λ„ 무수히 λ§Žμ€ λŒ€ν™”λ₯Ό ν–ˆμ§€λ§Œ
λ‘˜ λ‹€ μ§€μΉ¨ ...
λ‹€λ₯Έ λΆ„λ“€ ν•œ ν”„λ‘œμ νŠΈλ₯Ό λ³΄λ©΄μ„œ
κ°„λ‹¨ν•˜λ©΄μ„œλ„ 되게 ν€„λ¦¬ν‹°μžˆκ²Œ κ²°κ³Όκ°€ λ‚˜μ™”λŠ”λ°
λ”°λΌν•˜μ§€ μ•Šκ³  혼자 해보렀고 도전정신 μ™Έμ³€λ‹€κ°€
였히렀 μ‹œκ°„μ„ μ•„μ£Ό ... 효율적이게 λͺ»μ“΄ λŠλ‚Œμ΄ λ“€μ–΄
피곀함과 λ”λΆˆμ–΄ μŠ¬νŽλ‹€.

λšλ”±μ•„... κ·Έλž˜λ„ ν•˜μž. λ‹€μ‹œ ν•΄λ³΄μžμš”

<μ•žμœΌλ‘œ 남은 κ³ μΉ  λΆ€λΆ„>

λ©”λͺ¨μž₯에 μž”λœ© 독이 μ°¬ κΈ€ κ·ΈλŒ€λ‘œ .. 퍼왔닀.

  1. λ©”λͺ¨κ°€ μžˆμ„ 땐 λ©”λͺ¨ λ²„νŠΌ μ•ˆ 눌리게

  2. ν† μš”μΌ/μΌμš”μΌ ꡬ뢄 색 μ™œ λΉ μ Έλ‚˜κ° ?

  3. λͺ¨λ“  λ‚ μ§œ 클릭 되게 ν•˜κΈ° !! 주말만 선택 μ•ˆ 되고 있음

  4. ν΄λ¦­ν•œ λ‚ μ§œλž‘ λ©”λͺ¨μ—μ„œ λ‚˜νƒ€λ‚Έ λ‚ μ§œλž‘ μ•ˆ 맞음

  5. λ©”λͺ¨ μ €μž₯μ‹œ 원 ν‘œμ‹œ - > μ‚­μ œμ‹œ 원 μ‚­μ œ

  6. λ©”λͺ¨ 없을 땐 textarea readonly ν’€κ³ 
    λ©”λͺ¨ μžˆμ„ 땐 읽음만 되게 ν•˜κ±°λ‚˜ /
    λ©”λͺ¨ 없을 땐 λ©”λͺ¨ λ²„νŠΌ μ‚¬μš© κ°€λŠ₯
    λ©”λͺ¨ μžˆμ„ 땐 λ©”λͺ¨ λ²„νŠΌ μˆ¨κΈ°κ±°λ‚˜ λΉ„ν™œμ„±ν™”

  7. 그리고 textarea μ˜μ—­ 말고 λ³΄μ—¬μ§€λŠ” κ±Έ ul li 둜 ν•΄μ„œ
    리슀트 처럼 ν•΄μ£Όκ±°λ‚˜ .. ν…Œμ΄λΈ” 처럼 ν•΄μ£Όκ±°λ‚˜ ν•΄μ•Ό ν•  λ“―.
    λ§Œμ•½ λ‚ μ§œ ν•˜λ‚˜μ— ν•˜λ‚˜μ˜ κΈ€λ§Œ μ“°κ²Œ ν•  κ±°λ©΄ μ§€κΈˆλŒ€λ‘œ μ§„ν–‰


μ§€κΈˆ μŠ€ν¬λ¦½νŠΈλ‚˜ μŠ€νƒ€μΌμ—μ„œ λ­”κ°€ μΆ©λŒμΌμ–΄λ‚˜μ„œ
λ‚ μ§œλž‘ 주말 선택 μ•ˆ λ˜λŠ”κ±°λž‘ 주말색깔 μ•ˆ λ“€μ–΄κ°€λŠ”κ±°
κ·Έλž˜μ„œ μ•ˆ λ˜λŠ” 것 κ°™λ‹€.

그리고 λ©”λͺ¨μž₯ μ˜μ—­μ„ μ‚¬μš©μžκ°€ 닫을 수 μžˆκ²Œλ„ ν•΄μ•Ό ν•  λ“― !

λ©”λͺ¨ μ €μž₯ ν•˜κ³  λ‚˜μ„œ λ°”λ‘œ μˆ˜μ •ν• λ €κ³  ν•˜λ©΄ 값을 인식 λͺ»ν•˜κ³  있음
λ‹€λ₯Έλ° κ°”λ‹€κ°€ μ‹œλ„ν•˜λ©΄ 또 그땐 되고 ... ν›„μ•„

이럴수둝 더 ν•΄κ²°ν•˜κ³  싢은 마음이 컀진닀 !!!!

λ‹€μ‹œ ν•˜μž α•™(⇀_↼‡‡)α•—

++ css보단 κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λŠ”λ° 집쀑해야겠닀고 μƒκ°ν•΄μ„œ
κΈ°λŠ₯이 μž‘λ™ν•˜λŠ”κ²ƒμ— μ΄ˆμ μ„ 두고 λ‹€μ‹œ λ§Œλ“€μ—ˆλ‹€.

그런데 κΈ°λŠ₯듀은 κ΅¬ν˜„λμ§€λ§Œ ν•œ κ°€μ§€ 계속 μ•ˆ 되던 뢀뢄이
λ©”λͺ¨λ₯Ό μ €μž₯ν•˜λ©΄ ν•΄λ‹Ή λ©”λͺ¨κ°€ μ €μž₯된 λ‚ μ§œμ—λŠ” 원 λͺ¨μ–‘μ˜ ν‘œμ‹œλ₯Ό ν•΄μ£ΌλŠ” κ±Έ
계속 μ‹œλ„ν–ˆμ§€λ§Œ 원은 코빼기도 λ‚˜νƒ€λ‚˜μ§€ μ•Šμ•˜λ‹€.

μ €μž₯ν•  λ•Œ 원이 μΆ”κ°€λ˜κ²ŒκΉŒμ§„ ν–ˆμ§€λ§Œ λ‹€λ₯Έ λ‚ μ§œλ₯Ό ν΄λ¦­ν•˜λ©΄ 원이 사라지고 μžˆλ‹€.

profile
μ›Ήκ°œλ°œμž κΏˆλ‚˜λ¬΄ κΎΈμ€€ν•¨μ˜ νž˜μ„ λ―ΏμŠ΅λ‹ˆλ‹€ 🚢

0개의 λŒ“κΈ€