vue实现两个区域滚动条同步滚动


Posted in Vue.js onDecember 13, 2020

本文实例为大家分享了vue实现两个区域滚动条同步滚动的具体代码,供大家参考,具体内容如下

项目开发中,遇到一个比较两个form差异的需求,但当item过多就需要滚动条,这里就用到了滚动条同步的地方,其实原理和git的差异比较差不多,这里来做一下分析。

这是效果图:

vue实现两个区域滚动条同步滚动

要点分析:

其实主要是通过ref属性来操控两个div的scrollTop属性

<div class="customer-span" ref="systemForm" @scroll="sysHandleScroll()" @mouseover="changeFlag(false)">
 <div class="customer-span-form">
 <el-form label-suffix=":" class="form-static" label-position="right" label- 
 width="100px">
  <el-form-item v-for="(item, index) in formItem" :key="index" :label="item.label">
  {{ systemFormData[item.model] }}
  </el-form-item>
 </el-form>
 </div>
</div>
<div class="customer-span" ref='externalForm' @scroll="exterHandleScroll()" @mouseover="changeFlag(true)">
 <div class="customer-span-form">
 <el-form label-suffix=":" class="form-static" label-position="right" label- 
 width="100px">
  <el-form-item v-for="(item, index) in formItem" :key="index" :label="item.label">
  {{ externalFormData[item.model] }}
  </el-form-item>
  </el-form>
 </div>
</div>

js部分

data() {
 return {
 flag: false
 }
},
method: {
 changeFlag(flag) {
 this.flag = flag
 },
 // 左右滚动条滚动同步
 sysHandleScroll() {
 if (!this.flag) {
  this.$refs.externalForm.scrollTop = this.$refs.systemForm.scrollTop
 }
 },
 exterHandleScroll() {
 if (this.flag) {
  this.$refs.systemForm.scrollTop = this.$refs.externalForm.scrollTop
 }
 }
}

步骤解析:

1、首先你要给你的两个div设置固定高度,分别出现滚动条

2、然后再通过给两个div分别绑定ref属性

3、接下来给两个div添加scroll方法,监控滚动条变化

4、最后分别在方法里设置两个滚动条的scrollTop值一样

2020/7/31更新,解决滚轮滑动滚动条移动缓慢问题

感谢评论区小伙伴发现的bug,这里说一下原因和解决方案

发生原因:因为对两个div都添加了scroll方法,一个区域滚动会改变另外一个区域的scrollTop,但是同时触发了这个区域自己的scroll方法,又会进行改变,这样就形成了两个scroll的无限回调,最终发生了看到的结果,移动非常缓慢。

解决思路:大致思路是添加一个flag属性,两个scroll事件分别传入不同的值,再根据这个值去判断是否设置scrollTop属性,这样就不会造成无线循环,这里的flag属性需要在scroll事件之前传入,所以这里通过mouserover事件传入该属性。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Vue.js 相关文章推荐
vue3.0实现点击切换验证码(组件)及校验
Nov 18 Vue.js
Vue用mixin合并重复代码的实现
Nov 27 Vue.js
vue $router和$route的区别详解
Dec 02 Vue.js
如何实现vue的tree组件
Dec 03 Vue.js
vue监听滚动事件的方法
Dec 21 Vue.js
vue使用v-model进行跨组件绑定的基本实现方法
Apr 28 Vue.js
详解Vue router路由
Nov 20 Vue.js
详解Vue中$props、$attrs和$listeners的使用方法
Feb 18 Vue.js
Vue3如何理解ref toRef和toRefs的区别
Feb 18 Vue.js
vue封装数字翻牌器
Apr 20 Vue.js
详解Vue3使用axios的配置教程
Apr 29 Vue.js
vue实现在data里引入相对路径
Jun 05 Vue.js
vue实现滚动鼠标滚轮切换页面
Dec 13 #Vue.js
详解vue中使用transition和animation的实例代码
Dec 12 #Vue.js
详解如何在vue+element-ui的项目中封装dialog组件
Dec 11 #Vue.js
vue使用exif获取图片经纬度的示例代码
Dec 11 #Vue.js
vue使用exif获取图片旋转,压缩的示例代码
Dec 11 #Vue.js
Vue 实现一个简单的鼠标拖拽滚动效果插件
Dec 10 #Vue.js
vuex页面刷新导致数据丢失的解决方案
Dec 10 #Vue.js
You might like
php从给定url获取文件扩展名的方法
2015/03/14 PHP
PHP使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
学习php设计模式 php实现门面模式(Facade)
2015/12/07 PHP
JQuery困惑—包装集 DOM节点
2009/10/16 Javascript
改进版通过Json对象实现深复制的方法
2012/10/24 Javascript
js实现文本框支持加减运算的方法
2015/08/19 Javascript
angularjs自定义ng-model标签的属性
2016/01/21 Javascript
全面解析Bootstrap中nav、collapse的使用方法
2016/05/22 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
2017/06/03 Javascript
nodejs利用ajax实现网页无刷新上传图片实例代码
2017/06/06 NodeJs
用JS编写一个函数,返回数组中重复出现过的元素(实例)
2017/09/14 Javascript
Vue2.5 结合 Element UI 之 Table 和 Pagination 组件实现分页功能
2018/01/26 Javascript
自己动手封装一个React Native多级联动
2018/09/19 Javascript
js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解
2019/01/19 Javascript
js动态获取时间的方法分析
2019/08/02 Javascript
Vue中函数防抖节流的理解及应用实现
2020/04/24 Javascript
python简单程序读取串口信息的方法
2015/03/13 Python
读写json中文ASCII乱码问题的解决方法
2016/11/05 Python
Python3对称加密算法AES、DES3实例详解
2018/12/06 Python
django框架事务处理小结【ORM 事务及raw sql,customize sql 事务处理】
2019/06/27 Python
利用Python检测URL状态
2019/07/31 Python
使用Python生成200个激活码的实现方法
2019/11/22 Python
英国知名美妆护肤在线商城:Zest Beauty
2018/04/24 全球购物
Clearly新西兰:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
澳大利亚在线高跟鞋商店:Shoe Me
2019/11/19 全球购物
"火柴棍式"程序员面试题
2014/03/16 面试题
某同学的自我鉴定范文
2013/12/26 职场文书
会计自我鉴定
2014/02/04 职场文书
商业房地产广告语
2014/03/13 职场文书
个人整改措施落实情况汇报
2014/10/29 职场文书
市场督导岗位职责
2015/04/10 职场文书
志愿者服务宣传标语口号
2015/12/26 职场文书
致创业您:正能量激励人心句子(48条)
2019/08/15 职场文书
《狼王梦》读后感:可怜天下父母心
2019/11/01 职场文书
浅谈redis五大数据结构和使用场景
2021/04/12 Redis
如何将numpy二维数组中的np.nan值替换为指定的值
2021/05/14 Python