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实现滚动鼠标滚轮切换页面
Dec 13 Vue.js
Vue实现指令式动态追加小球动画组件的步骤
Dec 18 Vue.js
SpringBoot+Vue 前后端合并部署的配置方法
Dec 30 Vue.js
vuex的使用步骤
Jan 06 Vue.js
vue-router懒加载的3种方式汇总
Feb 28 Vue.js
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
May 18 Vue.js
Vue Element UI自定义描述列表组件
May 18 Vue.js
vue-element-admin项目导入和导出的实现
May 21 Vue.js
Vue鼠标滚轮滚动切换路由效果的实现方法
Aug 04 Vue.js
Vue实现跑马灯样式文字横向滚动
Nov 23 Vue.js
ant design vue的form表单取值方法
Jun 01 Vue.js
vue @ ~ 相对路径 路径别名设置方式
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版本号
2006/10/09 PHP
PHP的5个安全措施小结
2012/07/17 PHP
php基于base64解码图片与加密图片还原实例
2014/11/03 PHP
php设计模式之单例模式代码
2016/06/11 PHP
测试JavaScript字符串处理性能的代码
2009/12/07 Javascript
Extjs优化(一)删除冗余代码提高运行速度
2013/04/15 Javascript
基于jquery实现在线选座订座之影院篇
2015/08/24 Javascript
Underscore源码分析
2015/12/30 Javascript
JavaScript学习笔记之数组的增、删、改、查
2016/03/23 Javascript
AngularJS 2.0入门权威指南
2016/10/08 Javascript
JS倒计时实例_天时分秒
2017/08/22 Javascript
vue axios 在页面切换时中断请求方法 ajax
2018/03/05 Javascript
vue filters的使用详解
2018/06/11 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
2018/10/20 Javascript
mpvue 项目初始化及实现授权登录的实现方法
2020/07/20 Javascript
JS sort排序详细使用方法示例解析
2020/09/27 Javascript
[51:32]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
python django 增删改查操作 数据库Mysql
2017/07/27 Python
在python中使用xlrd获取合并单元格的方法
2018/12/26 Python
python求平均数、方差、中位数的例子
2019/08/22 Python
Python 通过正则表达式快速获取电影的下载地址
2020/08/17 Python
GLAMGLOW格莱魅美国官网:美国知名的面膜品牌
2016/12/31 全球购物
英国最大的电子零件及配件零售商:Partmaster
2017/04/24 全球购物
孤独星球出版物:Lonely Planet Publications
2018/03/17 全球购物
英国标志性生活方式品牌:Skinnydip London
2019/12/15 全球购物
如何打开WebSphere远程debug
2014/10/10 面试题
大四自我鉴定范文
2013/10/06 职场文书
化验室技术员岗位职责
2013/12/24 职场文书
《狼》教学反思
2014/03/02 职场文书
中班幼儿评语大全
2014/04/30 职场文书
小学美术兴趣小组活动总结
2014/07/07 职场文书
2015年乡镇民政工作总结
2015/05/13 职场文书
2016年情人节广告语
2016/01/28 职场文书
React实现动效弹窗组件
2021/06/21 Javascript
GO中sync包自由控制并发示例详解
2022/08/05 Golang
SpringBoot Http远程调用的方法
2022/08/14 Java/Android