From 69f80aac8a7731b0c391d98328084aae05d3a2a8 Mon Sep 17 00:00:00 2001 From: wisonic-s Date: Mon, 9 Mar 2026 10:51:02 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E5=9B=BE=E8=A1=A8)=EF=BC=9A=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=98=8E=E7=BB=86=E8=A1=A8=E5=BC=80=E5=90=AF=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=8D=A2=E8=A1=8C=E5=90=8E=E8=87=AA=E5=8A=A8=E6=BB=9A?= =?UTF-8?q?=E5=8A=A8=E6=A6=82=E7=8E=87=E5=A4=B1=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/components/ChartComponentS2.vue | 54 ++++++++++++++++--- 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/core/core-frontend/src/views/chart/components/views/components/ChartComponentS2.vue b/core/core-frontend/src/views/chart/components/views/components/ChartComponentS2.vue index c4e264cefa..042bcc582d 100644 --- a/core/core-frontend/src/views/chart/components/views/components/ChartComponentS2.vue +++ b/core/core-frontend/src/views/chart/components/views/components/ChartComponentS2.vue @@ -313,23 +313,61 @@ const initScroll = () => { ? 1 : customAttr.tableHeader.tableTitleHeight const scrollBarSize = myChart.theme.scrollBar.size - const scrollHeight = - rowHeight * chartData.value.tableRow.length + headerHeight - offsetHeight + scrollBarSize + const basicStyle = customAttr.basicStyle + + // 开启自动换行时,使用 facet 的 viewCellHeights 或 scrollTargetMaxOffset 获取实际的最大滚动距离 + let maxScrollY: number + if (basicStyle?.autoWrap) { + // 从滚动条获取实际的滚动范围 + const vScrollBar = myChart.facet?.vScrollBar + if (vScrollBar) { + // 直接取滚动条配置的最大滚动距离 + maxScrollY = vScrollBar.scrollTargetMaxOffset + } else { + // 如果无法获取滚动条信息,尝试使用 viewCellHeights + const viewCellHeights = myChart.facet?.viewCellHeights + if (viewCellHeights) { + const rowsHeight = viewCellHeights.getTotalHeight() + const viewHeight = offsetHeight - headerHeight + maxScrollY = Math.max(0, rowsHeight - viewHeight + scrollBarSize) + } else { + maxScrollY = + rowHeight * chartData.value.tableRow.length + + headerHeight - + offsetHeight + + scrollBarSize + } + } + } else { + maxScrollY = + rowHeight * chartData.value.tableRow.length + headerHeight - offsetHeight + scrollBarSize + } + // 显示内容没撑满 - if (scrollHeight < scrollBarSize) { + if (maxScrollY < scrollBarSize) { return } - // 到底了重置一下,1是误差 - if (scrolledOffset >= scrollHeight - 1) { + // 到底了重置一下,使用实际的最大滚动距离判断 + if (scrolledOffset >= maxScrollY - 1) { myChart.store.set('scrollY', 0) myChart.render() scrolledOffset = 0 } - const viewedHeight = offsetHeight - headerHeight - scrollBarSize + scrolledOffset - const scrollViewCount = chartData.value.tableRow.length - viewedHeight / rowHeight + + let scrollViewCount: number + if (basicStyle?.autoWrap && myChart.facet?.viewCellHeights) { + // 如果开启了自动换行,计算当前未展示的内容高度所对应的比例,再乘以总行数,以获得大致的未展示行数 + const totalHeight = myChart.facet.viewCellHeights.getTotalHeight() + const unViewedRatio = totalHeight > 0 ? (maxScrollY - scrolledOffset) / totalHeight : 0 + scrollViewCount = chartData.value.tableRow.length * unViewedRatio + } else { + const viewedHeight = offsetHeight - headerHeight - scrollBarSize + scrolledOffset + scrollViewCount = chartData.value.tableRow.length - viewedHeight / rowHeight + } + const duration = (scrollViewCount / senior.scrollCfg.row) * senior.scrollCfg.interval myChart.facet.scrollWithAnimation( - { offsetY: { value: scrollHeight, animate: false } }, + { offsetY: { value: maxScrollY, animate: false } }, duration, initScroll )