实现table自动滚动,并在每一行开始时自动暂停一秒,

在页面中设置 tbRow 和 tbDom 用于获取每个元素宽度和总体shjs 中监听数据来源,达到要求大小后每秒自动运行

let tbDom = ref(null)
let tbRow = ref(null)
let animationId = null
let isPaused = true
let position = 0

watch(() => props.insInfoList, (val) => {
  // 只有数据长度大于0时触发滚动
  if (val.length > 2 && props.autoScroll && isPaused) {
    isPaused = false
    nextTick(()=>{
      animation()
    })
  }
})

function animation() {
  let scrollSpeed = 5
  let rowWidth = formatRoundNumber(tbRow.value[0].offsetWidth)
  // 暂停的像素位数组
  let pauseArr = findMultiplesInRange(10000, rowWidth, scrollSpeed)
  const animate = () => {

    // console.log("tb dom", tbRow, tbDom)
    // let tbWidth = tbDom.value.offsetWidth;
    position -= scrollSpeed;
    // 空出数据时复位
    if (position <= -(rowWidth * props.insInfoList.length)) {
      position = 0;
    }
    // console.log("position", position, -(rowWidth * 10.5) )
    tbDom.value.style.transform = `translateX(${position}px)`;
    if (pauseArr.includes(-position) || position === -scrollSpeed) {
      setTimeout(()=>{
        animationId = requestAnimationFrame(animate);
      }, 1000)
    } else {
      animationId = requestAnimationFrame(animate);
    }
  };
  // 有 animationId 说明已经在滚动了,不需要重复触发滚动
  if (!animationId) {
    animate()
  }
}

涉及到的数据处理 js

// 四舍五入数据
export function formatRoundNumber(number, float) {
    if (!number || isNaN(number)) {
        return 0
    }
    float = float ? float : 0
    let pow = Math.pow(10, float)
    number = Math.round(number * pow)
    return (number / pow).toFixed(float);
}

// 在 a 中找b的倍数,对 b 做处理返回接近 c 倍数的数,返回一个数组
export function findMultiplesInRange(a, b, c) {
    let resArr = []
    a = Number.parseInt(a)
    b = Number.parseInt(b)
    c = Number.parseInt(c)

    let bMulti = 0
    while (bMulti < a) {
        bMulti = b + bMulti

        // 如果能被 c 整除直接添加到数组
        if (bMulti % c === 0) {
            resArr.push(bMulti)
        } else {
            // 求 b 倍数是 c 的多少倍,然后算倍数前后的数据做比较,返回最接近的数
            let multi = Math.floor(bMulti / c)
            let num1 = c * multi
            let num2 = c * (multi + 1)

            resArr.push(Math.abs(bMulti - num1) <= Math.abs(bMulti - num2) ? num1 : num2)
        }

    }

    return resArr
}

GitHub 加速计划 / vu / vue
207.54 K
33.66 K
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:2 个月前 )
73486cb5 * chore: fix link broken Signed-off-by: snoppy <michaleli@foxmail.com> * Update packages/template-compiler/README.md [skip ci] --------- Signed-off-by: snoppy <michaleli@foxmail.com> Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 4 个月前
e428d891 Updated Browser Compatibility reference. The previous currently returns HTTP 404. 5 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐