From 2a7e6e9c2be3cf8989a1ce7b22e312facc1724e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8C=E8=B4=A7=E6=9C=BA=E5=99=A8=E4=BA=BA?= Date: Mon, 10 Mar 2025 19:45:38 +0800 Subject: [PATCH] fix: stack case --- docs/examples/scrollXY.tsx | 12 ++++++------ src/Cell/index.tsx | 8 ++++++-- src/hooks/useStickyOffsets.ts | 1 + src/interface.ts | 1 + src/utils/fixUtil.ts | 30 ++++++++++++++++++++++++++++-- 5 files changed, 42 insertions(+), 10 deletions(-) diff --git a/docs/examples/scrollXY.tsx b/docs/examples/scrollXY.tsx index 5a7d48677..d435840bf 100644 --- a/docs/examples/scrollXY.tsx +++ b/docs/examples/scrollXY.tsx @@ -4,12 +4,12 @@ import Table from 'rc-table'; import '../../assets/index.less'; const columns: TableProps['columns'] = [ - { title: 'title1', dataIndex: 'a', key: 'a', width: 100, fixed: 'start' }, - { title: 'title2', dataIndex: 'b', key: 'b', width: 100 }, - { title: 'title3', dataIndex: 'c', key: 'c', width: 100, fixed: 'start' }, - { title: 'title4', dataIndex: 'b', key: 'd', width: 100 }, - { title: 'title5', dataIndex: 'b', key: 'e', width: 100 }, - { title: 'title6', dataIndex: 'b', key: 'f', width: 100 }, + { title: 'title1', dataIndex: 'a', key: 'a', width: 60, fixed: 'start' }, + { title: 'title2', dataIndex: 'b', key: 'b', width: 80, fixed: 'start' }, + { title: 'title3', dataIndex: 'c', key: 'c', width: 120 }, + { title: 'title4', dataIndex: 'b', key: 'd', width: 100, fixed: 'start' }, + { title: 'title5', dataIndex: 'b', key: 'e' }, + { title: 'title6', dataIndex: 'b', key: 'f' }, { title: 'title7', dataIndex: 'b', key: 'g', width: 100 }, { title: 'title8', dataIndex: 'b', key: 'h', width: 100 }, { title: 'title9', dataIndex: 'b', key: 'i', width: 100 }, diff --git a/src/Cell/index.tsx b/src/Cell/index.tsx index e7403c4ac..2fe6520e4 100644 --- a/src/Cell/index.tsx +++ b/src/Cell/index.tsx @@ -41,6 +41,8 @@ export interface CellProps { fixEnd?: number | false; fixedStartShadow?: boolean; fixedEndShadow?: boolean; + offsetFixedStartShadow?: number; + offsetFixedEndShadow?: number; zIndex?: number; allColsFixedLeft?: boolean; @@ -107,6 +109,8 @@ function Cell(props: CellProps) { fixEnd, fixedStartShadow, fixedEndShadow, + offsetFixedStartShadow, + offsetFixedEndShadow, zIndex, // Private @@ -146,12 +150,12 @@ function Cell(props: CellProps) { const showStartShadow = (isFixStart && fixedStartShadow && absScroll) - // For precision, we not show shadow by default which has better user experience. - (fixStart as number) >= + (offsetFixedStartShadow as number) >= 1; const showEndShadow = (isFixEnd && fixedEndShadow && scrollWidth - absScroll) - // Same as above - (fixEnd as number) >= + (offsetFixedEndShadow as number) >= 1; return [showStartShadow, showEndShadow]; diff --git a/src/hooks/useStickyOffsets.ts b/src/hooks/useStickyOffsets.ts index bb0d92a2b..705c2e118 100644 --- a/src/hooks/useStickyOffsets.ts +++ b/src/hooks/useStickyOffsets.ts @@ -32,6 +32,7 @@ function useStickyOffsets( return { start: startOffsets, end: endOffsets, + widths: colWidths, }; }, [colWidths, flattenColumns]); diff --git a/src/interface.ts b/src/interface.ts index 1b754733f..54ebfcd97 100644 --- a/src/interface.ts +++ b/src/interface.ts @@ -133,6 +133,7 @@ export type GetRowKey = (record: RecordType, index?: number) => Key; export interface StickyOffsets { start: readonly number[]; end: readonly number[]; + widths: readonly number[]; isSticky?: boolean; } diff --git a/src/utils/fixUtil.ts b/src/utils/fixUtil.ts index 8be767e28..5186b2837 100644 --- a/src/utils/fixUtil.ts +++ b/src/utils/fixUtil.ts @@ -12,6 +12,11 @@ export interface FixedInfo { /** `fixed: end` with shadow */ fixedEndShadow?: boolean; + /** Show the shadow when `scrollLeft` arrive for `fixed: start` */ + offsetFixedStartShadow?: number; + /** Show the shadow when `scrollLeft` arrive for `fixed: end` */ + offsetFixedEndShadow?: number; + zIndex?: number; } @@ -41,8 +46,8 @@ export function getCellFixedInfo( } // check if need to add shadow - let fixedStartShadow: boolean; - let fixedEndShadow: boolean; + let fixedStartShadow = false; + let fixedEndShadow = false; // Calc `zIndex`. // first fixed start (start -> end) column `zIndex` should be greater than next column. @@ -58,11 +63,32 @@ export function getCellFixedInfo( zIndex = colEnd; } + // Check if scrollLeft will show the shadow + let offsetFixedStartShadow = 0; + let offsetFixedEndShadow = 0; + + if (fixedStartShadow) { + for (let i = 0; i < colStart; i += 1) { + if (!isFixedStart(columns[i])) { + offsetFixedStartShadow += stickyOffsets.widths[i] || 0; + } + } + } + if (fixedEndShadow) { + for (let i = columns.length - 1; i > colEnd; i -= 1) { + if (!isFixedEnd(columns[i])) { + offsetFixedEndShadow += stickyOffsets.widths[i] || 0; + } + } + } + return { fixStart, fixEnd, fixedStartShadow, fixedEndShadow, + offsetFixedStartShadow, + offsetFixedEndShadow, isSticky: stickyOffsets.isSticky, zIndex, };