vue 数字翻牌器动态加载数据


Posted in Vue.js onApril 20, 2022

数字动态翻牌器

最近项目里使用到了数字翻牌器,于是自己写了一个,动态的翻牌器

第一步创建一个组件页面,NumberCount.vue

思路:大概就是显示几位数,然后从0开始滚动到当前的数值的位置,在每一个位置都有0-9的数,然后就是往上滚动当前数值的次数到当前的数,话不多说上代码

<template>
  <div class="chartNum">
    <div class="box-item">
      <li
        :class="{ 'number-item': !isNaN(item), 'mark-item': isNaN(item) }"
        v-for="(item, index) in orderNum"
        :key="index"
      >
        <span v-if="!isNaN(item)">
          <i ref="numberItem">0123456789</i>
        </span>
        <span class="comma" v-else>{{ item }}</span>
      </li>
    </div>
  </div>
</template>
<script>
export default {
  props: {
    // 显示的数字
    number: {
      type: Number,
    },
    // 显示的长度
    length: {
      type: Number,
    },
  },
  data() {
    return {
      orderNum: ['0', '0', '0', '0', '0', '0', '0', '0'], // 默认总数
    };
  },
  mounted() {
    setTimeout(() => {
      this.toOrderNum(this.number); // 这里输入数字即可调用
    }, 500);
  },
  watch: {
    number: {
      handler(val) {
        this.toOrderNum(val);
      },
      deep: true,
    },
  },
  methods: {
    // 设置文字滚动
    setNumberTransform() {
      const numberItems = this.$refs.numberItem; // 拿到数字的ref,计算元素数量
      // eslint-disable-next-line no-restricted-globals
      const numberArr = this.orderNum.filter(item => !isNaN(item));
      console.log(numberItems.length, numberArr);
      // 结合CSS 对数字字符进行滚动,显示数量
      for (let index = 0; index < numberItems.length; index += 1) {
        const elem = numberItems[index];
        elem.style.transform = `translate(-50%, -${numberArr[index] * 10}%)`;
      }
    },
    // 处理总数字
    toOrderNum(num) {
      const numtext = num.toString();
      if (this.length) {
        if (numtext.length < this.length) {
          const numlist = `0${numtext}`; // 如未满固定数,添加"0"补位
          this.toOrderNum(numlist); // 递归添加"0"补位
        } else if (numtext.length === num.length) {
          this.orderNum = numtext.split(''); // 将其便变成数据,渲染至滚动数组
        }
      } else {
        this.orderNum = numtext.split('');
      }
      // 数字中加入逗号
      // const length = numtext.length / 3;
      // let count = '';
      // for (let i = 0; i < length; i += 1) {
      //   if (i === 0) {
      //     count += `${numtext.slice(i, i + 3)},`;
      //     console.log(count);
      //   } else if (i === length - 1) {
      //     count += numtext.slice(i * 3, i * 3 + 3);
      //     console.log(count);
      //   } else {
      //     count += `${numtext.slice(i * 3, i * 3 + 3)},`;
      //     console.log(count);
      //   }
      // }
      // this.orderNum = count.split('');
      this.setNumberTransform();
    },
  },
};
</script>
<style scoped lang="scss">
/*总量滚动数字设置*/
.box-item {
  position: relative;
  height: 34px;
  font-size: 20px;
  font-family: AzonixRegular;
  color: #021c25;
  line-height: 41px;
  text-align: center;
  list-style: none;
  writing-mode: vertical-lr;
  text-orientation: upright;
}
/* 默认逗号设置 */
.mark-item {
  width: 28px;
  height: 34px;
  position: relative;
  /* 背景图片 */
  background: url('~@/assets/images/overview/bg-chartNum.svg') no-repeat center
    center;
  background-size: 100% 100%;
  list-style: none;
  margin-right: 1px;
  & > span {
    position: absolute;
    width: 100%;
    height: 100%;
    bottom: 2px;
    left: 20%;
    font-size: 20px;
    writing-mode: vertical-rl;
    text-orientation: upright;
  }
}
/*滚动数字设置*/
.number-item {
  width: 28px;
  height: 34px;
  /* 背景图片 */
  background: url('~@/assets/images/overview/bg-chartNum.svg') no-repeat center
    center;
  background-size: 100% 100%;
  // background: #ccc;
  list-style: none;
  margin-right: 1px;
  & > span {
    position: relative;
    display: inline-block;
    margin-right: 10px;
    width: 100%;
    height: 100%;
    writing-mode: vertical-rl;
    text-orientation: upright;
    overflow: hidden;
    display: flex;
    align-items: center;
    justify-content: center;
    & > i {
      font-style: normal;
      position: absolute;
      top: 8px;
      left: 50%;
      transform: translate(-50%, 0);
      transition: transform 1s ease-in-out;
      letter-spacing: 10px;
    }
  }
}
.number-item:last-child {
  margin-right: 0;
}
</style>

不加逗号:

vue 数字翻牌器动态加载数据

加入逗号:

vue 数字翻牌器动态加载数据

至于样式背景可以自定义

以上就是本文的全部内容,希望对大家的学习有所帮助。

Vue.js 相关文章推荐
深入了解Vue3模板编译原理
Nov 19 Vue.js
VUE项目实现主题切换的多种方法
Nov 26 Vue.js
vue动态合并单元格并添加小计合计功能示例
Nov 26 Vue.js
如何正确解决VuePress本地访问出现资源报错404的问题
Dec 03 Vue.js
详解Vue中的自定义指令
Dec 07 Vue.js
基于vuex实现购物车功能
Jan 10 Vue.js
vue实现防抖的实例代码
Jan 11 Vue.js
Vue中的nextTick作用和几个简单的使用场景
Jan 25 Vue.js
vue2实现provide inject传递响应式
May 21 Vue.js
vue 把二维或多维数组转一维数组
Apr 24 Vue.js
vue使用element-ui按需引入
May 20 Vue.js
vue3不同环境下实现配置代理
May 25 Vue.js
vue3.0 数字翻牌组件的使用方法详解
Apr 20 #Vue.js
vue封装数字翻牌器
Apr 20 #Vue.js
vue特效之翻牌动画
Apr 20 #Vue.js
解决vue中provide inject的响应式监听
Apr 19 #Vue.js
vue3种table表格选项个数的控制方法
Apr 14 #Vue.js
vue项目配置sass及引入外部scss文件
Apr 14 #Vue.js
解决vue-router的beforeRouteUpdate不能触发
Apr 14 #Vue.js
You might like
由php的call_user_func传reference引发的思考
2010/07/23 PHP
codeigniter自带数据库类使用方法说明
2014/03/25 PHP
使用PHP生成PDF方法详解
2015/01/23 PHP
PHP请求Socket接口测试实例
2016/08/12 PHP
php正则修正符用法实例详解
2016/12/29 PHP
JavaScript 字符串连接性能优化
2008/12/20 Javascript
js日期时间补零的小例子
2013/03/05 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
jQuery基本过滤选择器用法示例
2016/09/09 Javascript
JavaScript实现打印星型金字塔功能实例分析
2017/09/27 Javascript
AngualrJs清除定时器遇到的坑
2017/10/13 Javascript
JS实现的邮箱提示补全效果示例
2018/01/30 Javascript
Vue中的基础过渡动画及实现原理解析
2018/12/04 Javascript
通过vue手动封装on、emit、off的代码详解
2019/05/29 Javascript
vue draggable resizable 实现可拖拽缩放的组件功能
2019/07/15 Javascript
关于vue里页面的缓存详解
2019/11/04 Javascript
Ant Design Pro 下实现文件下载的实现代码
2019/12/03 Javascript
JS实现碰撞检测效果
2020/03/12 Javascript
[01:37]TI4西雅图DOTA2前线报道 VG拿下首胜教练357给出获胜秘诀
2014/07/10 DOTA
[03:34]2014DOTA2西雅图国际邀请赛 淘汰赛7月15日TOPPLAY
2014/07/15 DOTA
python2.7 json 转换日期的处理的示例
2018/03/07 Python
python pandas实现excel转为html格式的方法
2018/10/23 Python
python re库的正则表达式入门学习教程
2019/03/08 Python
python爬虫实现中英翻译词典
2019/06/25 Python
解析python实现Lasso回归
2019/09/11 Python
python实现把二维列表变为一维列表的方法分析
2019/10/08 Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
2020/10/29 Python
毕业生实习鉴定
2013/12/11 职场文书
《宿建德江》教学反思
2014/04/23 职场文书
今冬明春火灾防控工作方案
2014/05/29 职场文书
2015年保卫科工作总结
2015/05/14 职场文书
公司年会开场白
2015/06/01 职场文书
安全伴我行主题班会
2015/08/13 职场文书
电力安全教育培训心得体会
2016/01/11 职场文书
Nginx下配置Https证书详细过程
2021/04/01 Servers
浅谈如何提高PHP代码的质量
2021/05/28 PHP