[SIST] Web_javascript_days05_달력 만들기

2022. 6. 4. 18:41·TIL/Web(HTML, CSS, JS, jQuery)
728x90
반응형

1) 마지막 날짜와 1일이 무슨요일인지 가져오기

 

2) 오늘 날짜에 span 태그로 묶기

 

3) select 태그에 년도, 월, 일 채우기

 

ㄱ. 년도 채우기

년도는 1970년 ~ 2050년까지 채우고

Options 객체의 new Option을 사용하여 select 태그에 옵션 값을 채워넣었다.

만약 년도가 오늘 날짜의 년도와 동일하다면 new Option으로 selected 속성을 추가하였다.

 

ㄴ. 월 채우기

오늘 날짜에 해당하는 월이면 selected 속성을 추가한다.

 

ㄷ. 일 채우기

해당 월의 일을 채우기 위해서는 마지막 날짜를 구해와서 for 문을 돌려야 한다.

오늘 날짜에 해당하는 일이면 selected 속성을 추가한다.

 

4) select 태그의 change 이벤트가 일어날 때 기존에 있던 옵션 값들 삭제하기

삭제하는 이유?

만약, 내가 7월을 선택하면 7월은 31일까지 있어 옵션 값이 31일 까지 생성이 된다. 그 후에 다시 6월을 선택했을 때 6월은 30일까지 있어 30일까지 생성하게 되는데 6월을 선택하여 30일까지 새로 생성하여도 7월에 생성했던 31일 옵션 값이 남아있기 때문에 이전에 있던 option 태그를 다 삭제하여야 한다.


달력만드는 전체 코드

[style 태그의 css]

<style>
    select {
       width: 100px;
       text-align: center;
    }

    * {
       box-sizing: border-box;
    }

    ul {
       list-style-type: none;
    }

    body {
       font-family: Verdana, sans-serif;
    }

    .month {
       padding: 70px 25px;
       width: 100%;
       background: #1abc9c;
       text-align: center;
    }

    .month ul {
       margin: 0;
       padding: 0;
    }

    .month ul li {
       color: white;
       font-size: 20px;
       text-transform: uppercase;
       letter-spacing: 3px;
    }

    .month .prev {
       float: left;
       padding-top: 10px;
    }

    .month .next {
       float: right;
       padding-top: 10px;
    }

    .weekdays {
       margin: 0;
       padding: 10px 0;
       background-color: #ddd;
    }

    .weekdays li {
       display: inline-block;
       width: 13.6%;
       color: #666;
       text-align: center;
    }

    .days {
       padding: 10px 0;
       background: #eee;
       margin: 0;
    }

    .days li {
       list-style-type: none;
       display: inline-block;
       width: 13.6%;
       text-align: center;
       margin-bottom: 5px;
       font-size: 12px;
       color: #777;
    }

    .days li .active {
       padding: 5px;
       background: #1abc9c;
       color: white !important
    }
</style>

 

[body태그의 뼈대]

 

[script 코딩 - javascript]

<script>
	// 마지막 날짜 구하기
	function getLastDay(year, month) {
		var d = new Date(year, month);
		d.setDate(0); // Tip! setDate에 0을 주면 하루를 뺀다.
		return d.getDate(); // 30
	}
	
    // 1일은 무슨요일인지 구하기
	function getDayOfWeek(year, month, day){
		// 주의! 월은 1월(0) ~ 12월(11)
		var d = new Date(year, month-1, day);
		return d.getDay(); // 0(일),1(월) ~ 6(토)
	}
	
	// 달력 그리기 함수
	function printCalendar(year, month){
		// 이전에 생성된 li 태그들 제거
		ulDays.innerHTML = "";
		
		// 마지막 날짜와 요일 가져오기
		var lastday = getLastDay(year, month);
		var dayOfWeek = getDayOfWeek(year, month, 1);
		
		// dayOfWeek 만큼 빈 공간을 li태그로 만들어줌
		// ex) 수요일이라 3이 오면 앞에 3칸을 띄우고 수요일에 1일을 찍기 위한 작업
		for (var i = 0; i < dayOfWeek; i++) {
			var liDay = document.createElement("li");
			ulDays.appendChild(liDay);
		} // for
		
		// 1일부터 마지막 날짜(lastday)까지 li 태그 만들어서 찍기
		for (var d = 1; d <= lastday; d++) {
			var li_day = document.createElement("li");
			// 오늘 날짜가 3일이라면.. <li><span class="active">3</span></li>
			// li_day.innerText = d;
			var li_day_text = document.createTextNode(d);
			if (d == nowDate) {
				var li_span = document.createElement("span"); // <span></span>
				li_span.setAttribute("class", "active"); // <span class="active"></span>
				li_span.appendChild(li_day_text); // <span class="active">3</span>
				li_day.appendChild(li_span); // <li><span class="active"></span></li>
			} else{
				li_day.appendChild(li_day_text); /* <li>d</li> */
			}
					
			ulDays.appendChild(li_day);
		} // for
	} // printCalendar 함수
	
	printCalendar(nowYear, nowMonth); // 함수 호출
</script>

<script>
	// cmbyear 채우기(년도 채우기)
	var cmbyear = document.getElementById("cmbyear");
	for (var y = 1970; y <= 2050; y++) {
		// js에서 Option 객체 - new Option(텍스트값, 밸류값);
		// cmbyear.options[0] = new Option(1970, 1970);
		// cmbyear.options[1] = new Option(1971, 1971);
		
		// js selected Option 객체 - 선택된 옵션 객체	: Option(text, value, defaultSelected, selected);
		if(y == 2022){
			cmbyear.options[y-1970] = new Option(y, y, true, true); // 2022년도에만 selected 속성 주어짐
		} else{
			cmbyear.options[y-1970] = new Option(y, y);
		}
	} // for
	
	// cmbmonth 채우기
	var cmbmonth = document.getElementById("cmbmonth");
	for (var m = 1; m <= 12; m++) {
		cmbmonth.options[m-1] = new Option(m, m);
	}
	cmbmonth.selectedIndex = 6-1; // selected 속성 주기
	
	// cmbdate 채우기
	function getLastDay(year, month) {
		var d = new Date(year, month);
		d.setDate(0); // Tip! setDate에 0을 주면 하루를 뺀다.
		return d.getDate(); 
	} // getLastDay
	
	var cmbdate = document.getElementById("cmbdate");
	var lastday = getLastDay(2022, 6);
	for (var d = 1; d <= lastday; d++) {
		cmbdate.options[d-1] = new Option(d, d);
	} // for
	cmbdate.selectedIndex = 3-1; // selected 속성 주기
</script>

728x90
반응형

'TIL > Web(HTML, CSS, JS, jQuery)' 카테고리의 다른 글

[javascript] 이벤트(event)  (0) 2022.06.06
[javascript / jquery] radio 버튼 check 값 가져오기  (0) 2022.06.06
[SIST] Web_javascript_days05/days06  (0) 2022.06.04
[SIST] Web_javascript_days05_Date(날짜 객체)  (0) 2022.06.03
[SIST] Web_javascript_days05_forin(), forof(), entries(), arguments  (0) 2022.06.03
'TIL/Web(HTML, CSS, JS, jQuery)' 카테고리의 다른 글
  • [javascript] 이벤트(event)
  • [javascript / jquery] radio 버튼 check 값 가져오기
  • [SIST] Web_javascript_days05/days06
  • [SIST] Web_javascript_days05_Date(날짜 객체)
야리니
야리니
오늘보다 내일 더 성장하는 개발자가 되기 위한 야리니 블로그입니다 :)
    반응형
    250x250
  • 야리니
    야리니의 step by step
    야리니
  • 링크

    • GitHub
    • Linkedin
  • 전체
    오늘
    어제
    • 분류 전체보기 (477)
      • TIL (379)
        • Java (97)
        • Kotlin (28)
        • JPA (16)
        • Spring (37)
        • Oracle (22)
        • JDBC (7)
        • Web(HTML, CSS, JS, jQuery) (90)
        • View Template (31)
        • AWS (7)
        • HTTP (7)
        • CS (5)
        • Linux, Unix (2)
        • Python (20)
      • Trouble Shooting(Error) (37)
      • Algorithm (15)
      • Git,GitHub (8)
      • Diary (23)
      • 독서 (9)
      • Etc (6)
        • Mac (1)
        • 학원준비과정 (2)
  • 블로그 메뉴

    • 방명록
    • 태그
  • 공지사항

    • 안녕하세요 :)
  • 인기 글

  • 태그

    국비지원학원
    코틀린
    CSS
    Kotlin
    java
    java기초
    oracle
    HTML
    쌍용교육센터
    백엔드 개발자
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
야리니
[SIST] Web_javascript_days05_달력 만들기
상단으로

티스토리툴바