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

@@ -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);