制作大屏滚动数字和表格

1,682 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第27天,点击查看活动详情

最近在做大屏,总结一下项目中遇到的一些技术。大屏一般是所见即所得,所有的内容都展示在上面,所以滚动显示就很有必要了。制作滚动的数字和表格,我们一起看看吧~

滚动的表格

我用的vue-seamless-scroll,很方便,开箱即用

1. 安装

cnpm install vue-seamless-scroll --save

2. 引入

在main.js中注册

import VueSeamlessScroll from 'vue-seamless-scroll'
Vue.use(VueSeamlessScroll)

局部引用

import vueSeamlessScroll from "vue-seamless-scroll"; // 注册 
components: { 
    vueSeamlessScroll
},

3. 配置

一些基本配置,根据项目需要设置

computed:{
    optionSetting() {
        return {
            step: 0.4, // 数值越大速度滚动越快
            limitMoveNum: 2, // 开始无缝滚动的数据量 this.dataList.length
            hoverStop: true, // 是否开启鼠标悬停stop
            direction: 1, // 0向下 1向上 2向左 3向右
            openWatch: true, // 开启数据实时监控刷新dom
            singleHeight: 0, // 单步运动停止的高度(默认值0是无缝不停止的滚动) direction => 0/1
            singleWidth: 0, // 单步运动停止的宽度(默认值0是无缝不停止的滚动) direction => 2/3
            waitTime: 1000, // 单步运动停止的时间(默认值1000ms)
        };
    },
},

4. 实例

<div class="my-table">
    <div class="table_th">
        <span>设备编号</span>
        <span>设备位置</span>
        <span>设备状态</span>
        <span>设备类型</span>
    </div>
    <vue-seamless-scroll
            :data="tableData"
            class="table-list"
            :class-option="optionSetting"
    >
        <div class="table_td"
             v-for="item in tableData"
             :key="item.num"
             @click="tabs(item)"
        >
            <span>{{item.num}}</span>
            <span>{{item.place}}</span>
            <span :class="item.status == '正常' ? 'green-color':'red-color'">{{item.status}}</span>
            <span>{{item.type}}</span>
        </div>
    </vue-seamless-scroll>
</div>

5. 效果

1661248046203.gif

滚动的数字

1. html

<div class="chartNum">
    <div class="box-item">
        <li :class="{'number-item': !isNaN(item), 'mark-item': isNaN(item),'number-item3':index == 2}"
            v-for="(item,index) in vanceNum"
            :key="index">
                    <span v-if="!isNaN(item)">
                        <i ref="numberItem">0123456789</i>
                    </span>
            <span class="comma" v-else>{{item}}</span>
        </li>
        <span class="que">,</span>
    </div>
</div>

2. js代码

vanceNum: ['1','2','3','4','5','6'],
maxLen: 6,
// 获取随机数
getRandomNumber(min ,max){
    return Math.floor(Math.random() * (max - min)) + min;
},
// 定时获取次数
increaseNumberFn(){
    setInterval(this.increaseNumber, 3000);
    this.clear()
},
// 定时增长数字
increaseNumber(){
    let sum = 0;
    for (let i = 0; i < this.vanceNum.length; i++) {
        sum += this.vanceNum[i];
    }
    this.vanceNum = Number(sum) + this.getRandomNumber(1, 100);
    this.toFormatNum(this.vanceNum);
    this.setNumberTransform();
},
// 设置文字滚动
setNumberTransform() {
    const numberItems = this.$refs.numberItem; // 拿到数字的ref,计算元素数量
    if(this.vanceNum > 999999){
        this.vanceNum = 0;
    }
    const numberArr = this.vanceNum.filter(item => !isNaN(item));
    // 结合CSS 对数字字符进行滚动,显示场馆人次数量
    if(numberItems && numberItems.length){
        for (let index = 0; index < numberItems.length; index++) {
            const elem = numberItems[index];
            elem.style.transform = `translate(-50%, -${numberArr[index] * 10}%)`;
        }
    }
},
// 处理场馆人次
toFormatNum(num) {
    num = num.toString();
    // 把场馆人次数变成字符串
    if (num.length < this.maxLen) {
        num = '0' + num; // 如未满八位数,添加"0"补位
        this.toFormatNum(num); // 递归添加"0"补位
    } else if (num.length === this.maxLen) {
        // num = num.slice(0, 3) + ',' + num.slice(3, this.maxLength);
        this.vanceNum = num.split(''); // 将其便变成数据,渲染至滚动数组
    } else {
        this.vanceNum = ['1','2','3','4','5','6'];
        // 场馆人次总量数字超过显示异常
        // this.$message.warning('场馆人次总量数字过大,显示异常')
    }
},

3. 效果

1661248113328.gif