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 相关文章推荐
vue+vant实现购物车全选和反选功能
Nov 17 Vue.js
Vue实现购物小球抛物线的方法实例
Nov 22 Vue.js
vue表单验证之禁止input输入框输入空格
Dec 03 Vue.js
vue 数据操作相关总结
Dec 17 Vue.js
vue-quill-editor插入图片路径太长问题解决方法
Jan 08 Vue.js
基于vuex实现购物车功能
Jan 10 Vue.js
vue实现轮播图帧率播放
Jan 26 Vue.js
如何使用vue3打造一个物料库
May 08 Vue.js
vue使用节流函数的踩坑实例指南
May 20 Vue.js
vue如何使用模拟的json数据查看效果
Mar 31 Vue.js
教你部署vue项目到docker
Apr 05 Vue.js
el-table-column 内容不自动换行的解决方法
Aug 14 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
收音机史话 - 1960年代前后的DIY
2021/03/02 无线电
一步一步学习PHP(8) php 数组
2010/03/05 PHP
PHP生成网站桌面快捷方式代码分享
2014/10/11 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
2016/02/27 PHP
Laravel如何实现自动加载类
2019/10/14 PHP
jquery之超简单的div显示和隐藏特效demo(分享)
2013/07/09 Javascript
js实现两个值相加alert出来精确到指定位
2013/09/25 Javascript
javaScript中slice函数用法实例分析
2015/06/08 Javascript
js 颜色选择插件
2017/01/23 Javascript
jQuery模拟下拉框选择对应菜单的内容
2017/03/07 Javascript
微信小程序 开发之全局配置
2017/05/05 Javascript
Angular 2父子组件数据传递之@Input和@Output详解(下)
2017/07/05 Javascript
Node.js如何实现注册邮箱激活功能 (常见)
2017/07/23 Javascript
Angular 5.0 来了! 有这些大变化
2017/11/15 Javascript
JQuery判断radio单选框是否选中并获取值的方法
2019/01/17 jQuery
js实现选项卡效果
2020/03/07 Javascript
python实现K最近邻算法
2018/01/29 Python
解决Python requests库编码 socks5代理的问题
2018/05/07 Python
Python 从一个文件中调用另一个文件的类方法
2019/01/10 Python
pycharm+PyQt5+python最新开发环境配置(踩坑)
2019/02/11 Python
python获取交互式ssh shell的方法
2019/02/14 Python
简单了解Python生成器是什么
2019/07/02 Python
python实现windows倒计时锁屏功能
2019/07/30 Python
Python统计学一数据的概括性度量详解
2020/03/03 Python
谈谈对css属性box-sizing的了解
2017/01/04 HTML / CSS
GAP美国官网:美国休闲时尚品牌
2016/08/26 全球购物
捷克家具销售网站:SCONTO Nábytek
2020/01/02 全球购物
LVMH旗下最大的奢侈品网站平台:24S
2020/05/24 全球购物
药剂学专业应届生自荐信
2013/09/29 职场文书
承诺书模板
2014/08/30 职场文书
婚宴邀请函
2015/01/30 职场文书
给病人的慰问信
2015/03/23 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
Python实现批量将文件复制到新的目录中再修改名称
2022/04/12 Python
Redis基本数据类型Set常用操作命令
2022/06/01 Redis
MySQL主从切换的超详细步骤
2022/06/28 MySQL