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 相关文章推荐
快速解决vue2+vue-cli3项目ie兼容的问题
Nov 17 Vue.js
Vue中computed和watch有哪些区别
Dec 19 Vue.js
vue项目中openlayers绘制行政区划
Dec 24 Vue.js
Vue实现随机验证码功能
Dec 29 Vue.js
vue中实现点击空白区域关闭弹窗的两种方法
Dec 30 Vue.js
Vue 实例中使用$refs的注意事项
Jan 29 Vue.js
vue-video-player 断点续播的实现
Feb 01 Vue.js
如何使用vue3打造一个物料库
May 08 Vue.js
Vue和Flask通信的实现
May 19 Vue.js
vue打包时去掉所有的console.log
Apr 10 Vue.js
vue项目proxyTable配置和部署服务器
Apr 14 Vue.js
vue3不同环境下实现配置代理
May 25 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实现用户认证及管理完全源码
2007/03/11 PHP
PHP和XSS跨站攻击的防范
2007/04/17 PHP
rrmdir php中递归删除目录及目录下的文件
2011/05/15 PHP
php设计模式 Command(命令模式)
2011/06/26 PHP
PHP抓屏函数实现屏幕快照代码分享
2014/01/02 PHP
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
2014/01/14 PHP
Linux下手动编译安装PHP扩展的例子分享
2014/07/15 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
JavaScript 事件记录使用说明
2009/10/20 Javascript
js select常用操作控制代码
2010/03/16 Javascript
jquery连缀语法如何实现
2012/11/29 Javascript
Yii-自定义删除确认弹框(zyd)jquery实现代码
2013/03/04 Javascript
使用POST方式弹出窗口的两种方法示例介绍
2014/01/29 Javascript
Javascript连接多个数组不用concat来解决
2014/03/24 Javascript
Javascript代码实现仿实例化类
2015/04/03 Javascript
原生JS实现移动端web轮播图详解(结合Tween算法造轮子)
2017/09/10 Javascript
webpack vue项目开发环境局域网访问方法
2018/03/20 Javascript
深入了解JavaScript 私有化
2019/05/30 Javascript
实现一个 Vue 吸顶锚点组件方法
2019/07/10 Javascript
layer设置maxWidth及maxHeight解决方案
2019/07/26 Javascript
[04:30]显微镜下的DOTA2第五期——拉比克
2013/09/26 DOTA
Python基于正则表达式实现文件内容替换的方法
2017/08/30 Python
解决python ogr shp字段写入中文乱码的问题
2018/12/31 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
2019/01/15 Python
python 多线程重启方法
2019/02/18 Python
python 计算数据偏差和峰度的方法
2019/06/29 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
Python检测端口IP字符串是否合法
2020/06/05 Python
大学生求职简历的自我评价
2013/10/14 职场文书
玲玲的画教学反思
2014/02/04 职场文书
岗位廉政承诺书
2014/03/27 职场文书
承兑汇票转让证明怎么写?
2014/11/30 职场文书
满月酒邀请函
2015/01/30 职场文书
2015年南京大屠杀纪念日活动总结
2015/03/24 职场文书
2016廉洁教育心得体会
2016/01/20 职场文书
Python 图片添加美颜效果
2022/04/28 Python