|
|
|
<template>
|
|
|
|
<view class="hd-count-down">
|
|
|
|
<view v-if="showDay" class="hd-count-down-number" :style="{
|
|
|
|
borderColor: borderColor,
|
|
|
|
color: color,
|
|
|
|
background: backgroundColor
|
|
|
|
}">
|
|
|
|
{{ d }}
|
|
|
|
</view>
|
|
|
|
<view v-if="showDay" class="hd-count-down-splitor" :style="{ color: splitorColor }">天</view>
|
|
|
|
<view class="hd-count-down-number" :style="{
|
|
|
|
borderColor: borderColor,
|
|
|
|
color: color,
|
|
|
|
background: backgroundColor
|
|
|
|
}">
|
|
|
|
{{ h }}
|
|
|
|
</view>
|
|
|
|
<view class="hd-count-down-splitor" :style="{ color: splitorColor }">
|
|
|
|
{{ showColon ? ':' : '时' }}
|
|
|
|
</view>
|
|
|
|
<view class="hd-count-down-number" :style="{
|
|
|
|
borderColor: borderColor,
|
|
|
|
color: color,
|
|
|
|
background: backgroundColor
|
|
|
|
}">
|
|
|
|
{{ m }}
|
|
|
|
</view>
|
|
|
|
<view class="hd-count-down-splitor" :style="{ color: splitorColor }">
|
|
|
|
{{ showColon ? ':' : '分' }}
|
|
|
|
</view>
|
|
|
|
<view class="hd-count-down-number" :style="{
|
|
|
|
borderColor: borderColor,
|
|
|
|
color: color,
|
|
|
|
background: backgroundColor
|
|
|
|
}">
|
|
|
|
{{ s }}
|
|
|
|
</view>
|
|
|
|
<view v-if="!showColon" class="hd-count-down-splitor" :style="{ color: splitorColor }">秒</view>
|
|
|
|
</view>
|
|
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
|
|
import { onBeforeMount, onBeforeUnmount, ref } from 'vue'
|
|
|
|
|
|
|
|
/**
|
|
|
|
* CountDown 倒计时
|
|
|
|
*/
|
|
|
|
|
|
|
|
interface Props {
|
|
|
|
// 控制展示天
|
|
|
|
showDay ?: boolean
|
|
|
|
// 是否展示分隔符
|
|
|
|
showColon ?: boolean
|
|
|
|
// 背景色
|
|
|
|
backgroundColor ?: string
|
|
|
|
// 边框颜色
|
|
|
|
borderColor ?: string
|
|
|
|
// 字体颜色
|
|
|
|
color ?: string
|
|
|
|
// 分隔符颜色
|
|
|
|
splitorColor ?: string
|
|
|
|
// 日
|
|
|
|
day ?: number
|
|
|
|
// 时
|
|
|
|
hour : number
|
|
|
|
// 分
|
|
|
|
minute : number
|
|
|
|
// 秒
|
|
|
|
second : number
|
|
|
|
}
|
|
|
|
|
|
|
|
const props = withDefaults(defineProps<Props>(), {
|
|
|
|
// 控制展示天
|
|
|
|
showDay: true,
|
|
|
|
// 是否展示分隔符
|
|
|
|
showColon: true,
|
|
|
|
// 背景色
|
|
|
|
backgroundColor: '#FFFFFF',
|
|
|
|
// 边框颜色
|
|
|
|
borderColor: '#000000',
|
|
|
|
// 字体颜色
|
|
|
|
color: '#000000',
|
|
|
|
// 分隔符颜色
|
|
|
|
splitorColor: '#FFFFFF',
|
|
|
|
// 日
|
|
|
|
day: 0,
|
|
|
|
// 时
|
|
|
|
hour: 0,
|
|
|
|
// 分
|
|
|
|
minute: 0,
|
|
|
|
// 秒
|
|
|
|
second: 0
|
|
|
|
})
|
|
|
|
|
|
|
|
const timer = ref<any>(null)
|
|
|
|
const d = ref<string>('00')
|
|
|
|
const h = ref<string>('00')
|
|
|
|
const m = ref<string>('00')
|
|
|
|
const s = ref<string>('00')
|
|
|
|
const leftTime = ref<number>(0)
|
|
|
|
const seconds = ref<number>(0)
|
|
|
|
|
|
|
|
onBeforeMount(() => {
|
|
|
|
seconds.value = toSeconds(props.day, props.hour, props.minute, props.second)
|
|
|
|
countDown()
|
|
|
|
timer.value = setInterval(() => {
|
|
|
|
seconds.value--
|
|
|
|
if (seconds.value < 0) {
|
|
|
|
timeUp()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
countDown()
|
|
|
|
}, 1000)
|
|
|
|
})
|
|
|
|
|
|
|
|
onBeforeUnmount(() => {
|
|
|
|
timer.value && clearInterval(timer.value)
|
|
|
|
})
|
|
|
|
|
|
|
|
const emit = defineEmits(['timeup'])
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 时间转秒
|
|
|
|
* @param day 日
|
|
|
|
* @param hours 时
|
|
|
|
* @param minutes 分
|
|
|
|
* @param seconds 秒
|
|
|
|
*/
|
|
|
|
function toSeconds(day : number, hours : number, minutes : number, seconds : number) {
|
|
|
|
return day * 60 * 60 * 24 + hours * 60 * 60 + minutes * 60 + seconds
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* 倒计时结束
|
|
|
|
*/
|
|
|
|
function timeUp() {
|
|
|
|
timer.value && clearInterval(timer.value)
|
|
|
|
// 倒计时结束时触发
|
|
|
|
emit('timeup')
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 倒计时
|
|
|
|
*/
|
|
|
|
function countDown() {
|
|
|
|
let [day, hour, minute, second] = [0, 0, 0, 0]
|
|
|
|
if (seconds.value > 0) {
|
|
|
|
day = Math.floor(seconds.value / (60 * 60 * 24))
|
|
|
|
hour = Math.floor(seconds.value / (60 * 60)) - day * 24
|
|
|
|
minute = Math.floor(seconds.value / 60) - day * 24 * 60 - hour * 60
|
|
|
|
second = Math.floor(seconds.value) - day * 24 * 60 * 60 - hour * 60 * 60 - minute * 60
|
|
|
|
} else {
|
|
|
|
timeUp()
|
|
|
|
}
|
|
|
|
d.value = day < 10 ? `0${day}` : `${day}`
|
|
|
|
h.value = hour < 10 ? `0${hour}` : `${hour}`
|
|
|
|
m.value = minute < 10 ? `0${minute}` : `${minute}`
|
|
|
|
s.value = second < 10 ? `0${second}` : `${second}`
|
|
|
|
}
|
|
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
|
|
.hd-count-down {
|
|
|
|
padding: 1px 0;
|
|
|
|
display: flex;
|
|
|
|
flex-wrap: nowrap;
|
|
|
|
justify-content: center;
|
|
|
|
align-items: center;
|
|
|
|
|
|
|
|
&-splitor {
|
|
|
|
justify-content: center;
|
|
|
|
line-height: 20px;
|
|
|
|
padding: 0 0;
|
|
|
|
font-size: 12px;
|
|
|
|
box-sizing: border-box;
|
|
|
|
}
|
|
|
|
|
|
|
|
&-number {
|
|
|
|
line-height: 20px;
|
|
|
|
justify-content: center;
|
|
|
|
height: 20px;
|
|
|
|
border-radius: 50%;
|
|
|
|
margin: 0 2.5px;
|
|
|
|
font-size: 12px;
|
|
|
|
width: 20px;
|
|
|
|
text-align: center;
|
|
|
|
box-sizing: border-box;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</style>
|