Merge branch 'main' into release_0.6.0-beta4

This commit is contained in:
wjrHh218
2026-02-05 23:54:08 +08:00
9 changed files with 34 additions and 4 deletions

View File

@@ -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')
})
})

View File

@@ -1,2 +1,2 @@
export const SINGLE_TIME_MAX_PERSON_COUNT = 30
export const SINGLE_TIME_MAX_PERSON_COUNT = 40
export const CONFETTI_FIRE_MAX_COUNT = 12

View File

@@ -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
@@ -311,7 +322,7 @@ export function useElementPosition(
// 修改此处逻辑确保当length=2时两行围绕中心点对称分布
centerPosition.y = windowSize.height / 2 - totalHeight / 2
yTable = centerPosition.y + currentRow * verticalSpacing + centerYOffset + scaledCardHeight / 2 // 添加卡片高度的一半作为修正
yTable = centerPosition.y + currentRow * verticalSpacing + centerYOffset // 添加卡片高度的一半作为修正
// 计算当前行的水平居中偏移
const horizontalSpacing = scaledCardWidth * 1.2 // 水平间距基于缩放后的宽度
const rowWidth = (cardsInCurrentRow - 1) * horizontalSpacing

View File

@@ -111,4 +111,4 @@
height: 240px !important;
object-fit: cover;
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 233 KiB

After

Width:  |  Height:  |  Size: 280 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 KiB

After

Width:  |  Height:  |  Size: 253 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 669 KiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 727 KiB

After

Width:  |  Height:  |  Size: 1.3 MiB