Krok 11: przycisk Dziś i strzałki na klawiaturze
Kalendarz z elementów DOM - Kalendarz w JavaScript krok po kroku (HTML/CSS/JS)
Przycisk `#today` ustawia stan z powrotem na bieżący miesiąc. Strzałki w lewo i w prawo działają jak przyciski: nasłuchiwacz `keydown` na całym dokumencie sprawdza `e.key` i woła tę samą funkcję `move`. Jedna funkcja, trzy sposoby jej wywołania.
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="utf-8">
<title>Kalendarz</title>
<style>
body { font-family: sans-serif; max-width: 36em; line-height: 1.4; }
input, select, button, textarea { font: inherit; padding: 0.2em 0.4em; }
table { border-collapse: collapse; }
th, td { border: 1px solid #94a3b8; padding: 0.2em 0.6em; }
#calendar { display: grid; grid-template-columns: repeat(7, 40px); gap: 6px; }
#calendar div { height: 40px; line-height: 40px; text-align: center; background: lightgrey; }
#calendar .day-name { background: darkgrey; color: white; }
#calendar .saturday { background: lightblue; color: white; }
#calendar .sunday { background: steelblue; color: white; }
#calendar .none { background: white; }
#calendar .today { background: crimson; color: white; }
#calendar .day { cursor: pointer; }
#calendar .selected { outline: 3px solid #f59e0b; }
.bar { display: flex; align-items: center; gap: 0.5em; width: 316px; }
.bar strong { flex: 1; text-align: center; }
table.cal td, table.cal th { width: 2.2em; text-align: center; }
table.cal .saturday, table.cal .sunday { color: steelblue; }
table.cal .today { background: crimson; color: white; }
</style>
</head>
<body>
<p class="bar">
<button id="prev"><</button>
<strong id="title"></strong>
<button id="next">></button>
<button id="today">Dziś</button>
</p>
<div id="calendar"></div>
<p id="info">Kliknij dzień</p>
<script>
const MONTHS = ['styczeń', 'luty', 'marzec', 'kwiecień', 'maj', 'czerwiec',
'lipiec', 'sierpień', 'wrzesień', 'październik', 'listopad', 'grudzień'];
const DAY_NAMES = ['Pn', 'Wt', 'Śr', 'Cz', 'Pt', 'So', 'Nd'];
const WEEKEND = ['', '', '', '', '', 'saturday', 'sunday'];
function cell(text, ...classes) {
const div = document.createElement('div');
div.textContent = text;
div.classList.add(...classes.filter(Boolean));
return div;
}
const today = new Date();
const calendar = document.getElementById('calendar');
function render(year, month) {
const firstDay = (new Date(year, month - 1, 1).getDay() + 6) % 7;
const days = new Date(year, month, 0).getDate();
const fragment = document.createDocumentFragment();
DAY_NAMES.forEach((name, k) => fragment.append(cell(name, 'day-name', WEEKEND[k])));
for (let k = 0; k < firstDay; k++) fragment.append(cell('', 'none'));
for (let i = 1; i <= days; i++) {
const isToday = year === today.getFullYear() && month === today.getMonth() + 1 && i === today.getDate();
const div = cell(i, 'day', isToday ? 'today' : WEEKEND[(firstDay + i - 1) % 7]);
div.dataset.day = i;
fragment.append(div);
}
calendar.replaceChildren(fragment);
document.getElementById('title').textContent = `${MONTHS[month - 1]} ${year}`;
}
let year = today.getFullYear();
let month = today.getMonth() + 1;
function move(delta) {
month += delta;
if (month > 12) {
month = 1;
year++;
} else if (month < 1) {
month = 12;
year--;
}
render(year, month);
}
const pad = n => String(n).padStart(2, '0');
calendar.addEventListener('click', e => {
const div = e.target.closest('.day');
if (!div) return;
calendar.querySelector('.selected')?.classList.remove('selected');
div.classList.add('selected');
document.getElementById('info').textContent = `Wybrano: ${pad(div.dataset.day)}.${pad(month)}.${year}`;
});
document.getElementById('prev').addEventListener('click', () => move(-1));
document.getElementById('next').addEventListener('click', () => move(1));
document.getElementById('today').addEventListener('click', () => {
year = today.getFullYear();
month = today.getMonth() + 1;
render(year, month);
});
document.addEventListener('keydown', e => {
if (e.key === 'ArrowLeft') move(-1);
if (e.key === 'ArrowRight') move(1);
});
render(year, month);
</script>
</body>
</html>Ładowanie interaktywnego edytora... Jeśli się nie pojawi, włącz JavaScript.
Wszystkie lekcje kursu Kalendarz w JavaScript krok po kroku·Zaloguj się, aby zapisać postęp na koncie.