이 프로젝트는 한 페이지에 1년 전체 달력을 표시하는 웹 애플리케이션입니다. PHP로 작성된 원본(Neatnik의 Calendar)을 순수 HTML/CSS/JavaScript로 변환하고, 한국어 지원과 공휴일 표시 기능을 추가했습니다.
- 1년 전체 달력을 한 페이지에 표시
- 자동 크기 조절 (반응형 디자인)
- 주말 강조 표시
- 공휴일 표시 및 툴팁
- 연도 변경 기능
- 인쇄 최적화
- Frontend: HTML5, CSS3, JavaScript (Vanilla)
- 폰트:
- Noto Sans KR (한글)
- Inter, Oswald (영문)
- 공휴일 API: holidays.hyunbin.page
CSS에서 vmin
단위를 사용하여 뷰포트 크기에 따라 자동으로 조절되도록 구현:
td, th {
padding: .3vmin .3vmin;
font-size: .9vmin;
}
인쇄 시 스타일 조정을 위한 미디어 쿼리 사용:
@media print {
@page {
margin: 0;
padding: 1em;
}
td {
font-size: 8px !important;
}
.weekend {
background: #d8d8d8 !important;
}
}
공휴일 정보는 외부 API를 통해 가져옵니다:
fetch('https://holidays.hyunbin.page/basic.json')
.then(response => response.json())
.then(holidaysData => {
const holidays = holidaysData[year] || {};
createCalendarWithHolidays(year, layout, holidays);
});
공휴일 스타일링:
.holiday {
background: #ffcccc50;
font-weight: bold;
}
달력 생성에 필요한 핵심 함수들:
function getDaysInMonth(year, month) {
return new Date(year, month, 0).getDate();
}
function getFirstDayOfMonth(year, month) {
return new Date(year, month - 1, 1).getDay();
}
달력은 다음 URL 파라미터를 지원합니다:
year
: 표시할 연도 (예:?year=2025
)layout
: 레이아웃 형식aligned-weekdays
: 요일 정렬 모드- 기본값: 일반 모드
- 공휴일 API가 사용 불가능할 경우 공휴일 표시가 되지 않음
- JavaScript가 비활성화된 환경에서는 작동하지 않음
- 매우 작은 화면에서는 가독성이 떨어질 수 있음
- 공휴일 데이터의 로컬 캐싱 구현
- 오프라인 지원 (PWA)
- 다크 모드 지원
- 사용자 정의 일정 추가 기능
- 저장소 클론:
git clone https://github.com/jkf87/annual-calendar.git
cd annual-calendar
- 로컬 서버 실행 (선택사항):
- Python:
python -m http.server 8000
- Node.js:
npx serve
- PHP:
php -S localhost:8000
- Python:
-
날짜 계산 시 JavaScript의 Date 객체 특성 주의
- 월은 0부터 시작 (0-11)
- 요일도 0부터 시작 (0: 일요일)
-
인쇄 스타일 테스트
- 다양한 용지 크기로 테스트
- 브라우저의 인쇄 미리보기 활용
-
공휴일 API 사용 시
- API 응답 형식:
{"YYYY-MM-DD": "공휴일명"}
- 오류 처리 필수
- CORS 정책 확인
- API 응답 형식:
이 프로젝트는 MIT 라이선스 하에 배포됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.