Цивільно-імперські послуги; структурне будівництво
Створення програми для календаря з Javascript та локальним зберіганням
Table of Contents
Створення користувацького календарного додатка є відмінним способом поглиблення розуміння JavaScript, моделі об'єкта браузера Document (DOM), а також простійності клієнтів. Використовуючи API Web Storage — особливо локальне зберігання — ви можете створити повнофункціональний, календар подій, який повністю працює в браузері, не потребує сервера резервного копіювання або бази даних. Цей підручник пролягає вам через кожен крок, від структурування HTML для реалізації розширених функцій, таких як керування подіями.
Чому будувати календар?
До вбудованих бібліотек календарів (наприклад, FullCalendar або DayPilot) пропонують швидкі рішення, але побудувати один з нуля дає вам повну контроль над інтерфейсом користувача, даними обробки та продуктивністю. Ви також отримуєте практичний досвід роботи з основними концепціями JavaScript, такими як об'єкт , делегація подій та API. Отриманий додаток може бути розширений в інструмент управління проектами, систему бронювання або персональний журнал.
Налаштування структури HTML
Почати з чистого HTML скелета. Календар потребує трьох основних компонентів: навігаційний рядок (для змін місяця), сітку контейнер (для денних клітин), а також вхідний вигляд події. Використовуйте елементи з іменами смантичних класів для легкого укладіння та сценаріїв.
<div id="calendar">
<div class="calendar-header">
<button id="prevBtn">←</button>
<h2 id="monthYear"></h2>
<button id="nextBtn">→</button>
</div>
<div class="calendar-grid"></div>
<div class="event-form">
<input type="text" id="eventInput" placeholder="Add an event..." />
<button id="saveEvent">Save</button>
</div>
</div>
буде змонтовано динамічно за допомогою JavaScript. Для мобільних пристроїв скористайтеся 7‐column CSS-мережею (один для кожного дня тижня). Зарезервувати перший ряд для імен днів (Sun-Sat).
Стилізація календаря з CSS
Чистий, чуйний CSS перетворює сирий HTML в інтуїтивний інтерфейс. Використовуйте CSS Grid для календарної сітки, налаштування . Додати локатори протягом днів до першого місяця. Для доступності забезпечити достатній колірний контраст і включати стилів на інтерактивних елементах. Мінімальний стильний аркуш показано нижче (внутрішній або пов'язаний).
.calendar-grid {
display: grid;
grid-template-columns: repeat(7, 1fr);
gap: 2px;
}
.day-cell {
min-height: 80px;
border: 1px solid #ccc;
padding: 4px;
position: relative;
}
.day-cell.today {
background-color: #eef;
}
.event {
font-size: 0.8em;
background: #4caf50;
color: #fff;
padding: 2px 4px;
margin: 1px 0;
border-radius: 3px;
cursor: pointer;
}
Використовуйте медіа-питання для зменшення розміру комірки на вузькому екрані, а також вивчіть текст події та показавши лише кількість.
Основні напрямки: Створення графічної сітки
Усі динамічні рендерингові життя в JavaScript. Центральна функція , розраховує перший день місяця і загальну кількість днів. Використовуйте , щоб отримати індекс дня (0 = неділя). Потім генеруйте клітинки в петлі від 1 до останнього дня місяця.
Робота з об'єктом Дата
об'єкт є резервним копії логіки календаря. Щоб отримати останній день місяця, скористайтеся (day 0 наступного місяця дає останній день поточного місяця). Зберігайте поточний місяць і рік у глобальних змінних, так навігація може оновити їх.
Будівництво сітки
function renderCalendar() {
const grid = document.querySelector('.calendar-grid');
grid.innerHTML = '';
const firstDay = new Date(currentYear, currentMonth, 1).getDay();
const daysInMonth = new Date(currentYear, currentMonth + 1, 0).getDate();
// Add empty cells for days before the 1st
for (let i = 0; i < firstDay; i++) {
const empty = document.createElement('div');
empty.className = 'day-cell empty';
grid.appendChild(empty);
}
// Generate day cells
for (let day = 1; day <= daysInMonth; day++) {
const cell = document.createElement('div');
cell.className = 'day-cell';
cell.dataset.date = `${currentYear}-${currentMonth + 1}-${day}`;
const dateSpan = document.createElement('span');
dateSpan.textContent = day;
cell.appendChild(dateSpan);
// Highlight today
const today = new Date();
if (currentYear === today.getFullYear() && currentMonth === today.getMonth() && day === today.getDate()) {
cell.classList.add('today');
}
// Load events for this date
loadEvents(cell);
grid.appendChild(cell);
}
}
Оновлення місяця / року відображення в заголовку:
Навігація між місяцями
Прикріпіть натиснути подію слухачам до попередньої та наступного кнопки. Настроювання або розтягування , скоригуючи рік, якщо необхідно (наприклад, після грудня приїжджає до січня наступного року). Після оновлення змін, виклик знову.
document.getElementById('prevBtn').addEventListener('click', () => {
currentMonth--;
if (currentMonth < 0) {
currentMonth = 11;
currentYear--;
}
renderCalendar();
});
document.getElementById('nextBtn').addEventListener('click', () => {
currentMonth++;
if (currentMonth > 11) {
currentMonth = 0;
currentYear++;
}
renderCalendar();
});
Для додаткової зручності додайте Today] кнопку, яка скидає погляд на поточний місяць і виділить поточний день.
Зберігання та поглинання; Залучення заходів з локальним зберіганням
Local Storage] забезпечує простий магазин ключових значень, який виживляє перезавантаження браузера. Використовуйте послідовний шаблон ключа, наприклад, , зберігання JSON масивів об'єктів події. Включаючи властивості, такі як , , , і .
Економія нового заходу
Коли користувач натискає кнопку «Зберегти», захоплює значення введення та в даний час вибрану дату. (Ви можете додати пікіратор дати або визначити, який торкнувся денна комірка.) Виконайте будь-які існуючі події для цієї дати з локального сховища, відштовхуйте новий захід, потім збережіть назад.
function saveEvent(dateKey, eventText) {
const existing = JSON.parse(localStorage.getItem(dateKey)) || [];
existing.push({ id: Date.now(), text: eventText, time: new Date().toLocaleTimeString() });
localStorage.setItem(dateKey, JSON.stringify(existing));
renderCalendar(); // refresh to show new event
}
Навантаження подій в денні клітини
Усередині , для кожної нетерпічної денної комірки, виклику функції, яка вимагає локального зберігання для цього ключа дати. Якщо події існують, петлі через них і додаток елементи до комірки.
function loadEvents(cell) {
const dateKey = cell.dataset.date;
const events = JSON.parse(localStorage.getItem(dateKey));
if (!events) return;
events.forEach(evt => {
const eventDiv = document.createElement('div');
eventDiv.className = 'event';
eventDiv.textContent = evt.text;
eventDiv.dataset.id = evt.id;
// Optional: add a delete button
cell.appendChild(eventDiv);
});
}
Видалення та редагування подій
Щоб видалити, прикладіть на кожен елемент події (або використовуйте делегацію подій). Виконайте масив на цю дату, відфільтруйте захід за допомогою його , і заощаджуйте оновлений масив назад до локального сховища. Редагування може бути зроблено двічі, натиснувши на захід, підказуючи новий текст, і оновлення масиву.
Додаткові функції для підвищення функціональності
Після роботи базового календаря ви можете додати функції, які значно покращують роботу користувача.
Колоритні події за типом
Дозволити користувачів призначити категорії (наприклад, роботу, особисте здоров'я). Зберігти поле в локальному сховищах. У CSS, визначити класи, такі як , і застосувати їх динамічно.
Перетягніть
Використовуйте HTML5 Перетягніть та перемістіть API для переміщення подій між денними клітинами. Коли подія падає на інший день, оновити ключ дати в локальному сховища: видалити захід з початкового масиву дати та відштовхувати його до нового масиву дати.
Заходи з рецидивами (попередня / Щомісячна)
Додати варіант «Репеят» при збереженні події. У функції завантаження, розрахуйте, якщо дата поточного відповідає правила рекурентності (наприклад, кожен понеділок) і відображайте захід відповідно. Правила рекурентності магазину в окремому ключі локального зберігання, щоб уникнути дублювання.
Календар подій
Переключення між місяцями та видами тижня. Перегляд тижня показує тільки поточні дні тижня з більш горизонтальним простором. Невеликий місяць-перегляд міні календар дозволяє користувачам швидко стрибати на будь-яку дату.
Створення облікового запису та доступності
Тестувати календар на різні розміри екрана. Використовуйте запити, щоб стежити денні клітини вертикально на дуже невеликих екранах або зменшити насипання. Забезпечити всі інтерактивні елементи клавіатури доступні: прикріпіть події для Enter і Escape. Використовуйте атрибути на кнопках і регіонах для зчитувачів екрана, щоб оголосити зміни місяця і додавання подій.
Поради щодо управління даними
- Описи зберігання даних : Замість читання/запису Місцевого сховища для кожної операції події, вставте всі події місяця в об'єкті JavaScript і періодично змініть їх.
- => Розмір події: Тримайте об'єкти події невеликими. Уникайте зберігання великих рядків або бінарних даних.
- Fallback for Storage Limits: Local Storage зазвичай заблокований в 5–10 Мб. При зберіганні майже повністю.
- Використовувати ІндексованийDB для великих даних: Якщо ваш календар буде тримати тисячі подій, розглянути IndexedDB] для кращого виконання та запиту можливостей.
Висновок
Створення користувальницького календарного додатку з JavaScript та Local Storage - це винагорода проекту, яка заточує ваші навички переднього рівня. Ви навчитеся маніпулювати DOM, працювати з датами, керувати станом без сервера, а також обробляти взаємодію користувача. База коду може бути розширена з синхронізацією сервера, хмарним резервним копіюванням або інтеграцією з зовнішніми календарями через Google Calendar API. Починаючи з базової сітки, додайте персистенцію, а потім шар на рисах, таких як drag‐and‐drop і повторювані події. Результат - це індивідуальний календар, який заважає, як вам потрібно.
Для подальшого читання, вивчення Надання документації API та Drag та Drop API] на MDN. Щасливі кодування!