1. 礼物特效
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user