From c1280511ae7e50a368dfa1c4c113ee57f0f0993e Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Fri, 26 Jun 2026 02:26:26 +0800 Subject: [PATCH] fix(grid): smooth canvas horizontal scroll --- apps/desktop/src/components/grid/DataGrid.vue | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/apps/desktop/src/components/grid/DataGrid.vue b/apps/desktop/src/components/grid/DataGrid.vue index dc2d29ddc..0d07369ea 100644 --- a/apps/desktop/src/components/grid/DataGrid.vue +++ b/apps/desktop/src/components/grid/DataGrid.vue @@ -4195,20 +4195,31 @@ function onCanvasScroll(event: Event) { const scrollLeft = scroller.scrollLeft; const viewportWidth = scroller.clientWidth; const viewportHeight = scroller.clientHeight; + const scrollTopChanged = canvasScrollTop.value !== scrollTop; + const viewportHeightChanged = canvasViewportHeight.value !== viewportHeight; + const scrollLeftChanged = gridHorizontalScrollLeft.value !== scrollLeft; + const viewportWidthChanged = gridViewportWidth.value !== viewportWidth || canvasViewportWidth.value !== viewportWidth; + if (canvasScrollTop.value !== scrollTop) canvasScrollTop.value = scrollTop; if (canvasViewportWidth.value !== viewportWidth) canvasViewportWidth.value = viewportWidth; if (canvasViewportHeight.value !== viewportHeight) canvasViewportHeight.value = viewportHeight; - if (gridHorizontalScrollLeft.value !== scrollLeft || gridViewportWidth.value !== viewportWidth) { - updateGridHorizontalViewport(scroller); + if (scrollLeftChanged || viewportWidthChanged) { + gridHorizontalScrollLeft.value = scrollLeft; + gridViewportWidth.value = viewportWidth; + updateGridHorizontalScrollbar(scroller); + } + if (scrollTopChanged || viewportHeightChanged) { + updateGridVerticalScrollbar(scroller); + maybeCheckInfiniteScroll(scroller); + } + if (viewportWidthChanged || viewportHeightChanged) { + const gutter = scrollbarGutterWidth(scroller); + if (gridScrollbarGutter.value !== gutter) gridScrollbarGutter.value = gutter; } - updateGridVerticalScrollbar(scroller); - const gutter = scrollbarGutterWidth(scroller); - if (gridScrollbarGutter.value !== gutter) gridScrollbarGutter.value = gutter; if (headerRef.value && headerRef.value.scrollLeft !== scrollLeft) headerRef.value.scrollLeft = scrollLeft; recordScrollPosition({ top: scrollTop, left: scrollLeft }); markGridScrolling(); scheduleCanvasDraw(); - maybeCheckInfiniteScroll(scroller); } function canvasWheelDeltaToPixels(delta: number, deltaMode: number, pageSize: number): number { @@ -4220,7 +4231,7 @@ function canvasWheelDeltaToPixels(delta: number, deltaMode: number, pageSize: nu function shouldAccelerateCanvasWheel(event: WheelEvent): boolean { if (event.ctrlKey || event.metaKey) return false; if (event.deltaMode !== WheelEvent.DOM_DELTA_PIXEL) return true; - return Math.abs(event.deltaY) >= CANVAS_TRACKPAD_DELTA_THRESHOLD || Math.abs(event.deltaX) >= CANVAS_TRACKPAD_DELTA_THRESHOLD; + return event.shiftKey && Math.abs(event.deltaY) > Math.abs(event.deltaX) && Math.abs(event.deltaY) >= CANVAS_TRACKPAD_DELTA_THRESHOLD; } function onCanvasWheel(event: WheelEvent) {