vue 无缝滚动,有滚动条切可拖拽

发布于 2022-09-12 02:22:57 字数 2149 浏览 48 评论 0

模拟了一个滚动条:如图:
image.png
拖动滚动时,需要滚动条和正文同步实时移动,移动的功能实现了,但是实时出了问题,滚动条和正文移动出现了明显的卡顿。请高手指教应该如何处理这两行代码。在线等待

odiv.style.marginTop = top + 'px';
this.$refs.scrollCon.style.marginTop = (-2)*(top/this.scrollBarBF) + 'px';

完整的代码如下:

<div class="con" :style="'height:'+scrollHeight+'px'" @mouseenter="hstop()" @mouseleave="hgo()">
    <div ref="scrollCon" :style="'margin-top: '+ hscrollH +'px;'">
    <div class="tr" v-for="(item, i) in list" :key="i">
        <div class="td td1 textCenter">{{i + 1}}</div>
        <div class="td td2 textCenter">{{item.code}}</div>
    </div>
    <div class="scrollBar">
        <div @mousedown="scrollBarMove" class="bar" :style="'height: '+scrollBarH+'px; margin-top: '+scrollBarM+'px;'"></div>
    </div>
</div>
scrollBarMove(e){
      this.hstop();
          let odiv = e.target;        //获取目标元素
        
        //算出鼠标相对元素的位置
        let disX = e.clientX - odiv.offsetLeft;
        let disY = e.clientY - odiv.offsetTop;
        
        document.onmousemove = (e)=>{
        //用鼠标的位置减去鼠标相对元素的位置,得到元素的位置
        let top = e.clientY - disY;
      
        //绑定元素位置
//      this.hscrollH = (-2)*(top/this.scrollBarBF);
//      this.scrollBarM = top;

        //移动当前元素
        odiv.style.marginTop = top + 'px';
        this.$refs.scrollCon.style.marginTop = (-2)*(top/this.scrollBarBF) + 'px';
        };
        document.onmouseup = (e) => {
        
        document.onmousemove = null;
        document.onmouseup = null;
        };
    },

发现了原因所在,因为我这个滚动条是自动滚动的,无缝滚动效果:

hgo(){
    var _this = this;
    this.htimer = setInterval(function(){
        if(_this.hscrollH > _this.hscrollMove){
            _this.hscrollH -= 2;
            _this.scrollBarM += _this.scrollBarBF;
        }else{
            _this.hscrollH = 0;
            _this.scrollBarM = 0;
        }
    },50)
},

计时器的频率是50毫秒一次,我修改成500毫秒滚动条的拖拽就没有问题,我观察了CPU和内存使用率,的确是我计时器的问题,继续修复中,请高手继续帮我分析。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

东京女 2022-09-19 02:22:57

问题已经解决,原因是页面计时器频率有点高,从50毫秒改成100毫秒就不会卡顿了。

出现了另外一个问题,与该主题无关,因此帖子结了。

千里故人稀 2022-09-19 02:22:57

你需要做防抖,可以直接用 lodash 的 debounce,当然自己做一个也很简单

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文