diff --git a/__test__/ElementPosition.test.ts b/__test__/ElementPosition.test.ts new file mode 100644 index 0000000..6bedc6e --- /dev/null +++ b/__test__/ElementPosition.test.ts @@ -0,0 +1,19 @@ +import { describe, it, expect } from 'vitest' +import { useElementPosition } from '@/hooks/useElement' + +describe('useElementPosition', () => { + it('works for totalCount = 40 without throwing', () => { + const element = {} as any + const count = 10 + const totalCount = 40 + const cardSize = { width: 140, height: 200 } + const windowSize = { width: 800, height: 600 } + const cardIndex = 0 + + const result = useElementPosition(element, count, totalCount, cardSize, windowSize, cardIndex) + expect(result).toHaveProperty('xTable') + expect(result).toHaveProperty('yTable') + expect(result).toHaveProperty('scale') + expect(typeof result.scale).toBe('number') + }) +}) \ No newline at end of file diff --git a/src/constant/config.ts b/src/constant/config.ts index bf557ea..613890d 100644 --- a/src/constant/config.ts +++ b/src/constant/config.ts @@ -1 +1 @@ -export const SINGLE_TIME_MAX_PERSON_COUNT = 30 +export const SINGLE_TIME_MAX_PERSON_COUNT = 40 \ No newline at end of file diff --git a/src/hooks/useElement/index.ts b/src/hooks/useElement/index.ts index 043a356..16e6da6 100644 --- a/src/hooks/useElement/index.ts +++ b/src/hooks/useElement/index.ts @@ -262,6 +262,16 @@ const cardRule: CardRule = { /** * @description 设置抽中卡片的位置 */ +function createRuleForCount(count: number) { + // 动态生成规则:行数在 3-5 之间,尽可能均匀分配 + const len = Math.min(5, Math.max(3, Math.ceil(count / 10))) + const base = Math.floor(count / len) + let rem = count % len + const rule = Array.from({ length: len }).fill(0).map(() => base + (rem > 0 ? (rem--, 1) : 0)) + const scale = Math.max(0.9, 1.2 - (len - 3) * 0.1) + return { maxLine: Math.min(10, Math.ceil(count / len)), scale, rule, length: len } +} + export function useElementPosition( element: any, count: number, @@ -280,7 +290,8 @@ export function useElementPosition( x: 0, y: windowSize.height / 2, } - const { scale, rule, length } = cardRule[totalCount] + const ruleObj = cardRule[totalCount] ?? createRuleForCount(totalCount) + const { scale, rule, length } = ruleObj // 计算缩放后的卡片尺寸 const scaledCardWidth = cardSize.width * scale const scaledCardHeight = cardSize.height * scale diff --git a/src/style/style.scss b/src/style/style.scss index 342e40a..16a4f96 100644 --- a/src/style/style.scss +++ b/src/style/style.scss @@ -111,4 +111,4 @@ height: 240px !important; object-fit: cover; } -} \ No newline at end of file +}