使用countup.js制作数字滚动效果

1、数字定时刷新,显示从0变动到最终数的效果,字体可以下载不同的字体包。

2、先下载 countup.js,

npm install countup.js --S

3、设置了保留两位小数的情况和整数情况。

<template>
    <div class="summary-data">
      <div class="item" v-for="(item, itemIndex) in config" :key="itemIndex">
        <div class="img">
          <img v-if="itemIndex === 0" src="../../../assets/imgs/roomTempCount.png" />
          <img v-if="itemIndex === 1" src="../../../assets/imgs/avgTemp.png" />
          <img v-if="itemIndex === 2" src="../../../assets/imgs/roomTempCount.png" />
        </div>
        <div class="name">{
  { item?.name }}</div>
        <div class="data">
          <span class="value" ref="valueRef">{
  {
            summaryData?.[item?.valueKey] || '--' }}</span>
        </div>
      </div>
    </div>
</template>

<script lang="ts">
import { defineComponent, reactive, toRefs, onMounted, onUnmounted, ref, watch } from 'vue'
import { CountUp } from 'countup.js'

export default defineComponent({
  components: {
  },
  props: {
    roomData: {
      type: Object,
      default: () => ({})
    },
  },
  setup(props) {
    const valueRef = ref([]);

    const state = reactive({
      config: [
        {
          name: '安装数',
          valueKey: 'roomTempCount',
        }, {
          name: '温度',
          valueKey: 'roomTemp',
        },
        {
          name: '达标',
          valueKey: 'complianceRate',
        },
      ],
      summaryData: {},

      // 数字动效的参数配置
      optionsOne: {
        decimalPlaces: 2, //保留两位小数
        separator: '', // 千分位分隔符符号
      },
      // 保留整数情况
      optionsTwo: {
        decimalPlaces: 0, //整数
        separator: '', // 千分位分隔符符号
      },
    })

    const methods = {
      getData() {
        const obj1 = { roomTempCount: 7962 }
        // props.roomData = {
           complianceRate: "67.19"
           roomTemp: "19.84"
        }

        state.summaryData = { ...obj1, ...props.roomData }
        let option = {};

        state.config.forEach((item, index) => {
          // / 如果是.00的话,去掉.00,取整数
          if (Number(state.summaryData[item.valueKey]).toString().indexOf('.') === -1) {
            option = state.optionsTwo
          } else {
            option = state.optionsOne;
          }

          const countUp = new CountUp(valueRef.value[index], state.summaryData[item.valueKey], option);
          countUp.start();
        })
      },
    };

    const timer = ref(null)

    onUnmounted(() => {
      clearInterval(timer.value);
    })

    onMounted(() => {
      methods.getData();
      timer.value = setInterval(() => {
        methods.getData();
      }, 1000 * 20);
    })
    watch(() => props.roomData, (newVal) => {
      if (newVal) {
        methods.getData();
      }
    }, {
      immediate: true,
    })
    return {
      ...toRefs(state),
      ...methods,
      valueRef,
    }
  }
})
</script>

<style lang="less" scoped>
@font-face {
  font-family: "DIN";
  /*定义字体名*/
  src: url(../../../assets/font/D-DINCondensed-Bold.ttf);
  /*字体包的引入路径*/
}
.summary-data {
  width: 100%;
  height: 100%;
  display: flex;
  flex-direction: row;
  justify-content: space-around;
  align-items: center;

  .item {
    display: flex;
    flex-direction: column;
    // align-items: flex-end;
    position: relative;
    padding-top: 10px;

    .img {
      // width: 51px;
      // height: 51px;
      // margin-top: 11px;
    }

    .name {
      position: absolute;
      top: 9%;
      width: 140px;
      text-align: center;
      font-size: 16px;
      font-family: PingFangSC, PingFang SC;
      font-weight: 500;
      color: #61A9E8;
      line-height: 22px;
    }

    .data {
      flex: 1;
      height: 0;
      width: 100%;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      margin-top: 6px;
      position: absolute;
      top: 40%;
      left: 50%;
      transform: translate(-50%, 0%);


      .value {
        font-size: 36px;
        font-family: DIN;
        color: #FFFFFF;
        line-height: 50px;

      }
    }
  }
}
</style>

相关推荐

  1. [React] 手动实现CountTo 数字滚动效果

    2024-01-06 03:30:03       26 阅读
  2. QT:使用QStyle实现QMenu的滚动效果

    2024-01-06 03:30:03       54 阅读
  3. VUE +element ui 表格实现数据轮播滚动效果

    2024-01-06 03:30:03       48 阅读
  4. html视差滚动效果

    2024-01-06 03:30:03       19 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-06 03:30:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-06 03:30:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-06 03:30:03       82 阅读
  4. Python语言-面向对象

    2024-01-06 03:30:03       91 阅读

热门阅读

  1. 测试:常见的虚拟机命令

    2024-01-06 03:30:03       50 阅读
  2. OpenCV-Python(28):基于GrabCut 算法交互式前景提取

    2024-01-06 03:30:03       60 阅读
  3. 宝塔安装的imagemagick不能用,必须自己手动安装

    2024-01-06 03:30:03       67 阅读
  4. 企业怎么打造私域转化闭环?

    2024-01-06 03:30:03       62 阅读
  5. CodeBus投稿落选代码——瓦片地图粗糙版 记录

    2024-01-06 03:30:03       60 阅读
  6. 【学习记录】找最低位1/模块多次例化

    2024-01-06 03:30:03       64 阅读
  7. 《微信小程序开发从入门到实战》学习七十二

    2024-01-06 03:30:03       61 阅读
  8. Unity组件开发--事件管理器

    2024-01-06 03:30:03       55 阅读