Blame view

node_modules/vue-count-to/src/requestAnimationFrame.js 1.6 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
  let lastTime = 0
  const prefixes = 'webkit moz ms o'.split(' ') // 各浏览器前缀
  
  let requestAnimationFrame
  let cancelAnimationFrame
  
  const isServer = typeof window === 'undefined'
  if (isServer) {
    requestAnimationFrame = function() {
      return
    }
    cancelAnimationFrame = function() {
      return
    }
  } else {
    requestAnimationFrame = window.requestAnimationFrame
    cancelAnimationFrame = window.cancelAnimationFrame
    let prefix
      // 通过遍历各浏览器前缀,来得到requestAnimationFrame和cancelAnimationFrame在当前浏览器的实现形式
    for (let i = 0; i < prefixes.length; i++) {
      if (requestAnimationFrame && cancelAnimationFrame) { break }
      prefix = prefixes[i]
      requestAnimationFrame = requestAnimationFrame || window[prefix + 'RequestAnimationFrame']
      cancelAnimationFrame = cancelAnimationFrame || window[prefix + 'CancelAnimationFrame'] || window[prefix + 'CancelRequestAnimationFrame']
    }
  
    // 如果当前浏览器不支持requestAnimationFrame和cancelAnimationFrame,则会退到setTimeout
    if (!requestAnimationFrame || !cancelAnimationFrame) {
      requestAnimationFrame = function(callback) {
        const currTime = new Date().getTime()
        // 为了使setTimteout的尽可能的接近每秒60帧的效果
        const timeToCall = Math.max(0, 16 - (currTime - lastTime))
        const id = window.setTimeout(() => {
          callback(currTime + timeToCall)
        }, timeToCall)
        lastTime = currTime + timeToCall
        return id
      }
  
      cancelAnimationFrame = function(id) {
        window.clearTimeout(id)
      }
    }
  }
  
  export { requestAnimationFrame, cancelAnimationFrame }