티스토리 뷰
카테고리 기능이 추가된 통합 코드.html
0.01MB
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>카테고리별 일정 관리 달력</title>
<style>
:root { --primary: #4a90e2; --today-bg: #fff9c4; }
body { font-family: sans-serif; display: flex; justify-content: center; padding: 20px; background: #f5f5f5; }
.calendar-container { width: 450px; background: #fff; padding: 20px; border-radius: 12px; box-shadow: 0 5px 15px rgba(0,0,0,0.1); }
.calendar-header { display: flex; justify-content: space-between; margin-bottom: 20px; }
.calendar-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 5px; text-align: center; }
.day { aspect-ratio: 1/1; display: flex; align-items: center; justify-content: center; cursor: pointer; border-radius: 8px; position: relative; }
.day:hover { background: #eee; }
.day.today { background: var(--today-bg); font-weight: bold; }
.has-event::after { content: ''; position: absolute; bottom: 5px; width: 5px; height: 5px; background: red; border-radius: 50%; }
/* 카테고리 태그 스타일 */
.event-section { margin-top: 20px; border-top: 1px solid #ddd; padding-top: 15px; }
.event-item { display: flex; align-items: center; margin-bottom: 8px; font-size: 14px; }
.badge {
padding: 2px 8px;
border-radius: 4px;
color: white;
font-size: 11px;
font-weight: bold;
margin-right: 8px;
white-space: nowrap;
}
.bg-category1 { background-color: #ff9800; } /* 전제 */
.bg-category2 { background-color: #4caf50; } /* 지역 */
.no-event { color: #999; }
</style>
</head>
<body>
<div class="calendar-container">
<div class="calendar-header">
<div>
<button id="prevMonth"><</button>
<select id="yearSelect"></select>
<select id="monthSelect"></select>
<button id="nextMonth">></button>
</div>
<button onclick="goToToday()">오늘</button>
</div>
<div class="calendar-grid" id="calendarGrid"></div>
<div class="event-section">
<h3 id="selectedDateTitle"></h3>
<ul id="eventList" style="list-style: none; padding: 0;"></ul>
</div>
</div>
<script>
// 1. 데이터 구조 변경: 문자열 대신 객체를 사용합니다.
const scheduleData = {
"2026-03-03": [
{ category: "전제", content: "프로젝트 통합 기획안 검토" },
{ category: "지역", content: "광주지사 현장 방문" }
],
"2026-03-05": [
{ category: "전제", content: "정기 주간 회의" }
],
"2026-03-10": [
{ category: "지역", content: "부산 파트너사 미팅" }
]
};
let viewDate = new Date();
const yearSelect = document.getElementById('yearSelect');
const monthSelect = document.getElementById('monthSelect');
const grid = document.getElementById('calendarGrid');
function init() {
const curYear = new Date().getFullYear();
for (let i = curYear - 5; i <= curYear + 5; i++) {
const opt = document.createElement('option');
opt.value = i; opt.innerText = i + "년";
yearSelect.appendChild(opt);
}
for (let i = 0; i < 12; i++) {
const opt = document.createElement('option');
opt.value = i; opt.innerText = (i + 1) + "월";
monthSelect.appendChild(opt);
}
renderCalendar();
showEvents(formatDate(new Date()));
}
function formatDate(date) {
return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;
}
function renderCalendar() {
const year = viewDate.getFullYear();
const month = viewDate.getMonth();
yearSelect.value = year;
monthSelect.value = month;
grid.innerHTML = '';
const firstDay = new Date(year, month, 1).getDay();
const lastDate = new Date(year, month + 1, 0).getDate();
const todayStr = formatDate(new Date());
for (let i = 0; i < firstDay; i++) grid.innerHTML += `<div></div>`;
for (let d = 1; d <= lastDate; d++) {
const dateStr = `${year}-${String(month + 1).padStart(2, '0')}-${String(d).padStart(2, '0')}`;
const dayDiv = document.createElement('div');
dayDiv.className = 'day';
if (dateStr === todayStr) dayDiv.classList.add('today');
if (scheduleData[dateStr]) dayDiv.classList.add('has-event');
dayDiv.innerText = d;
dayDiv.onclick = () => showEvents(dateStr);
grid.appendChild(dayDiv);
}
}
// 2. 일정 출력 로직 수정 (카테고리별 뱃지 추가)
function showEvents(dateStr) {
document.getElementById('selectedDateTitle').innerText = dateStr;
const listEl = document.getElementById('eventList');
const events = scheduleData[dateStr] || [];
if (events.length > 0) {
listEl.innerHTML = events.map(ev => {
// 카테고리에 따른 색상 클래스 지정
const badgeClass = (ev.category === '전제') ? 'bg-category1' : 'bg-category2';
return `
<li class="event-item">
<span class="badge ${badgeClass}">${ev.category}</span>
<span class="content">${ev.content}</span>
</li>
`;
}).join('');
} else {
listEl.innerHTML = `<li class="no-event">일정이 없습니다.</li>`;
}
}
function goToToday() { viewDate = new Date(); renderCalendar(); showEvents(formatDate(viewDate)); }
yearSelect.onchange = () => { viewDate.setFullYear(yearSelect.value); renderCalendar(); };
monthSelect.onchange = () => { viewDate.setMonth(monthSelect.value); renderCalendar(); };
document.getElementById('prevMonth').onclick = () => { viewDate.setMonth(viewDate.getMonth() - 1); renderCalendar(); };
document.getElementById('nextMonth').onclick = () => { viewDate.setMonth(viewDate.getMonth() + 1); renderCalendar(); };
init();
</script>
</body>
</html>
※ 해당 내용은 Google Gmini3.0에서 작성되었습니다.
'WEB > JavaScript' 카테고리의 다른 글
| 결재선 지정 선택 팝업 (0) | 2026.03.05 |
|---|---|
| 6주 카테고리 달력 (0) | 2026.03.04 |
| 통합 달력 스크립트 (년/월 이동 + 오늘 일정 자동 표시) (0) | 2026.03.03 |
| 실시간 검색 필터링 (0) | 2026.01.14 |
| [JavaScript]슬라이드 이미지 (0) | 2026.01.03 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 좋은책 #밥프록터 #부의원리
- 자바스크립트countiue
- 와이파이증폭기추천 #와이파이설치
- iptime와이파이증폭기 #와이파이증폭기설치
- 썬크림 #닥터지썬크림 #내돈내산 #내돈내산썬크림 #썬크림추천 #spf50썬크림 #닥터지메디유브이울트라선
- 파비콘사이즈
- 자바스크립트 #javascript #math
- sw기술자평균임금 #2025년 sw기술자 평균임금
- lg그램pro #lg그램 #노트북 #노트북추천 #lg노트북
- 바지락칼국수 #월곡동칼국수 #칼국수맛집
- 탭메뉴자바스크립트
- ajax
- 광주분식 #광주분식맛집 #상추튀김 #상추튀김맛집 #광주상추튀김
- 테스크탑무선랜카드 #무선랜카드 #아이피타이무선랜카드 #a3000mini #무선랜카드추천
- thymeleaf
- jQuery #jQuery이미지슬라이드 #이미지슬라이드
- 좋은책
- css미디어쿼리 #미디어쿼리 #mediaquery
- 무료폰트 #무료웹폰트 #한수원한돋움 #한수원한울림 #한울림체 #한돋움체
- 정보처리기사 #정보처리기사요약 #정보처리기사요점정리
- echart
- 연명의료결정제도 #사전연명의료의향서 #사전연명의료의향서등록기관 #광주사전연명의료의향서
- jdk #jre
- 쇼팬하우어 #좋은책
- 자바스크립트break
- 증폭기 #아이피타임증폭기
- 자바스크립트정규표현식
- 파비콘 #파비콘 사이트에 적용
- SQL명령어 #SQL
- // 사진직: 데이터가 없으면 DEFAULT_IMG 사용 const profileSrc = (d.img && d.img !== "") ? d.img : DEFAULT_IMG;('#user-photo').attr('src'
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
글 보관함

