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单元格多列合并的实现
Nov 26 Vue.js
vue使用echarts图表自适应的几种解决方案
Dec 04 Vue.js
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
Jan 08 Vue.js
vue element el-transfer增加拖拽功能
Jan 15 Vue.js
vue使用过滤器格式化日期
Jan 20 Vue.js
vscode自定义vue模板的实现
Jan 27 Vue.js
vue使用lodop打印控件实现浏览器兼容打印的方法
Feb 07 Vue.js
vue脚手架项目创建步骤详解
Mar 02 Vue.js
vue backtop组件的实现完整代码
Apr 07 Vue.js
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
May 25 Vue.js
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
Jun 09 Vue.js
vue实现登陆页面开发实践
May 30 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 错误处理经验分享
2011/10/11 PHP
PHP小教程之实现链表
2014/06/09 PHP
如何实现php图片等比例缩放
2015/07/28 PHP
基于PHP的登录和注册的功能的实现
2020/08/06 PHP
PHP dirname简单使用代码实例
2020/11/13 PHP
Mootools 图片展示插件(lightbox,ImageMenu)收集集合
2010/05/21 Javascript
javascript中关于break,continue的特殊用法与介绍
2012/05/24 Javascript
深入解析JavaScript中函数的Currying柯里化
2016/03/19 Javascript
jquery树形菜单效果的简单实例
2016/06/06 Javascript
获取select的value、text值的简单示例(jquery与javascript)
2016/12/07 Javascript
requirejs按需加载angularjs文件实例
2017/06/08 Javascript
前端构建工具之gulp的配置与搭建详解
2017/06/12 Javascript
Angular5中调用第三方js插件的方法
2018/02/26 Javascript
深入浅析Vue全局组件与局部组件的区别
2018/06/15 Javascript
JQuery扩展对象方法操作示例
2018/08/21 jQuery
NodeJS加密解密及node-rsa加密解密用法详解
2018/10/12 NodeJs
使用rollup打包JS的方法步骤
2018/12/05 Javascript
javascript定时器的简单应用示例【控制方块移动】
2019/06/17 Javascript
基于Node的Axure文件在线预览的实现代码
2019/08/28 Javascript
vue页面切换项目实现转场动画的方法
2019/11/12 Javascript
如何利用Fabric自动化你的任务
2016/10/20 Python
给你选择Python语言实现机器学习算法的三大理由
2017/11/15 Python
Python cookbook(数据结构与算法)将多个映射合并为单个映射的方法
2018/04/19 Python
python中查看.db文件中表格的名字及表格中的字段操作
2020/07/07 Python
Python join()函数原理及使用方法
2020/11/14 Python
CSS实现聊天气泡效果
2020/04/26 HTML / CSS
html5 canvas简单封装一个echarts实现不了的饼图
2018/06/12 HTML / CSS
MVC的各个部分都有那些技术来实现?如何实现?
2016/04/21 面试题
后勤岗位职责
2013/11/26 职场文书
自荐信写法介绍
2014/01/25 职场文书
入党自荐书范文
2014/03/09 职场文书
平面设计求职信
2014/03/10 职场文书
机械专业毕业生自我鉴定2014
2014/10/04 职场文书
投诉信回复范文
2015/07/03 职场文书
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
2021/04/14 Python
MySQL和Oracle批量插入SQL的通用写法示例
2021/11/17 MySQL