一款圆形进度条样式的JS倒计时定时器,可以通过点击加号和减号自由设置倒计时的分秒数,圆形样式可以自由调整颜色等,喜欢的童鞋请收下吧。
页面的head部分,需引入一个CSS样式文件,代码如下:
<link type="text/css" rel="stylesheet" href="css/style.css">
页面的body部分,用了多个div的嵌套结构,代码如下:
<div class="container">
<div class="setters">
<div class="minutes-set">
<button data-setter="minutes-plus">+</button>
<button data-setter="minutes-minus">-</button>
</div>
<div class="seconds-set">
<button data-setter="seconds-plus">+</button>
<button data-setter="seconds-minus">-</button>
</div>
</div>
<div class="circle">
<svg width="300" viewBox="0 0 220 220" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(110,110)">
<circle r="100" class="e-c-base"/>
<g transform="rotate(-90)">
<circle r="100" class="e-c-progress"/>
<g id="e-pointer">
<circle cx="100" cy="0" r="8" class="e-c-pointer"/>
</g>
</g>
</g>
</svg>
</div>
<div class="controlls">
<div class="display-remain-time">00:30</div>
<button class="play" id="pause"></button>
</div>
</div>
页面的底部,这里使用了部分ES6的语法,里面已经提供了部分注释了,代码如下:
<script type="text/javascript">
//圆形开始
let progressBar = document.querySelector('.e-c-progress');
let indicator = document.getElementById('e-indicator');
let pointer = document.getElementById('e-pointer');
let length = Math.PI * 2 * 100;
progressBar.style.strokeDasharray = length;
function update(value, timePercent) {
var offset = - length - length * value / (timePercent);
progressBar.style.strokeDashoffset = offset;
pointer.style.transform = `rotate(${360 * value / (timePercent)}deg)`;
};
//圆形结束
const displayOutput = document.querySelector('.display-remain-time')
const pauseBtn = document.getElementById('pause');
const setterBtns = document.querySelectorAll('button[data-setter]');
let intervalTimer;
let timeLeft;
let wholeTime = 0.5 * 60; //设置时间
let isPaused = false;
let isStarted = false;
update(wholeTime,wholeTime); //刷新进度条
displayTimeLeft(wholeTime);
function changeWholeTime(seconds){
if ((wholeTime + seconds) > 0){
wholeTime += seconds;
update(wholeTime,wholeTime);
}
}
for (var i = 0; i < setterBtns.length; i++) {
setterBtns[i].addEventListener("click", function(event) {
var param = this.dataset.setter;
switch (param) {
case 'minutes-plus':
changeWholeTime(1 * 60);
break;
case 'minutes-minus':
changeWholeTime(-1 * 60);
break;
case 'seconds-plus':
changeWholeTime(1);
break;
case 'seconds-minus':
changeWholeTime(-1);
break;
}
displayTimeLeft(wholeTime);
});
}
function timer (seconds){ //按秒计时
let remainTime = Date.now() + (seconds * 1000);
displayTimeLeft(seconds);
intervalTimer = setInterval(function(){
timeLeft = Math.round((remainTime - Date.now()) / 1000);
if(timeLeft < 0){
clearInterval(intervalTimer);
isStarted = false;
setterBtns.forEach(function(btn){
btn.disabled = false;
btn.style.opacity = 1;
});
displayTimeLeft(wholeTime);
pauseBtn.classList.remove('pause');
pauseBtn.classList.add('play');
return ;
}
displayTimeLeft(timeLeft);
}, 1000);
}
function pauseTimer(event){
if(isStarted === false){
timer(wholeTime);
isStarted = true;
this.classList.remove('play');
this.classList.add('pause');
setterBtns.forEach(function(btn){
btn.disabled = true;
btn.style.opacity = 0.5;
});
}else if(isPaused){
this.classList.remove('play');
this.classList.add('pause');
timer(timeLeft);
isPaused = isPaused ? false : true
}else{
this.classList.remove('pause');
this.classList.add('play');
clearInterval(intervalTimer);
isPaused = isPaused ? false : true ;
}
}
function displayTimeLeft (timeLeft){ //显示时间
let minutes = Math.floor(timeLeft / 60);
let seconds = timeLeft % 60;
let displayString = `${minutes < 10 ? '0' : ''}${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
displayOutput.textContent = displayString;
update(timeLeft, wholeTime);
}
pauseBtn.addEventListener('click',pauseTimer);
</script>
系统已开启自动识别垃圾评论机制,识别到的自动封号,下载出错或者资源有问题请联系全栈客服QQ 1915635791