当前位置: 首页 > Web前端 > HTML

【近期项目总结】使用Vue实现一个简单的鼠标拖动滚动效果插件

时间:2023-04-02 20:37:19 HTML

.vue-drag-scroll-out-wrapper{overflow-x:hidden;宽度:100%;高度:100%;光标:抓住;位置:绝对;顶部:0;左:0;&::-webkit-scrollbar{width:0!important}//隐藏垂直滚动条}喜欢再看,微信搜索【大千世界】,关注【前端小智】这个不有大厂背景,但有积极向上的心态。本文已收录到GitHubhttps://github.com/qq44924588...,文章已分类,也整理了很多我的文档和教程资料。最近开源了一个Vue组件,但是还不够完善。欢迎大家一起完善,也希望大家能给个star支持一下。谢谢。github地址:https://github.com/qq44924588...演示案例http://www.longstudy.club/vue...最近在做一个新项目,有这样的需求:简单描述一下,即鼠标拖动页面,整个页面会随着鼠标的拖动而移动。如果页面有内容,里面的内容也需要随着被拖动的外层一起整体移动。一开始没什么想法,发了朋友圈,得到了很多答案,主要是用拖拽,但是这个拖拽只是单个元素拖拽,想拖拽整个视图。这里又断线了。于是又回到飞书的类似功能的页面,然后仔细查看了它页面的DOM结构,如下图:找到这一层,把页面设置得很宽很高,为了隐藏滚动条,所以设置overflow:hidden;,看到这个设置,突然灵光一闪,难道是用拖动来触发滚动条的滚动,想想,哇,这个思路可行,NB。我将尝试创建一个vue项目。我不会详细说明这一点。我已经在github上发布了原始代码。有兴趣的可以自己看看:https://github.com/qq44924588...先加个大宽高://这里省略一些不太重要的代码

这里设置了一个计算属性zoomStye,主要用处是给外层加上一个width,和high,这里我还设置了一个zoom比较,为了页面的放大和缩小,下面说说关于它下面。运行效果:接下来我们需要监听鼠标拖动触发滚动条效果,因为需要对dom进行操作,所以这里我们将拖动处理逻辑用vue命令封装起来,这样后面如果有需要,只需使用此命令。注意:如果在vue中需要对dom进行多项操作,最好用指令进行封装。指令代码如下:importVuefrom'vue'Vue.directive('dragscroll',function(el){el.onmousedown=function(ev){console.log(el)constdisX=ev.clientXconstdisY=ev.clientYconstoriginalScrollLeft=el.scrollLeftconstoriginalScrollTop=el.scrollTopconstoriginalScrollBehavior=el.style['scroll-behavior']constoriginalPointerEvents=el.style['pointer-events']//auto:默认值,表示滚动框立即滚动到指定位置。el.style['scroll-behavior']='auto'el.style['cursor']='grabbing'//鼠标移动事件是监听整个文档,这样鼠标也可以移到element实现拖动document.onmousemove=function(ev){ev.preventDefault()//计算拖动的偏移距离constdistanceX=ev.clientX-disXconstdistanceY=ev.clientY-disYel.scrollTo(originalScrollLeft-distanceX,originalScrollTop-distanceY)console.log(originalScrollLeft-distanceX,originalScrollTop-distanceY)//由于我们的图片本身有点击效果,所以我们需要屏蔽掉鼠标拖动时的点击事件el.style['pointer-events']='none'document.body.style['cursor']='grabbing'}document.onmouseup=function(){document.onmousemove=nulldocument.onmouseup=nullel.style['scroll-behavior']=originalScrollBehaviorel.style['pointer-events']=originalPointerEventsel.style['cursor']='grab'}}})这里的主要思想是使用el.scrollTo来触发滚动条的移动。使用dragscroll命令,让我们使用它。首先,我们需要添加一个外层:/这里省略一些不太重要的代码
.vue-drag-scroll-out-wrapper{overflow-x:hidden;宽度:100%;高度:100%;光标:抓住;位置:绝对;顶部:0;左:0;&::-webkit-scrollbar{width:0!important}//隐藏垂直滚动条}这里需要注意的是.vue-drag-scroll-out-wrapper中必须设置溢出值,否则无法滚动(测试)。这样,拖拽效果就出来了:增加缩放这里我们添加一个视图来放大和缩小,所以添加两个按钮:{{scale}}%
作用:这里放大和缩小的逻辑是通过缩放缩放来实现的handleReduce(){if(this.scale===25)returnthis.scale-=25},handleEnlarge(){if(this.scale===100)returnthis.scale+=25}缩放关系是switch给出的代码:constINIT_WIDTH=2208constINIT_HEIGHT=1206constwidth=INIT_WIDTH*(1+(100-this.scale)/100)constheight=INIT_HEIGHT*(1+(100-this.scale)/100)这个比例是我自己定的。比如现在缩小到75%,那么最外层的高和宽会相应增加25%,因为scaling是视野在变窄,对应的距离在变宽。最后就是用CSS的transform做缩放:transform:`scale(${this.scale/100})`最终效果:目前只是简单的排版,大家可以根据自己的需要进行布局,这里主要是分享一些想法,如果你有好的想法,欢迎留言分享。代码部署后可能存在的bug,无法实时获知。事后为了解决这些bug,花费了大量的时间在日志调试上。顺便推荐一个好用的bug监控工具Fundebug。交流文章每周更新一次。可以微信搜索【大千世界】立即阅读,回复【福利】还有很多前端视频等着你。本文已收录到GitHubhttps://github.com/qq449245884/xiaozhi,欢迎Star。