el-scrollbar 动态更新内容 鼠标滚轮无效

有以下功能逻辑,实现了一个时间轴组件,点击+、-号后像地图那样放大组件以显示不同的UI。

默认显示年月:

当点击一下加号时切换为年: 

当点击减号时切换为日: 

即加号、减号点击就是在年月日显示进行切换。给Scrollview添加了鼠标滚动事件:当切换日期显示时滚轮滚动时,scrollview的滚动条没有反应,就很奇葩。。。

     <el-scrollbar  ref="scrollContainer" class="right-view" horizontal@wheel.native.prevent="handleScroll">

页面代码为:

<template><div class="flex-row container-view"><div class="left-view"><div class="placeholder-view"></div><div class="switch-view flex-column jc-between"><div class="h-view flex-row jc-around"><i class="btns-view flex-row el-icon-timer" style="justify-content: center;"@click="toCurrentAction"></i><i class="btns-view flex-row el-icon-circle-plus-outline" style="justify-content: center;"@click="toDayAction"></i><i class="btns-view flex-row el-icon-remove-outline" style="justify-content: center;"@click="toYearAction"></i></div><div class="flex-row w-100" style="height: 30px;"><div class="flex-column" style="width: 12px;"><div class="flex-column" style="height: 15px;justify-content:flex-end"><i style="width: 8px;height:8px;background-color:#a0a0a0;border-radius:4px"></i><i style="width: 1px;height:4px;background-color:#a0a0a0;"></i></div><div class="flex-column" style="height: 15px;justify-content:flex-start"><i style="width: 1px;height:4px;background-color:#a0a0a0;"></i><i style="width: 8px;height:8px;background-color:#a0a0a0;border-radius:4px"></i></div></div><div class="flex-column"><span class="flex-column"style="font-size:10px;color:#a0a0a0;height:15px;line-height:15px">自2021.01.01</span><span class="flex-column"style="font-size:10px;color:#a0a0a0;height:15px;line-height:15px">至2024.10.31</span></div></div></div></div><el-scrollbar  ref="scrollContainer" class="right-view" horizontal@wheel.native.prevent="handleScroll"><template v-if="viewMode == 1"><div class="date-view flex-column":style="{ width: (yearList.length / yearList.length * monthList.length * gutterGap) + 'px' }"><div class="flex-row w-100" style="height: 20px;"><p v-for="(item, index) in yearList" :key="index" style="color:#a0a0a0;font-size:13px;":style="{ width: (monthList.length / yearList.length * gutterGap) + 'px' }">{{ item.date }}</p></div><div class="flex-row" style="height: 20px;"><p v-for="item in monthList" :style="{ width: `${gutterGap}px` }"style="color:#505050;font-size:13px;">{{ item.month +'月' }}</p></div></div><div class="switch-view bd-blue":style="{ width: (yearList.length / yearList.length * monthList.length * gutterGap) + 'px' }"><div class="flex-row h-100" style="position: relative;"><p class="sep-h-line" v-for="(item, kdex) in monthList":style="{ left: (kdex * gutterGap + 10) + 'px' }"></p></div></div></template><template v-else-if="viewMode == 2"><div class="date-view flex-column":style="{ width: (yearList.length / yearList.length * monthList.length * gutterGap) + 'px' }"><div class="flex-row w-100" style="height: 20px;"><p v-for="(item, index) in yearList" :key="index" style="color:#a0a0a0;font-size:13px;":style="{ width: (monthList.length / yearList.length * gutterGap) + 'px' }">{{ item.date }}</p></div><div class="flex-row" style="height: 30px;"><div v-for="(item, mdex) in monthList" class="flex-column" :key="mdex"><span :style="{ width: `${gutterGap}px` }" style="color:#505050;font-size:13px;">{{item.month+ '月' }}</span><div class="flex-row"><span style="font-size: 12px;color:#505050;text-align:center;"v-for="(dtem, ddex) in daysList(item)" :key=ddex:style="{ width: `${gutterGap / monthDays(item)}px` }">{{ dtem.label }}</span></div></div></div></div><div class="switch-view bd-blue":style="{ width: (yearList.length / yearList.length * monthList.length * gutterGap) + 'px' }"><div class="flex-row h-100" style="position: relative;"><p class="sep-h-line" v-for="(item, kdex) in monthList":style="{ left: (kdex * gutterGap + 10) + 'px' }"></p></div></div></template><template v-else><div class="date-view flex-column" style="justify-content:flex-end":style="{ width: (yearList.length / yearList.length * monthList.length * gutterGap) + 'px' }"><div class="flex-row w-100" style="height: 20px;"><p v-for="(item, index) in yearList" :key="index" style="color:#a0a0a0;font-size:13px;":style="{ width: (monthList.length / yearList.length * gutterGap) + 'px' }">{{ item.date }}</p></div></div><div class="switch-view bd-blue":style="{ width: (yearList.length / yearList.length * monthList.length * gutterGap) + 'px' }"><div class="flex-row h-100" style="position: relative;"><p class="sep-h-line" v-for="(item, kdex) in monthList":style="{ left: (kdex * gutterGap + 10) + 'px' }"></p></div></div></template></el-scrollbar></div>
</template><script>
import { getDaysInMonth } from '@/utils/index.js'
export default {data() {return {gutterGap: 120,scrollWith: 0,//0年 1月 2日viewMode: 1,yearList: [{date: '2021'}, {date: '2022'}, {date: '2023'}, {date: '2024'}],monthList: [],dayList: [{ "day": '1' }, { "day": '2' }, { "day": '3' }, { "day": '4' }]}},created() {this.autoMonths()this.$nextTick(() => {let atarget = document.querySelector(".right-view")this.scrollWith = atarget.offsetWidth})},computed: {scrollWrapper() {return this.$refs.scrollContainer.$refs.wrap}},mounted() {this.$nextTick(() => {this.$refs.scrollContainer.update()})},methods: {autoMonths() {this.monthList.removeAllObject()this.yearList.forEach((e, index) => {for (let a = 0; a < 12; a++) {let d = e.date + '-' + (a < 10 ? '0' : '') + (a + 1)let k = {month: a + 1,date: d}this.monthList.push(k)}})},handleScroll(e) {const eventDelta = e.wheelDelta || -e.deltaY * 40const $scrollWrapper = this.scrollWrapperlet scrolled = $scrollWrapper.scrollLeft + eventDelta / 4$scrollWrapper.scrollLeft = scrolledthis.$emit("scrolled", scrolled)},toCurrentAction() { },toDayAction() {this.viewMode = Math.max(0, this.viewMode - 1)if (this.viewMode == 1) {//显示月this.gutterGap = 120}else {//显示年this.gutterGap = 30}let vl = Math.max(this.scrollWith / (this.yearList.length * 12), this.gutterGap)vl = Math.ceil(vl)this.gutterGap = vlthis.$nextTick(() => {this.$refs.scrollContainer.update();});},toYearAction() {//单位年this.viewMode = Math.min(2, this.viewMode + 1)if (this.viewMode == 1) {//显示月this.gutterGap = 120}else {//显示日this.gutterGap = 720}this.$nextTick(() => {this.$refs.scrollContainer.update();});},monthDays(m) {let c = getDaysInMonth(m.date)return c},daysList(m) {let c = getDaysInMonth(m.date)let list = []for (let i = 0; i < c; i++) {let e = {label: (i + 1) + '',value: m.date + (i < 10 ? '0' : '') + (i + 1)}list.push(e)}return list}}
}
</script><style lang="scss" scoped>
.flex-row {display: flex;flex-direction: row;justify-content: flex-start;align-items: center;
}.flex-column {display: flex;flex-direction: column;justify-content: flex-start;align-items: center;
}.container-view {min-height: 150px;height: 150px;max-height: 150px;
}.left-view {width: 100px;display: flex;flex-direction: column;justify-content: space-between;align-items: flex-start;
}.jc-around {justify-content: space-around;
}.jc-between {justify-content: space-between;
}.right-view {width: calc(100% - 100px);background-color: transparent;
}.date-view {width: 100%;height: 50px;
}.placeholder-view {height: 50px;background-color: transparent;
}.switch-view {background-color: #f3f5f9;height: 100px;
}.h-view {background-color: white;margin: 5px;
}.btns-view {width: 24px;height: 24px;background-color: transparent;
}.bd-blue {border-top: 20px solid #0286ef;
}.sep-h-line {position: absolute;width: 1px;height: 100%;background-color: #e2e7fb;
}::v-deep {.is-horizontal {height: 10px !important;left: 0px;display: inline !important;margin-top: 6px;}
}
</style>

因scrollview内的内容不断的进行变化,他的contentsize也是动态变化,但此时当切换后鼠标滚轮无法触发Scrollview的滚动条一块儿跟着滑动。

修正方案为:强行更新scrollview,出现的问题随之修复。

this.$nextTick(() => {this.$refs.scrollContainer.update();
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/885361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LED点阵显示(Proteus 与Keil uVision联合仿真)(点阵字模提取)

点阵字模提取&#xff1a; https://pan.baidu.com/s/1DZSeLyD_SUkaHRgTm26o-A 提取码: 1111 一、LED点阵显示器结构 点亮点阵中一个发光二极管条件&#xff1a;对应行为高电平&#xff0c;对应列为低电平。如在很短时间内依次点亮很多个发光二极管&#xff0c;LED点阵就可显示…

.NET中通过C#实现Excel与DataTable的数据互转

在.NET框架中&#xff0c;使用C#进行Excel数据与DataTable之间的转换是数据分析、报表生成、数据迁移等操作中的常见需求。这一过程涉及到将Excel文件中的数据读取并加载至DataTable中&#xff0c;以便于利用.NET提供的丰富数据处理功能进行操作&#xff0c;同时也包括将DataTa…

「Mac畅玩鸿蒙与硬件29」UI互动应用篇6 - 多选问卷小应用

本篇将带你实现一个多选问卷小应用&#xff0c;用户可以勾选选项并点击提交按钮查看选择的结果。通过本教程&#xff0c;你将学习如何使用 Checkbox 组件、动态渲染列表、状态管理及用户交互&#xff0c;构建完整的应用程序。 关键词 UI互动应用Checkbox 组件状态管理动态列表…

Java 并发编程学习笔记

参考资料&#xff1a; JAVA并发专题 - 终有救赎的专栏 - 掘金 Java并发编程学习路线&#xff08;建议收藏&#xfffd;&#xfffd;&#xff09; | Java程序员进阶之路x沉默王二 面试题目&#xff1a; JUC第一讲&#xff1a;Java并发知识体系详解 面试题汇总(P6熟练 P7精通…

【Linux系统】—— 基本指令(二)

【Linux系统】—— 基本指令&#xff08;二&#xff09; 1 「alias」命令1.1 「ll」命令1.2 「alias」命令 2 「rmdir」指令与「rm」指令2.1 「rmdir」2.2 「rm」2.2.1 「rm」 删除普通文件2.2.2 「rm」 删除目录2.2.3 『 * 』 通配符 3 「man」 指令4 「cp」 指令4.1 拷贝普通…

Pytorch cuda版本选择(高效简洁版)

简而言之 Pytorch cuda版本选择 只需要低于cuda驱动版本即可&#xff0c;cuda驱动版本查看命令是nvidia-smi, nvcc -V 是runtimeapi版本可以不用管 1.只要看cuda驱动版本 安装pytorch 选择cuda版本&#xff0c;只要看你电脑cuda驱动版本即可。 2.选择依据 pytorch中cuda版本只…

Flink API 的层次结构

Apache Flink 提供了多层 API&#xff0c;每层 API 针对不同的抽象层次和用途&#xff0c;使得开发者可以根据具体需求选择合适的 API 层次。以下是 Flink API 的层次结构及其简要说明&#xff1a;

GPU集群上分布式训练大模型

总结一下如何在超算系统上进行预训练大模型的分布式训练 / 微调&#xff0c;文中代码已上传至 github 实验环境 集群1&#xff1a;国家广州超算 星逸A800智能AI集群 GPU&#xff1a;8 * Nvdia Tesla-A800 80G显存 CPU&#xff1a;2 * 28核 Intel Xeon Gold 6348 内存&#xff…

python爬虫自动库DrissionPage保存网页快照mhtml/pdf/全局截图/打印机另存pdf

目录 零一、保存网页快照的三种方法二、利用打印机保存pdf的方法 零 最近星球有人问如何使用页面打印功能&#xff0c;另存为pdf 一、保存网页快照的三种方法 解决方案已经放在星球内&#xff1a;https://articles.zsxq.com/id_55mr53xahr9a.html当然也可以看如下代码&…

Redis 中 Bitmap 原理和应用

Bitmap Redis中的Bitmap&#xff08;位图&#xff09;是一种较为特殊数据类型&#xff0c;它以最小单位bit来存储数据&#xff0c;我们知道一个字节由 8个 bit 组成&#xff0c;和传统数据结构用字节存储相比&#xff0c;这使得它在处理大量二值状态&#xff08;true、false 或…

elementUI 点击弹出时间 date-picker

elementUI的日期组件&#xff0c;有完整的UI样式及弹窗&#xff0c;但是我的页面不要它的UI样式&#xff0c;点击的时候却要弹出类似的日期选择器&#xff0c;那怎么办呢&#xff1f; 以下是elementUI自带的UI风格&#xff0c;一定要一个输入框来触发。 这是我的项目中要用到的…

微软日志丢失事件敲响安全警钟

NEWS | 事件回顾 最近&#xff0c;全球最大的软件公司之一——微软&#xff0c;遭遇了一场罕见的日志丢失危机。据报告&#xff0c;从9月2日至9月19日&#xff0c;持续长达两周的时间里&#xff0c;微软的多项核心云服务&#xff0c;包括身份验证平台Microsoft Entra、安全信息…

2021-04-22 51单片机玩转点阵

理论就不赘述了,网络上多得很,直接从仿真软件感性上操作认识点阵,首先打开ISIS仿真软件,放置一个点阵和电源与地线就可以开始了;由点阵任何一脚连线到地线,另一边对应的引脚就连接到电源,如图:点击运行看是否点亮?看到蓝色与红色的点表示电源正常但是没有任何亮点,这时对调一下…

(十三)JavaWeb后端开发——MySQL2

目录 1.DQL数据查询语言 1.1基本查询 1.2条件查询 where关键字 1.3分组查询 1.4排序查询 1.5分页查询 2.多表设计 3.多表查询——联查 4.多表查询——子查询​ 5.MySQL 事务 6.事务管理&#xff08;事务进阶&#xff09; 7.MySQL 索引 1.DQL数据查询语言 分为五大…

恭喜!2024年度大连市科技人才创新、科技人才创业项目拟立项公示!

精选SCI/SSCI/EI SCI&EI ●IEEE 1区TOP 计算机类&#xff08;含CCF&#xff09;&#xff1b; ●EI快刊&#xff1a;最快1周录用&#xff01; 知网(CNKI)、谷歌学术期刊 ●7天录用-检索&#xff08;100%录用&#xff09;&#xff0c;1周上线&#xff1b; 免费稿件评估 …

【前端】-音乐播放器(源代码和结构讲解,大家可以将自己喜欢的歌曲添加到数据当中,js实现页面动态显示音乐)

前言&#xff1a;音乐播放器是前端开发中的一个经典项目&#xff0c;通过它可以掌握很多核心技术&#xff0c;如音频处理、DOM操作、事件监听、动画效果等。这个项目不仅能提升前端开发的技能&#xff0c;还能让开发者深入理解JavaScript与HTML的协同作用。 页面展示&#xff1…

虚拟机linux7.9下安装mysql

1.MySQL官网下载安装包&#xff1a; MySQL :: Download MySQL Community Server https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz 2.解压文件&#xff1a; #tar xvzf mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz 3.移动文件&#…

03_CC2530基于定时器3的Delay_ms函数

CC2530定时器3与Delay_ms延时函数 前言 ​ Delay函数是开发中常用到的函数&#xff0c;可以用于按键消抖&#xff0c;LED闪烁&#xff0c;生成一定频率信号等(软件模拟通讯协议)。由于利用循环执行一定次数的空指令实现的延时函数在精度上并不能让人满意&#xff0c;而用定时…

【系统面试篇】其他相关题目——虚拟内存、局部性原理、分页、分块、页面置换算法

目录 一、相关问题 1. 什么是虚拟内存&#xff1f;为什么需要虚拟内存&#xff1f; &#xff08;1&#xff09;内存扩展 &#xff08;2&#xff09;内存隔离 &#xff08;3&#xff09;物理内存管理 &#xff08;4&#xff09;页面交换 &#xff08;5&#xff09;内存映…

43.第二阶段x86游戏实战2-提取游戏里面的lua

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…