基于vue2 + element
实现画面效果
代码
< template>
< div>
< div class = " Box" >
< div style = " position : relative; " >
< el-progress type = " circle" :width = " 300" :percentage = " percentage" :show-text = " false" > </ el-progress>
< div class = " time" >
< h2 v-if = " countdown > 0" > 倒计时{{ countdown }}秒</ h2>
< h2 v-else > 倒计时结束</ h2>
</ div>
</ div>
< div style = " margin-top : 10px; " >
< el-tag @click = " chooseTime(item.num)" style = " margin-left : 10px; " v-for = " (item, index) in timeList"
:key = " index" >
{{ item.name }}
</ el-tag>
</ div>
< el-button type = " primary" v-if = " !is_pause" style = " margin-top : 30px; " @click = " timeFn" > 开始</ el-button>
< el-button type = " danger" v-if = " is_pause" style = " margin-top : 30px; " @click = " pauseFn" > 暂停</ el-button>
</ div>
</ div>
</ template>
< script>
export default {
data ( ) {
return {
countdown : 60 ,
countdownNum : 60 ,
timer : null ,
is_pause : false ,
percentage : 100 ,
timeList : [
{
name : '10秒' ,
num : 10
} ,
{
name : '30秒' ,
num : 30
} ,
{
name : '1分钟' ,
num : 60
} ,
{
name : '2分钟' ,
num : 120
} ,
{
name : '5分钟' ,
num : 300
} ,
]
}
} ,
methods : {
timeFn ( ) {
this . is_pause = true
this . timer = setInterval ( ( ) => {
if ( this . countdown > 0 ) {
this . countdown-- ;
this . percentage = ( this . countdown / this . countdownNum) . toFixed ( 2 ) * 100
} else {
clearInterval ( this . timer) ;
this . is_pause = false
}
} , 1000 ) ;
} ,
pauseFn ( ) {
clearInterval ( this . timer) ;
this . is_pause = false
} ,
chooseTime ( num ) {
this . percentage = 100
this . countdown = num
this . countdownNum = num
this . is_pause = false
clearInterval ( this . timer) ;
}
}
}
</ script>
< style scoped >
.Box {
display : flex;
flex-direction : column;
align-items : center;
justify-content : center;
height : 450px;
width : 100%;
padding : 30px 20px;
box-sizing : border-box;
}
.Box .time {
position : absolute;
top : 50%;
left : 50%;
transform : translate ( -50%, -50%) ;
display : flex;
flex-direction : column;
}
</ style>