Довольно простой, но функциональный пример таймера с выводом убывающего времени.
После истечения времени стартует колбэк.
По первой задумке, цифры должны были перетекать одна в другую, но в FF при этом возник эффект мерцания (при вызове cloneNode).
Этот момент поправлю когда дойдут руки, в остальном код рабочий.
Сам код:
let clockEngine = {
el : {},
var : {},
start : function (minute, second, callback) {
clockEngine.var.bDone = false;
clockEngine.var.last_second = second;
clockEngine.var.last_minute = minute;
clockEngine.el.minutesContainer = document.querySelector('.minutes');
clockEngine.el.secondsContainer = document.querySelector('.seconds');
clockEngine.onFinish = callback;
clockEngine.var.timer = setInterval(clockEngine.updateTime, 1000);
},
updateTime : function () {
if (!clockEngine.var.bDone) {
if (clockEngine.var.last_second < 1) {
clockEngine.var.last_minute--;
if (clockEngine.var.last_minute < 0) {
clockEngine.var.bDone = true;
clearInterval(clockEngine.var.timer);
clockEngine.onFinish();
} else {
clockEngine.var.last_second = 59;
}
} else {
clockEngine.var.last_second--;
}
if (!clockEngine.var.bDone) {
clockEngine.updateContainer(clockEngine.el.minutesContainer, clockEngine.var.last_minute);
clockEngine.updateContainer(clockEngine.el.secondsContainer, clockEngine.var.last_second);
}
}
},
updateContainer : function (container, val) {
val = String(val);
let time = val.split('');
if (time.length === 1) {
time.unshift('0')
}
let first = container.firstElementChild;
if (first.lastElementChild.textContent !== time[0]) {
clockEngine.updateNumber(first, time[0])
}
let last = container.lastElementChild;
if (last.lastElementChild.textContent !== time[1]) {
clockEngine.updateNumber(last, time[1])
}
},
updateNumber : function (element, number) {
//element.lastElementChild.textContent = number
element.lastElementChild.textContent = number;
// let second = element.lastElementChild.cloneNode(true);
// second.textContent = number;
//
// element.classList.add('move');
// element.classList.add('anti_glitch');
// element.appendChild(second);
// setTimeout(function () {
// element.classList.remove('anti_glitch');
// }, 50);
//
// setTimeout(function () {
// element.classList.remove('move');
// }, 990);
// setTimeout(function () {
// element.removeChild(element.firstElementChild);
// }, 990);
}
};
Пример вызова.
Устанавливаем время 1 минута и 10 секунд:
clockEngine.start(1, 10, function () {
console.debug("ОК");
});
Стили:
.clock {
height: 20vh;
color: black;
font-size: 22vh;
font-family: sans-serif;
line-height: 20.4vh;
display: flex;
position: relative;
overflow: hidden;
}
.clock > div {
display: flex;
}
.tick {
line-height: 17vh;
}
.tick-hidden {
opacity: 0;
}
.move {
animation: move linear 1s infinite;
}
/*.move .number:last-of-type {*/
/* !*display: block !important;*!*/
/* !*color: green;*!*/
/*}*/
/*.anti_glitch {*/
/* transform: translateX(200px);*/
/* !*color: red;*!*/
/*}*/
/*@keyframes move {*/
/* from {*/
/* transform: translateY(0vh);*/
/* !*opacity: 0.5;*!*/
/* }*/
/* to {*/
/* transform: translateY(-20vh);*/
/* !*opacity: 1;*!*/
/* }*/
/*}*/