我有一個與倒數計時器關聯的影片進度條。
目前,進度條的影片是離散的。
如何在不更改代碼中其他邏輯的情況下使其保持連續 ?
此外,是否可以使用requestAnimationFrame(如創建影片進度條的方式)而不是 current創建計時器setInterval?
var timer = null;
var progress_bar = null;
var timePassed;
var TIME_LIMIT;
var timeLeft;
function startTimerAndProgressbar() {
timePassed = 0;
TIME_LIMIT = 10;
timeLeft = TIME_LIMIT;
startTimer();
id("progress-bar").style.visibility = "visible";
progress_bar = requestAnimationFrame(updateProgressBar);
}
function pauseTimerAndProgressbar() {
clearInterval(timer);
pauseProgressBar();
id("pause-btn").disabled = true;
id("resume-btn").disabled = false;
}
function resumeTimerAndProgressbar() {
startTimer();
resumeProgressBar();
id("pause-btn").disabled = false;
id("resume-btn").disabled = true;
}
/* HELPER FUNCTION */
function id(id) {
return document.getElementById(id);
}
/* PROGRESS BAR */
function updateProgressBar() {
var timeFraction = timeLeft / TIME_LIMIT;
id("progress-bar-inner").style.width = timeFraction * 100 "%";
progress_bar = requestAnimationFrame(updateProgressBar);
if (id("progress-bar-inner").style.width <= 0) {
pauseProgressBar();
}
}
function pauseProgressBar() {
cancelAnimationFrame(progress_bar);
}
function resumeProgressBar() {
progress_bar = requestAnimationFrame(updateProgressBar);
}
/* TIMER */
function startTimer() {
id("timer").textContent = formatTime(timeLeft);
timer = setInterval(function() {
timePassed = timePassed = 1;
timeLeft = TIME_LIMIT - timePassed;
id("timer").textContent = formatTime(timeLeft);
if (timeLeft == 0) { clearInterval(timer); }
}, 1000);
}
function formatTime(time) {
var m = Math.floor(time / 60);
var s = time % 60;
m = (m < 10) ? ("0" m) : m;
s = (s < 10) ? ("0" s) : s;
return `${m}:${s}`;
}
#timer {
font-size: 25px;
font-weight: bold;
}
#progress-bar {
visibility: hidden;
width: 100%;
margin: 25px auto;
border: solid 1px #000;
border-radius: 10px;
}
#progress-bar-inner {
height: 15px;
border-radius: 10px;
width: 100%;
background-color: orange;
}
<p id="timer"></p>
<div id="progress-bar">
<div id="progress-bar-inner"></div>
</div>
<br>
<button onclick="startTimerAndProgressbar()" id="start-btn">Start</button>
<button onclick="pauseTimerAndProgressbar()" id="pause-btn">Pause</button>
<button onclick="resumeTimerAndProgressbar()" id="resume-btn" disabled>Resume</button>
uj5u.com熱心網友回復:
添加transition: width 1s;到您的#progress-bar-inner:
var timer = null;
var progress_bar = null;
var timePassed;
var TIME_LIMIT;
var timeLeft;
function startTimerAndProgressbar() {
timePassed = 0;
TIME_LIMIT = 10;
timeLeft = TIME_LIMIT;
startTimer();
id("progress-bar").style.visibility = "visible";
progress_bar = requestAnimationFrame(updateProgressBar);
}
function pauseTimerAndProgressbar() {
clearInterval(timer);
pauseProgressBar();
id("pause-btn").disabled = true;
id("resume-btn").disabled = false;
}
function resumeTimerAndProgressbar() {
startTimer();
resumeProgressBar();
id("pause-btn").disabled = false;
id("resume-btn").disabled = true;
}
/* HELPER FUNCTION */
function id(id) {
return document.getElementById(id);
}
/* PROGRESS BAR */
function updateProgressBar() {
var timeFraction = timeLeft / TIME_LIMIT;
id("progress-bar-inner").style.width = timeFraction * 100 "%";
progress_bar = requestAnimationFrame(updateProgressBar);
if (id("progress-bar-inner").style.width <= 0) {
pauseProgressBar();
}
}
function pauseProgressBar() {
cancelAnimationFrame(progress_bar);
}
function resumeProgressBar() {
progress_bar = requestAnimationFrame(updateProgressBar);
}
/* TIMER */
function startTimer() {
id("timer").textContent = formatTime(timeLeft);
timer = setInterval(function() {
timePassed = timePassed = 1;
timeLeft = TIME_LIMIT - timePassed;
id("timer").textContent = formatTime(timeLeft);
if (timeLeft == 0) { clearInterval(timer); }
}, 1000);
}
function formatTime(time) {
var m = Math.floor(time / 60);
var s = time % 60;
m = (m < 10) ? ("0" m) : m;
s = (s < 10) ? ("0" s) : s;
return `${m}:${s}`;
}
#timer {
font-size: 25px;
font-weight: bold;
}
#progress-bar {
visibility: hidden;
width: 100%;
margin: 25px auto;
border: solid 1px #000;
border-radius: 10px;
}
#progress-bar-inner {
height: 15px;
border-radius: 10px;
width: 100%;
background-color: orange;
transition: width 1s;
}
<p id="timer"></p>
<div id="progress-bar">
<div id="progress-bar-inner"></div>
</div>
<br>
<button onclick="startTimerAndProgressbar()" id="start-btn">Start</button>
<button onclick="pauseTimerAndProgressbar()" id="pause-btn">Pause</button>
<button onclick="resumeTimerAndProgressbar()" id="resume-btn" disabled>Resume</button>
uj5u.com熱心網友回復:
您的timer setInterval功能在幾秒鐘內運行。您需要更改間隔,因此更改值TIMELIMIT以匹配。
var timer = null;
var progress_bar = null;
var timePassed;
var TIME_LIMIT;
var timeLeft;
function startTimerAndProgressbar() {
timePassed = 0;
TIME_LIMIT = 10;
timeLeft = TIME_LIMIT*100;
startTimer();
id("progress-bar").style.visibility = "visible";
progress_bar = requestAnimationFrame(updateProgressBar);
}
function pauseTimerAndProgressbar() {
clearInterval(timer);
pauseProgressBar();
id("pause-btn").disabled = true;
id("resume-btn").disabled = false;
}
function resumeTimerAndProgressbar() {
startTimer();
resumeProgressBar();
id("pause-btn").disabled = false;
id("resume-btn").disabled = true;
}
/* HELPER FUNCTION */
function id(id) {
return document.getElementById(id);
}
/* PROGRESS BAR */
function updateProgressBar() {
var timeFraction = timeLeft / (TIME_LIMIT*100);
id("progress-bar-inner").style.width = timeFraction * 100 "%";
progress_bar = requestAnimationFrame(updateProgressBar);
if (id("progress-bar-inner").style.width <= 0) {
pauseProgressBar();
}
}
function pauseProgressBar() {
cancelAnimationFrame(progress_bar);
}
function resumeProgressBar() {
progress_bar = requestAnimationFrame(updateProgressBar);
}
/* TIMER */
function startTimer() {
id("timer").textContent = formatTime(timeLeft);
timer = setInterval(function() {
timePassed = 1;
timeLeft = TIME_LIMIT*100 - timePassed;
id("timer").textContent = formatTime(Math.ceil(timeLeft/100));
if (timeLeft == 0) { clearInterval(timer); }
}, 10);
}
function formatTime(time) {
var m = Math.floor(time / 60);
var s = time % 60;
m = (m < 10) ? ("0" m) : m;
s = (s < 10) ? ("0" s) : s;
return `${m}:${s}`;
}
#timer {
font-size: 25px;
font-weight: bold;
}
#progress-bar {
visibility: hidden;
width: 100%;
margin: 25px auto;
border: solid 1px #000;
border-radius: 10px;
}
#progress-bar-inner {
height: 15px;
border-radius: 10px;
width: 100%;
background-color: orange;
}
<p id="timer"></p>
<div id="progress-bar">
<div id="progress-bar-inner"></div>
</div>
<br>
<button onclick="startTimerAndProgressbar()" id="start-btn">Start</button>
<button onclick="pauseTimerAndProgressbar()" id="pause-btn">Pause</button>
<button onclick="resumeTimerAndProgressbar()" id="resume-btn" disabled>Resume</button>
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/411393.html
標籤:
上一篇:如何在順風css中是否存在子元素時保持父元素高度不變?
下一篇:防止影像擴展水平彈性框
