1. 礼物特效

This commit is contained in:
李琦
2026-08-03 12:34:55 +08:00
parent 170102b0d8
commit 50f1e09569
4 changed files with 505 additions and 266 deletions

View File

@@ -86,16 +86,16 @@ func loadGiftCounts() map[string]int64 {
return counts
}
// defaultGiftCosts 默认三阶梯50 / 100 / 200
// defaultGiftCosts 默认三阶梯50 / 100 / 200(永结同心为终章,默认 200
var defaultGiftCosts = map[string]int64{
"520": 50,
"forever": 50,
"bald": 50,
"concentric": 50,
"1314": 100,
"heaven": 100,
"moisten": 100,
"match": 200,
"concentric": 200,
}
const (

File diff suppressed because it is too large Load Diff

View File

@@ -1,13 +1,13 @@
/** 礼物类型常量表(与后端 giftTypeWhitelist / defaultGiftCosts 一致) */
/** 礼物类型常量表(与后端 giftTypeWhitelist / defaultGiftCosts 一致;永结同心放最后 */
export const GIFT_TYPES = [
{ key: '520', label: '520', cost: 50, preview: 'linear-gradient(135deg, #ff8da6 0%, #ff2d55 55%, #c41e3a 100%)' },
{ key: '1314', label: '1314', cost: 100, preview: 'linear-gradient(135deg, #fff3b0 0%, #ffd700 50%, #e6a000 100%)' },
{ key: 'forever', label: '长长久久', cost: 50, preview: 'linear-gradient(135deg, #ffb3c1 0%, #c41e3a 55%, #6b0f1a 100%)' },
{ key: 'bald', label: '白头偕老', cost: 50, preview: 'linear-gradient(135deg, #ffffff 0%, #e8e4d9 45%, #b8a878 100%)' },
{ key: 'concentric', label: '永结同心', cost: 50, preview: 'linear-gradient(135deg, #f5dcc4 0%, #d4a574 50%, #b76e79 100%)' },
{ key: 'heaven', label: '天作之合', cost: 100, preview: 'linear-gradient(135deg, #cce4ff 0%, #5ba3ff 50%, #1a5bb5 100%)' },
{ key: 'moisten', label: '相濡以沫', cost: 100, preview: 'linear-gradient(135deg, #c5f5ef 0%, #40b4a6 50%, #165e5a 100%)' },
{ key: 'match', label: '佳偶天成', cost: 200, preview: 'linear-gradient(135deg, #ffd4a8 0%, #e85d75 50%, #b5475a 100%)' },
{ key: 'concentric', label: '永结同心', cost: 200, preview: 'linear-gradient(135deg, #f5dcc4 0%, #d4a574 50%, #b76e79 100%)' },
]
export const GIFT_LABEL_MAP = Object.fromEntries(GIFT_TYPES.map((g) => [g.key, g.label]))

View File

@@ -1088,6 +1088,8 @@ let freeScrollLastTs = 0
let freeScrollLastApplied = -1
/** 进度条节流 */
let freeScrollProgressTick = 0
/** 底部自动回顶动画中:暂停自由滚,并自行驱动进度条 */
let isReturningToTop = false
let scrollHeightObserver = null
/**
* iOS 自由自动滚:用 GPU transform 平移内容,全程不写 scrollTop。
@@ -1396,16 +1398,39 @@ const scheduleBottomReturn = (reset = false) => {
const smoothScrollTo = (target, duration) => {
cancelAnimationFrame(animId)
if (iosTransformActive) exitIosTransformScroll()
const start = pageScrollTopNative(), dist = target - start
if (!dist) return
const start = pageScrollTopNative()
const dist = target - start
const finishReturn = () => {
isReturningToTop = false
invalidateFreeScrollAnchor()
if (target <= 0) {
freeScrollOffset = 0
freeScrollLastApplied = 0
progress.value = 0
} else {
syncProgressFromY(target)
}
}
if (!dist) {
finishReturn()
return
}
invalidateFreeScrollAnchor()
if (duration <= 0) { window.scrollTo(0, target); return }
isReturningToTop = true
if (duration <= 0) {
window.scrollTo(0, target)
finishReturn()
return
}
const t0 = performance.now()
const tick = (now) => {
const p = Math.min(1, (now - t0) / duration)
const e = p < 0.5 ? 2 * p * p : 1 - Math.pow(-2 * p + 2, 2) / 2
window.scrollTo(0, start + dist * e)
const y = start + dist * e
window.scrollTo(0, y)
syncProgressFromY(y)
if (p < 1) animId = requestAnimationFrame(tick)
else finishReturn()
}
animId = requestAnimationFrame(tick)
}
@@ -1427,6 +1452,7 @@ const canAutoAdvance = () =>
isAutoScroll.value
&& !isInteracting.value
&& !isSnapping.value
&& !isReturningToTop
&& !isDrawerOpen.value
&& !showBlessingDrawer.value
&& !showGiftPanel.value
@@ -1434,6 +1460,11 @@ const canAutoAdvance = () =>
&& !showMapOptions.value
&& !showOpenInBrowser.value
const syncProgressFromY = (y) => {
const max = pageScrollMax()
progress.value = max > 0 ? Math.min(1, Math.max(0, y / max)) : 0
}
/** 图挂载后刷新文档高度(画廊不停滚,仅校正 scrollMax */
const onGalleryReady = () => {
invalidateScrollMax()
@@ -1512,6 +1543,9 @@ const scrollPageToTop = () => {
document.documentElement.scrollTop = 0
document.body.scrollTop = 0
freeScrollOffset = 0
freeScrollLastApplied = 0
progress.value = 0
isReturningToTop = false
}
const toggleAutoScroll = () => {
@@ -2434,7 +2468,7 @@ watch(
left: 0;
font-size: 11px;
line-height: 1;
color: #a88c6b;
color: #c62828;
text-shadow:
0 0 6px rgba(253, 251, 247, 0.95),
0 1px 0 rgba(255, 255, 255, 0.8);