|
|
- <template>
- <view class="card">
- <image class="card-bg" :src="data.url" mode="scaleToFill"></image>
-
- <view class="flex card-bar">
- <view class="flex countdown" v-if="countdown">
- 距开始<text class="count">{{ countdown.day }}</text>天
- <text class="count">{{ countdown.hour }}</text>:<text class="count">{{ countdown.minute }}</text>:<text class="count">{{ countdown.second }}</text>
- </view>
- <button class="flex btn">进入直播间</button>
- </view>
- </view>
- </template>
-
- <script>
- import dayjs from "dayjs";
- import isSameOrBefore from 'dayjs/plugin/isSameOrBefore'
-
- dayjs.extend(isSameOrBefore);
-
- export default {
- props: {
- data: {
- type: Object,
- default() {
- return {}
- }
- }
- },
- data() {
- return {
- timer: null,
- countdown: null,
- }
- },
- watch: {
- data: {
- handler() {
- this.updateCountdown()
- },
- immediate: true,
- deep: true,
- }
- },
- methods: {
- updateCountdown() {
- this.timer && clearTimeout(this.timer)
-
- let current = dayjs()
- let startTime = dayjs(this.data.startTime)
-
- if (startTime.isSameOrBefore(current)) {
- this.countdown = null
- return
- }
-
- let countdown = {
- day: 0,
- hour: 0,
- minute: 0,
- second: 0,
- }
-
- let day = Math.floor(startTime.diff(current, 'day', true))
- countdown.day = day
- let hour = Math.floor(startTime.diff(current, 'hour', true))
- countdown.hour = hour - day * 24
- countdown.hour = countdown.hour < 10 ? `0${countdown.hour}` : countdown.hour
- let minute = Math.floor(startTime.diff(current, 'minute', true))
- countdown.minute = minute - hour * 60
- countdown.minute = countdown.minute < 10 ? `0${countdown.minute}` : countdown.minute
- let second = startTime.diff(current, 'second')
- countdown.second = second - minute * 60
- countdown.second = countdown.second < 10 ? `0${countdown.second}` : countdown.second
-
- this.countdown = countdown
-
- this.timer = setTimeout(() => {
- this.updateCountdown()
- }, 1000)
- },
- },
- }
- </script>
-
- <style scoped lang="scss">
- .card {
- position: relative;
- width: 100%;
- height: 316rpx;
- border-radius: 40rpx;
- overflow: hidden;
- box-shadow: -5rpx -5rpx 10rpx 0 #FFFFFF,
- 10rpx 10rpx 20rpx 0 #AAAACC80,
- 4rpx 4rpx 10rpx 0 #AAAACC40,
- -2rpx -2rpx 5rpx 0 #FFFFFF;
-
- &-bg {
- width: 100%;
- height: 100%;
- }
-
- &-bar {
- justify-content: space-between;
- position: absolute;
- left: 0;
- bottom: 0;
- width: 100%;
- padding: 13rpx 32rpx;
- background: #FFFFFF69;
- box-sizing: border-box;
-
- .countdown {
- font-family: PingFang SC;
- font-weight: 400;
- font-size: 28rpx;
- line-height: 1.4;
- color: #252545;
-
- .count {
- margin: 0 8rpx;
- display: inline-flex;
- align-items: center;
- justify-content: center;
- min-width: 40rpx;
- height: 40rpx;
- background: #0000002B;
- border-radius: 8rpx;
- }
- }
-
- .btn {
- font-family: PingFang SC;
- font-weight: 600;
- font-size: 24rpx;
- line-height: 1.5;
- color: #252545;
- padding: 7rpx 16rpx;
- border-radius: 24rpx;
- background: #FFFFFF;
- }
- }
- }
- </style>
|