站长资讯网
最全最丰富的资讯网站

实例讲解js如何实现dom元素横向及纵向滚动的动画

本篇文章给大家介绍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 }

赞(0)
分享到: 更多 (0)