渐增数字效果实现

317 阅读2分钟

我正在参加「码上掘金挑战赛」详情请看:码上掘金挑战赛来了!

前言

大家好,我是小阵 🔥,一路奔波不停的码字业务员
如果喜欢我的文章,可以关注 ➕ 点赞,与我一同成长吧~😋
加我微信:zzz886885,邀你进群,一起学习交流,摸鱼学习两不误🌟

开开心心学技术大法~~

开心

来了来了,他真的来了~

正文

实现思路

  • 大体看上去是不停的渲染dom的innerText
  • 那怎样不停渲染呢?递归吗?
  • 递归理论上是可以的,但是如果是递归的话,会发现,数字的一下就变成目标数字了
  • 是的,递归的话,同步计算速度太快了
  • 中间加sleep呢?也是没问题的,通过promise与递归结合实现应该也是ok的
  • sleep的目的其实就是为了延缓递归速度太快,那其实还是有一个方法
  • innerText0targetnum之间分为200份,然后通过settimeout与递归来实现
  • 这样既可以保证不同大小的target的数字块变化时间一样,也有一个变化的过程可以明显看到
  • 还有一个问题,怎样保存target呢?通过一个visibility:hidden来隐藏一个包含target num的div吗?
  • 这个也可以,当然也可以通过dataset的方式,或者自定义属性
  • 我这里用的是data-target
  • 其他需要注意的点就没有了

具体实现

基础html结构

<body>
    <div class="counter-container">
      <i class="fab fa-twitter fa-3x"></i>
      <div class="counter" data-target="12000"></div>
      <span>Twitter Followers</span>
    </div>
​
    <div class="counter-container">
      <i class="fab fa-youtube fa-3x"></i>
      <div class="counter" data-target="5000"></div>
      <span>YouTube Subscribers</span>
    </div>
​
    <div class="counter-container">
      <i class="fab fa-facebook fa-3x"></i>
      <div class="counter" data-target="7500"></div>
      <span>Facebook Fans</span>
    </div>
    <script src="script.js"></script>
  </body>

主要是保证一个html的静态页面即可

基础css

css就不写了,都是基础的,没有特别需要注意的地方

唯一值得关注的就是其中的自定义unicode图标字体了,感兴趣的同学可以自己查一下

关键js

const counters = document.querySelectorAll('.counter')
​
counters.forEach(counter => {
    counter.innerText = '0'
​
    const updateCounter = () => {
        const target = +counter.getAttribute('data-target')
        const c = +counter.innerText
​
        // const increment = target / 2000
        const increment = target / 200
​
        if (c < target) {
            counter.innerText = `${Math.ceil(c + increment)}`
            const timer = setTimeout(() => {
                clearTimeout(timer)
                updateCounter()
            }, 1)
            // updateCounter()
        } else {
            counter.innerText = target
        }
    }
​
    updateCounter()
})

完整代码

总结

  • 大体思路很简单,主要是需要用到类似sleep的方法让dom内容变化别那么快
  • 然后需要注意下不同数字跨度变化的时间段要一致

结语

如果文章真的有帮到你,希望可以多多点赞、收藏、关注支持一波呀!!小阵会很开心哒~

热爱开源,支持开源,拥抱开源!

文章如有错误或不严谨之处,还望指出,感谢感谢!!!

加油!

往期好文推荐