-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
196 lines (165 loc) · 9 KB
/
script.js
File metadata and controls
196 lines (165 loc) · 9 KB
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
document.addEventListener('DOMContentLoaded', function() {
let simulatedTime = new Date(); // Начальное время
// Задаем начальные значения для анимации при первичной загрузке
updateSecondDuration('2s');
updateMinuteDuration('3s');
updateHourDuration('4s');
setTimeout(() => {
updateSecondDuration('1s');
}, 2000);
setTimeout(() => {
updateMinuteDuration('10s');
}, 3000);
setTimeout(() => {
updateHourDuration('20s');
}, 4000);
// Коэффициент ускорения времени. Например, 8640 ускорит время в 8640 раз, т.е. сутки за 10 секунд
const accelerationFactor = 1;
// Функция для симуляции времени
function simulateTime() {
const realElapsed = Date.now() - simulatedTime.getTime(); // Прошло реального времени
const simulatedElapsed = realElapsed * accelerationFactor; // Ускоряем прошедшее время
return new Date(simulatedTime.getTime() + simulatedElapsed); // Возвращаем новое "ускоренное" время
}
const events = [
{ name: 'Подъем', duration: 60, timerName: 'До выхода из дома' }, // 60 минут
{ name: 'Дорога на работу', duration: 60, timerName: 'До работы' }, // 60 минут
{ name: 'Работа', duration: 180, timerName: 'До обеда' }, // 3 часа
{ name: 'Обед', duration: 60, timerName: 'До конца обеда' }, // 1 час
{ name: 'Работа', duration: 240, timerName: 'До конца работы' }, // 4 часа
{ name: 'Дорога домой', duration: 60, timerName: 'До дома' }, // 1 час
{ name: 'Отдых', duration: 300, timerName: 'До сна' }, // 6 часов
{ name: 'Сон', duration: 480, timerName: 'До подъема' } // 8 часов
];
const eventsContainer = document.getElementById('events');
const timerElement = document.getElementById('lazy');
const eventNameElement = document.getElementById('eventName');
const startTimeInput = document.getElementById('startTimeInput');
let startOfDay;
// Обработчик события изменения времени
startTimeInput.addEventListener('change', () => {
const [hours, minutes] = startTimeInput.value.split(':').map(Number);
startOfDay = new Date();
startOfDay.setHours(hours, minutes, 0, 0);
renderEvents();
updateEvents();
});
/**
* Функция для получения времени начала и конца события.
* @param {Object} event - Объект события с длительностью и другими данными.
* @param {Date} referenceDate - Дата, к которой привязано событие.
* @param {Date} startTime - Время начала события.
* @returns {Object} - Объект с временем начала и окончания события.
*/
function getEventTimes(event, referenceDate, startTime) {
const startTimeCopy = new Date(startTime);
const endTime = new Date(startTimeCopy.getTime() + event.duration * 60000); // Добавляем длительность события
return { startTime: startTimeCopy, endTime };
}
/**
* Функция для рендеринга списка событий.
*/
function renderEvents() {
eventsContainer.innerHTML = ''; // Очищаем предыдущие события
const now = simulateTime(); // Используем ускоренное время
let currentStartTime = new Date(startOfDay);
events.forEach(event => {
const eventElement = document.createElement('div');
eventElement.classList.add('event-item');
const { startTime, endTime } = getEventTimes(event, now, currentStartTime);
currentStartTime = new Date(endTime); // Следующее событие начинается сразу после предыдущего
if (now < startTime) {
// Предстоящее событие
eventElement.innerHTML = `
<span class="event-time">${startTime.toTimeString().substring(0, 5)} - ${endTime.toTimeString().substring(0, 5)}</span>
<span class="event-name">${event.name}</span>
`;
} else if (now >= startTime && now <= endTime) {
// Текущее событие
eventElement.innerHTML = `
<span class="event-status" style="color: #8ffe09">${startTime.toTimeString().substring(0, 5)} - ${endTime.toTimeString().substring(0, 5)}</span>
<span class="event-name" style="color: #8ffe09">${event.name}</span>
`;
} else {
// Прошедшее событие
eventElement.innerHTML = `
<span class="event-status" style="color: #808080">${startTime.toTimeString().substring(0, 5)} - ${endTime.toTimeString().substring(0, 5)}</span>
<span class="event-name" style="color: #808080">${event.name}</span>
`;
}
eventsContainer.appendChild(eventElement);
});
}
/**
* Функция для получения текущего события.
* @param {Date} now - Текущее время.
* @returns {Object|null} - Объект с текущим событием и временем окончания, или null, если текущее событие не найдено.
*/
function getCurrentEvent(now) {
let currentStartTime = new Date(startOfDay);
for (const event of events) {
const { startTime, endTime } = getEventTimes(event, now, currentStartTime);
currentStartTime = new Date(endTime);
if (now >= startTime && now <= endTime) {
return { event, endTime };
}
}
// Если текущее время превышает конец последнего события, начать цикл заново
if (now > currentStartTime) {
startOfDay.setDate(startOfDay.getDate() + 1); // Увеличиваем день на 1
return getCurrentEvent(now); // Рекурсивно вызываем функцию, чтобы получить новое событие
}
return null;
}
function updateHourDuration(hourDuration) {
const root = document.documentElement;
root.style.setProperty('--hour-duration', hourDuration);
}
function updateMinuteDuration(minuteDuration) {
const root = document.documentElement;
root.style.setProperty('--minute-duration', minuteDuration);
}
function updateSecondDuration(secondDuration) {
const root = document.documentElement;
root.style.setProperty('--second-duration', secondDuration);
}
function updateEvents() {
const now = simulateTime(); // Используем ускоренное время
const currentEvent = getCurrentEvent(now);
if (currentEvent) {
const { event, endTime } = currentEvent;
const countdown = Math.floor((endTime - now) / 1000);
// Обновляем отображение таймера и названия события
timerElement.innerText = formatTime(countdown);
eventNameElement.innerText = event.timerName;
// Обновляем заголовок страницы
document.title = `${formatTime(countdown)}`;
}
}
/**
* Функция для форматирования времени в строку в формате ЧЧ:ММ:СС.
* @param {number} seconds - Количество секунд.
* @returns {string} - Отформатированное время.
*/
function formatTime(seconds) {
const hours = Math.floor(seconds / 3600);
const minutes = Math.floor((seconds % 3600) / 60);
const remainingSeconds = seconds % 60;
return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${remainingSeconds.toString().padStart(2, '0')}`;
}
// Инициализируем начальные значения, если время уже установлено
if (startTimeInput.value) {
const [hours, minutes] = startTimeInput.value.split(':').map(Number);
startOfDay = new Date();
startOfDay.setHours(hours, minutes, 0, 0);
renderEvents();
updateEvents();
}
// Обновляем расписание и таймер каждую секунду
setInterval(() => {
if (startOfDay) {
renderEvents();
updateEvents();
}
}, 1000);
});