範例講解js如何實現dom元素橫向及縱向捲動的動畫

2022-08-07 10:00:14

本篇文章給大家介紹js如何實現dom元素橫向、縱向捲動的動畫,希望對需要的朋友有所幫助!

通過settimeout實現的捲動動畫,支援反覆點選變快

支援水平捲動和豎直捲動,快速點選會將上次未捲動完的距離疊加,捲動的時間不變,捲動的速度會變快

使用方式

1、複製下方程式碼;

2、匯出對應的方法 movingColumn - 豎直捲動 moving--水平捲動

3、函數接收3個引數 dom: 要滑動的元素 space: 點選一次要捲動的距離 istop/isLeft 是否向上/左捲動

功能修改

const hz = 60 在規定時間分幾次捲動到目標位置 60是人肉眼可識別的重新整理率

每次捲動的時間為 settime裡的1ms * hz = 60ms

let timer:any = null // 定時器
let TargetLocation = -1 // 上一次點選應該捲動到的目標位置
let toltalSpace = 0 // 本次要捲動的距離

/**
 * @info 豎直捲動
 * @info 捲動動畫 hz 重新整理率 可以修改捲動的速度
 * @params dom:要捲動的元素; space 要捲動的距離; istop 捲動的方向;
*/
const movingColumn = (dom:HTMLDivElement, space: number, istop:boolean) => {

  // 使用者快速點選 則把上次未捲動的距離與本次捲動結合再一起
  if (timer && TargetLocation !== -1) {
    toltalSpace += TargetLocation - dom.scrollTop
    // 計算本次的目標距離
    if(istop) {
      TargetLocation = dom.scrollTop + toltalSpace + space
    } else {
      TargetLocation = dom.scrollTop + toltalSpace - space
    }
  } else if (!timer) {
    toltalSpace = 0
    TargetLocation = -1
  }

  if (istop) {
    toltalSpace -= space
  } else {
    toltalSpace += space
  }

  // 獲取本次的目標位置
  const position = dom.scrollTop
  TargetLocation = position + toltalSpace

  clearInterval(timer)
  timer = null
  const hz = 60
  let i = 1
  timer = setInterval(() => {
    dom.scrollTop = position + i * toltalSpace / hz
    ++i
    if (i >= hz) {
      clearInterval(timer)
      timer = null
      dom.scrollTop = TargetLocation // 位置修正
      toltalSpace = 0
      TargetLocation = -1
    }
  }, 1)
}


/**
 * @info 水平捲動
 * @info 捲動動畫 hz 重新整理率 可以修改捲動的速度
 * @params dom:要捲動的元素; space 要捲動的距離; isLeft 捲動的方向;
*/
const moving = (dom:HTMLDivElement, space: number, isLeft:boolean) => {

  // 使用者快速點選 則把上次未捲動的距離與本次捲動結合再一起
  if (timer && TargetLocation !== -1) {
    toltalSpace += TargetLocation - dom.scrollLeft
    // 計算本次的目標距離
    if(isLeft) {
      TargetLocation = dom.scrollLeft + toltalSpace + space
    } else {
      TargetLocation = dom.scrollLeft + toltalSpace - space
    }
  } else if (!timer) {
    toltalSpace = 0
    TargetLocation = -1
  }

  if (isLeft) {
    toltalSpace -= space
  } else {
    toltalSpace += space
  }

  // 獲取本次的目標位置
  const position = dom.scrollLeft
  TargetLocation = position + toltalSpace

  clearInterval(timer)
  timer = null
  const hz = 60
  let i = 1
  timer = setInterval(() => {
    dom.scrollLeft = position + i * toltalSpace / hz
    ++i
    if (i >= hz) {
      clearInterval(timer)
      timer = null
      dom.scrollLeft = TargetLocation // 位置修正
      toltalSpace = 0
      TargetLocation = -1
    }
  }, 1)
}

export {
  moving,
  movingColumn
}

相關推薦:【】

以上就是範例講解js如何實現dom元素橫向及縱向捲動的動畫的詳細內容,更多請關注TW511.COM其它相關文章!