Vue 实现countDown倒计时

项目中要用到倒计时,用Vue 实现了一个

  1 <template>
  2   <transition name="bkcd">
  3     <div class="bkCountDown" v-show="bkCountDownShow">
  4     <div class="kbCountDownTitle">
  5       <img src="http://static.crecgec.com/Kaipiao/countDownTitle.png">
  6     </div>
  7     <div id="kbCountDownContent" class="kbCountDownContent" ref="kbCountDownContent">
  8     </div>
  9     <!--倒计时结束后提示的信息-->
 10     <div class="cdEndCon" v-show="cdEndConShow">{{cdEndContent}}</div>
 11   </div>
 12   </transition>
 13 </template>
 14
 15 <script>
 16 import $ from ‘jquery‘
 17
 18 export default {
 19   props: {
 20     // 控制倒计时页面显示、隐藏
 21     bkCountDownShow: {
 22       type: Boolean,
 23       default: true
 24     },
 25     // 这个参数:为了实现中途倒计时暂停功能
 26     // 控制倒计时暂停/开始
 27     cdStartOrEnd: {
 28       type: Boolean,
 29       default: true
 30     },
 31     // 倒计时的时间,有父组件传递
 32     countDownTime: {
 33       type: String,
 34       default: ‘2017/11/9 15:03:01‘
 35     },
 36     // 倒计时结束后显示的内容
 37     cdEndContent: {
 38       type: String,
 39       default: ‘倒计时已经结束‘
 40     }
 41   },
 42   data () {
 43     return {
 44       // 倒计时结束后显示cdEndCon
 45       cdEndConShow: false,
 46       timestamp: ‘‘, // 倒计时的时间戳
 47       cdTimer: ‘‘, // setTimeOut值
 48       timeInterval: ‘‘, // 倒计时结束时间与当前时间的之间的间隔
 49       timeIntervalVal: ‘‘, // 保存时间间隔的参数
 50       d: ‘‘,
 51       h: ‘‘,
 52       m: ‘‘,
 53       s: ‘‘,
 54       days: 24 * 60 * 60,
 55       hours: 60 * 60,
 56       minutes: 60
 57     }
 58   },
 59   mounted () {
 60     this.countdown()
 61   },
 62   watch: {
 63     // 监控cdStartOrEnd值
 64     cdStartOrEnd () {
 65       if (this.cdStartOrEnd) {
 66         this.tick()
 67       } else {
 68         clearTimeout(this.cdTimer)
 69       }
 70     }
 71   },
 72   methods: {
 73     countdown () {
 74       this.timestamp = new Date(this.countDownTime).getTime()
 75       this.init(‘kbCountDownContent‘)
 76     },
 77     // 初始化
 78     init (ele) {
 79       $.each([‘Hours‘, ‘Minutes‘, ‘Seconds‘], function (i) {
 80         $(‘<div class="count‘ + this + ‘">‘).html(
 81           `<div class = "countPos"> 82              <span class="digit static">0</span> 83         </div> 84         <div class="countPos"> 85           <span class="digit static">0</span> 86         </div>`
 87         ).appendTo($(‘#‘ + ele))
 88         if (this !== ‘Seconds‘) {
 89           $(‘#‘ + ele).append(‘<div class="countDiv countDiv‘ + i + ‘"></div>‘)
 90         }
 91       })
 92       this.tick()
 93     },
 94     tick () {
 95 //      每次进入这个方法,就重新计算和当前时间的间隔,然后赋值给timeInterval
 96       this.timeInterval = Math.floor((this.timestamp - (new Date())) / 1000)
 97       if (this.timeInterval < 0) {
 98         this.timeInterval = 0
 99       }
100       this.timeIntervalVal = this.timeInterval
101 //       Number of days left
102 //      现在是只有时分秒,可以通过调整下面的代码,来确定显示什么
103 //      this.d = Math.floor(this.timeInterval / this.days)
104 //      this.updateDuo(0, 1, this.d)
105 //      this.timeInterval -= this.d * this.days
106       // Number of hours left
107       this.h = Math.floor(this.timeInterval / this.hours)
108       this.updateDuo(0, 1, this.h)
109       this.timeInterval -= this.h * this.hours
110       // Number of minutes timeInterval
111       this.m = Math.floor(this.timeInterval / this.minutes)
112       this.updateDuo(2, 3, this.m)
113       this.timeInterval -= this.m * this.minutes
114       // Number of seconds timeInterval
115       this.s = this.timeInterval
116       this.updateDuo(4, 5, this.s)
117       // timeIntervalVal大于0,就执行setTimeout方法
118       if (this.timeIntervalVal > 0) {
119         this.cdTimer = setTimeout(this.tick, 1000)
120       } else {
121         // 倒计时结束
122         this.cdEndConShow = true
123         // 这块可以添加emit,给父组件传参
124         // 通过emit给父组件传参数来操作bkCountDownShow
125         //  bkCountDownShow = false
126       }
127     },
128     updateDuo (minor, major, value) {
129       this.switchDigit($(‘#kbCountDownContent‘).find(‘.countPos‘).eq(minor), Math.floor(value / 10) % 10)
130       this.switchDigit($(‘#kbCountDownContent‘).find(‘.countPos‘).eq(major), value % 10)
131     },
132     switchDigit (position, number) {
133       let digit = position.find(‘.digit‘)
134       if (digit.is(‘:animated‘)) {
135         return false
136       }
137       if (position.data(‘digit‘) === number) {
138         return false
139       }
140       position.data(‘digit‘, number)
141       var replacement = $(‘<span>‘, {
142         ‘class‘: ‘digit‘,
143         css: {
144           top: ‘-170px‘,
145           opacity: 0
146         },
147         html: number
148       })
149       digit
150         .before(replacement)
151         .removeClass(‘static‘)
152         .animate({top: ‘170px‘, opacity: 0}, ‘slow‘, function () {
153           digit.remove()
154         })
155       replacement
156         .delay(100)
157         .animate({top: 0, opacity: 1}, ‘slow‘, function () {
158           replacement.addClass(‘static‘)
159         })
160     }
161   }
162 }
163 </script>
164
165 <!-- Add "scoped" attribute to limit CSS to this component only -->
166 <style>
167   *{
168     margin:0;
169     padding:0;
170     font-family: ‘Microsoft Yahei‘,Tahoma,‘Simsun‘,‘宋体‘ !important;
171   }
172
173   .bkCountDown{
174     width: 100%;
175     height: 980px;
176     background:url(‘http://static.crecgec.com/Kaipiao/background.png‘) #b0b0b0;
177     position: absolute;
178     background-size: cover;
179     overflow: hidden;
180   }
181   .kbCountDownTitle{
182     width: 1070px;
183     height: 120px;
184     line-height: 120px;
185     font-size: 120px;
186     margin: 190px auto 0;
187     text-align: center;
188     color: #fff;
189   }
190   .kbCountDownContent{
191     width:1070px;
192     margin:160px auto 0;
193     text-align:center;
194     letter-spacing:-3px;
195     overflow: hidden;
196   }
197   .countPos{
198     display: inline-block;
199     width: 150px;
200     height: 170px;
201     overflow: hidden;
202     position: relative;
203     margin-left: 15px;
204   }
205
206   .digit{
207     position:absolute;
208     display:block;
209     width:150px;
210     height: 170px;
211     line-height: 170px;
212     text-align:center;
213     color:#fff;
214     font-size: 80px;
215     background: url(‘http://static.crecgec.com/Kaipiao/countDown.png‘) 0 0 no-repeat;
216   }
217
218   .digit.static{
219     background: url(‘http://static.crecgec.com/Kaipiao/countDown.png‘) 0 0 no-repeat;
220   }
221   .countDays,.countHours,.countMinutes,.countSeconds{
222     float: left;
223     font-size: 0;
224   }
225   .countDiv{
226     display:inline-block;
227     width:10px;
228     height:50px;
229     float: left;
230     margin-top: 60px;
231     margin-left: 15px;
232     background: url(‘http://static.crecgec.com/Kaipiao/countDown1.png‘) 0 0 no-repeat;
233   }
234   .cdEndCon{
235     width:1070px;
236     margin:20px auto 0;
237     text-align: center;
238     color: #fff;
239     font-size: 20px;
240   }
241   .bkcd-enter-active, .bkcd-leave-active{
242     transition: opacity .5s
243   }
244   .bkcd-enter, .bkcd-leave-to{
245     opacity: 0
246   }
247 </style>
时间: 2024-11-10 12:57:33

Vue 实现countDown倒计时的相关文章

vue获取验证码倒计时,自定义组件点击事件不生效的问题

说明:部分组件使用的是element-ui 子组件 <template> <div class="count-down"> <el-button type="primary" size="small" style="width:80px;" :disabled="disabled || time > 0"> {{ text }} </el-button>

vue组件中倒计时,刷新页面不会从头开始

开启倒计时,直接保存到vuex中,且存储到本地持久化 // state.js const runTime = localStorage.getItem('time'); paymentRunTime:runTime // mutations.js TimeReduction(state) { this.timerId = setInterval(() => { if (state.paymentRunTime === 0) { state.paymentRunTime = 60; return

canvas 画圆饼动画 countdown 倒计时

<canvas id="myCanvas" width="1000" height="500" style="border:1px solid #666"></canvas> var canvas = document.getElementById("myCanvas"), ctx = canvas.getContext("2d"), width = canvas

Vue.js 自定义组件封装实录——基于现有控件的二次封装(以计时器为例)

在本人着手开发一个考试系统的过程中,出现了如下一个需求:制作一个倒计时的控件显示在试卷页面上.本文所记录的就是这样的一个过程. 前期工作 对于这个需求,自然我想到的是有没有现成的组件可以直接使用(本着不重复发明轮子的原则).于是我就在 GitHub 上找寻.确实找到了不少,但是与需求之间的差距还比较大.从零开始写又不太现实(时间摆在那里,加之自己的前端也是刚学,还没有从零开始手撸一个控件的能力),所以在已有组件的基础上进行二次封装便成了一个比较可行的方法(几乎也是唯一解).遂在 npm 上以 c

第一次写jquery插件,来个countdown计时器吧

之前同学做个购物商城秒杀活动需要计时器的功能,在用jquery提供的countdown插件时,一直报错,貌似还需要依赖除jquery之外的其他插件,搞了半天也没搞成功,就叫我帮忙写个.然而我并没有写过插件,不过刚好趁这次端午好好地锻炼一把吧,顺便在这儿存个代码,自己的思路不好,大神们请不要见笑哈... 废话不多说,直接上代码: =======================================请叫我华丽的分割线=====================================

java 24小时倒计时案例

import java.util.Calendar; import java.util.Date; public class Daojishi { static String Countdown=""; public static void main(String[] args) { //开启倒计时 time2(); System.out.println("Countdown="+Countdown); } /** * 倒计时,设定时间戳 */ private st

vue中解决时间在ios上显示NAN的问题

最近在用vue,遇到倒计时在ios上显示为NAN的问题. 因为做的是倒计时支付,思路是获取服务器时间和下单时间,再转成秒级时间戳做差值. 在网上找到说是ios 不支持例如2018-09-01 10:00:59这种"-"连接符. 网上的解决是: var data = '2018-09-01 12:00:00' var time= Date.parse(new Date(data )) 然后用正则匹配改一下,将-替换为/ var date = '2018-09-01 12:00:00' v

微信小程序----团购或秒杀的批量倒计时实现

效果图 实现思路微信小程序实现倒计时,可以将倒计时的时间进行每一秒的计算和渲染! JS模拟商品列表数据 goodsList:在 onLoad 周期函数中对活动结束时间进行提取:建立时间格式化函数 timeFormat:建立倒计时函数 countDown:在 onLoad 周期函数的提取结尾执行倒计时函数 countDown.倒计时函数详解获取当前时间,同时得到活动结束时间数组:循环活动结束时间数组,计算每个商品活动结束时间的倒计时天.时.分.秒:用 setData 方法刷新数据:每个一秒执行一次

iOS--苹果API常见英语单词

苹果API常见英语单词0. indicating 决定1.in order to 以便2.rectangle bounds 矩形尺寸3.applied 应用4.entirety 全部5.technique 方法6.truncating 截短7.wrapping 换行8.string 字符串9.familiar style 简体10.The styled text 主题样式11.Constants 常量12.Attribute 属性13.Consecutive 连续14.Shrink 收缩15.D