From 3caa92489711faf8097c4e7050912055d67d66f5 Mon Sep 17 00:00:00 2001 From: biubiukam Date: Tue, 23 Jun 2026 18:48:16 +0800 Subject: [PATCH 1/2] fix: keep fractional row scroll target --- .../api/listTable-scrollToRow.test.ts | 36 +++++++++++++++++++ packages/vtable/src/core/BaseTable.ts | 15 ++++---- 2 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 packages/vtable/__tests__/api/listTable-scrollToRow.test.ts diff --git a/packages/vtable/__tests__/api/listTable-scrollToRow.test.ts b/packages/vtable/__tests__/api/listTable-scrollToRow.test.ts new file mode 100644 index 0000000000..6c2c4bf7e5 --- /dev/null +++ b/packages/vtable/__tests__/api/listTable-scrollToRow.test.ts @@ -0,0 +1,36 @@ +// @ts-nocheck +import { ListTable } from '../../src'; +import { createDiv } from '../dom'; + +global.__VERSION__ = 'none'; + +describe('listTable scrollToRow api', () => { + afterEach(() => { + jest.restoreAllMocks(); + document.body.innerHTML = ''; + }); + + test('keeps fractional row target when scrolling with animation', () => { + const container = createDiv(); + container.style.position = 'relative'; + container.style.width = '400px'; + container.style.height = '240px'; + + const table = new ListTable({ + container, + columns: [{ field: 'name', title: 'Name', width: 120 }], + records: Array.from({ length: 20 }, (_, index) => ({ name: `row-${index}` })), + defaultRowHeight: 40 + }); + + const scrollTo = jest.spyOn(table.animationManager, 'scrollTo').mockImplementation(() => undefined); + const setTimeoutSpy = jest.spyOn(globalThis, 'setTimeout').mockImplementation(() => 0 as any); + + table.scrollToRow(1.5, { duration: 100, easing: 'linear' }); + + expect(scrollTo).toHaveBeenCalledWith({ row: 1.5 }, { duration: 100, easing: 'linear' }); + expect(setTimeoutSpy).not.toHaveBeenCalled(); + + table.release(); + }); +}); diff --git a/packages/vtable/src/core/BaseTable.ts b/packages/vtable/src/core/BaseTable.ts index 45c880566a..be40871fb1 100644 --- a/packages/vtable/src/core/BaseTable.ts +++ b/packages/vtable/src/core/BaseTable.ts @@ -5275,18 +5275,21 @@ export abstract class BaseTable extends EventTarget implements BaseTableAPI { // anmiation scrollToRow(row: number, animationOption?: ITableAnimationOption | boolean) { - const targetRow = Math.min(Math.max(Math.floor(row), 0), this.rowCount - 1); + const targetRow = Math.min(Math.max(row, 0), this.rowCount - 1); + const targetRowInt = Math.floor(targetRow); this.clearCorrectTimer(); if (!animationOption) { - this.scrollToCell({ row: targetRow }); - this._scheduleScrollToRowCorrect(targetRow); + this.scrollToCell({ row: targetRowInt }); + this._scheduleScrollToRowCorrect(targetRowInt); return; } const duration = !isBoolean(animationOption) ? animationOption?.duration ?? 3000 : 3000; this.animationManager.scrollTo({ row: targetRow }, animationOption); - this._scrollToRowCorrectTimer = setTimeout(() => { - this.scrollToRow(targetRow, false); - }, duration); + if (targetRowInt === targetRow) { + this._scrollToRowCorrectTimer = setTimeout(() => { + this.scrollToRow(targetRowInt, false); + }, duration); + } } scrollToCol(col: number, animationOption?: ITableAnimationOption | boolean) { if (!animationOption) { From d94ff50449c96260ed8b2345d0bec6443208d3f3 Mon Sep 17 00:00:00 2001 From: biubiukam Date: Tue, 23 Jun 2026 18:48:37 +0800 Subject: [PATCH 2/2] docs: update changlog of rush --- ...5088-carousel-fractional-row_2026-06-23-10-48.json | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 common/changes/@visactor/vtable/fix-issue-5088-carousel-fractional-row_2026-06-23-10-48.json diff --git a/common/changes/@visactor/vtable/fix-issue-5088-carousel-fractional-row_2026-06-23-10-48.json b/common/changes/@visactor/vtable/fix-issue-5088-carousel-fractional-row_2026-06-23-10-48.json new file mode 100644 index 0000000000..4950785848 --- /dev/null +++ b/common/changes/@visactor/vtable/fix-issue-5088-carousel-fractional-row_2026-06-23-10-48.json @@ -0,0 +1,11 @@ +{ + "changes": [ + { + "comment": "fix: keep fractional row scroll target", + "type": "none", + "packageName": "@visactor/vtable" + } + ], + "packageName": "@visactor/vtable", + "email": "biukam.w@gmail.com" +} \ No newline at end of file