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.xdnf.cn/news/4111.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

动态ip如何自动更换ip

在探讨如何自动更换动态IP地址时&#xff0c;我们首先需要理解动态IP的基本概念。IP地址&#xff0c;即互联网协议地址&#xff0c;分配给每台连接到互联网的设备的唯一标识符。与传统静态IP地址不同&#xff0c;动态IP地址是由网络服务提供商&#xff08;ISP&#xff09;动态分…

关于金属氢化物(储氢)PCT曲线拟合、ZBS有效导热系数模型、JMAK类型吸放氢动力学方程的笔记

参考文献&#xff1a;Experimental and numerical study of metal hydride beds with Ti0.92Zr0.10Cr1.0Mn0.6Fe0.4 alloy for hydrogen compressionhttps://www.sciencedirect.com/science/article/pii/S1385894723043851?via%3Dihub#s0010 一、PCT曲线拟合 根据以下文献内容…

力扣最热一百题——验证二叉搜索树

目录 题目链接&#xff1a;98. 验证二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 题目描述 示例 提示&#xff1a; 二叉搜索树的要求 解法一&#xff1a;采用中序遍历 中序遍历的定义 为什么二叉搜索树的中序遍历是严格递增的 二叉搜索树&#xff08;BST&#x…

如何无缝更换WordPress主题:关键步骤详解

更换WordPress主题对于希望刷新网站外观或改善用户体验的站长来说&#xff0c;是一项常见但不容忽视的任务。无论是为了提升性能还是实现新的设计风格&#xff0c;在更换主题时&#xff0c;确保不遗漏任何重要细节至关重要。本文将详细介绍更换WordPress主题的关键步骤&#xf…

科技改变阅读习惯:最新研究揭示电子阅读器的普及趋势

据QYResearch调研团队最新报告“全球电子阅读器市场报告2023-2029”显示&#xff0c;预计2029年全球电子阅读器市场规模将达到6.9亿美元&#xff0c;未来几年年复合增长率CAGR为0.4%。 如上图表/数据&#xff0c;摘自QYResearch最新报告“全球电子阅读器市场研究报告2023-2029.…

ServletContext 对象介绍

文章目录 1、ServletContext对象介绍1_方法介绍2_用例分析 2、ServletContainerInitializer1_整体结构2_工作原理3_使用案例 3、Spring案例源码分析1_注册DispatcherServlet2_注册配置类3_SpringServletContainerInitializer 4_总结 ServletContext 表示上下文对象&#xff0c;…

高频面试题(含笔试高频算法整理)基本总结回顾48

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…

yolov8涨点系列之引入CBAM注意力机制

文章目录 YOLOv8 中添加注意力机制 CBAM 具有多方面的好处特征增强与选择通道注意力方面空间注意力方面 提高模型性能计算效率优化&#xff1a; yolov8增加CBAM具体步骤CBAM代码(1)在__init.pyconv.py文件的__all__内添加‘CBAM’(2)conv.py文件复制粘贴CBAM代码(3)修改task.py…

python实现tkinter解密剧情文本游戏

目录 需求 效果 代码实现 代码说明 需求 python实现tkinter解密剧情文本游戏 效果 代码实现 import tkinter as tkclass StoryGame:def __init__(self, master):self.master mastermaster.title("剧情游戏")# 初始化故事节点self.current_node 0# 故事节点数…

C 学习(5)

哈哈哈哈哈&#xff0c;终于想起来了&#xff01;贴一下主要的参考&#xff1a; 基本语法 - 《阮一峰《C 语言教程》》 - 书栈网 BookStack 内容写的比较浅显有疏漏&#xff0c;如果看不明白&#xff0c;再结合一下百度。 注释 C 语言的注释有两种表示方法。 第一种方法是…

解读《ARM Cortex-M3 与Cortex-M4 权威指南》——第3章 技术综述

加载—存储架构 ISA(指令集架构) 指令集架构 (ISA) 是计算机处理器能够理解和执行的指令集合。它定义了计算机系统中硬件和软件之间的接口 ISA 是硬件与软件之间的接口规范,它定义了处理器能执行哪些操作,程序员和编译器可以依此编写代码。 常见的 ISA 类型: CISC (Comp…

【Linux】linux c语言调用send()接口内核调用流程

1、C语言测试代码&#xff1a; #include <errno.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <err.h> #include <sys/types.h> #include <sys/socket.h> #include <net…

【Windows修改Docker Desktop(WSL2)内存分配大小】

记录一下遇到使用Docker Desktop占用内存居高不下的问题 自从使用了Docker Desktop&#xff0c;电脑基本每天都需要重启&#xff0c;内存完全不够用&#xff0c;从16g扩展到24&#xff0c;然后到40G&#xff0c;还是不够用&#xff1b;打开Docker Desktop 运行时间一长&#x…

使用 ABAP GIT 发生 IF_APACK_MANIFEST dump

错误重现 使用经典的 ABAP 系统运行 ZABAPGIT 或者 ZABAPGIT_STANDALONE然后添加在线或者离线项目点击 PullShort dump SYNTAX_ERROR Dump 界面&#xff1a; 解决方案 它发生在 CREATE OBJECT lo_manifest_provider TYPE (ls_manifest_implementation-clsname) 语句中。 该语…

树莓派基本设置--8.播放音频和视频

在Raspberry Pi上播放音频和视频的最简单方法是使用预装的VLC应用程序&#xff1b; VLC程序使用硬件加速&#xff0c;可以播放许多流行的音频和视频文件格式。 一、图形化界面 选择要播放的文件&#xff0c;鼠标右击&#xff0c;选择“VLC Media Player” 二、命令行 注意&…

JS实现原生注册表单,滑块验证,短信验证码

目录 一、编辑表单询盘结构 1、确定注册接口所需参数 2、编写表单HTML结构 二、编写style样式 1、非表单元素样式 三、引入阿里云滑块验证 1、引入阿里短信接口CDN 2、实例化nc对象 四、调用短信验证码接口 1、给获取按钮绑定点击事件 2、测试短信验证码获取 五、调用注册接口 …

matlab 质心重合法实现点云配准

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示1、初始位置2、配准结果本文由CSDN点云侠原创,原文链接,首发于:2024年11月5日。 一、算法原理 1、原理概述 质心重合法是将源点云 P P P

YOLOv8实战人脸口罩识别

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对人脸口罩数据集进行训练和优化&#xff0c;该数据集包含丰富的人脸口罩图像样本…

科研绘图系列:R语言两侧柱状图(Grouped Bar Chart)

文章目录 介绍加载R包数据画图1画图2组合图形系统信息介绍 两侧柱状图(也称为双柱状图或并列柱状图)是一种数据可视化图表,它通过在坐标轴的两侧绘制两组或多组柱状图来展示不同类别或组别的数据对比。这种图表特别适用于比较两个或多个数据系列之间的差异。以下是两侧柱状…

获取订单物流信息:追踪包裹的“侦探游戏”

在电商的世界里&#xff0c;顾客下单之后&#xff0c;最让人心急如焚的莫过于等待包裹的到来。想象一下&#xff0c;如果你是一名侦探&#xff0c;而你的任务是追踪那些神秘的包裹&#xff0c;那么获取订单物流信息的API就是你的侦探工具。今天&#xff0c;我们就来聊聊如何使用…