1. 礼物特效
This commit is contained in:
@@ -86,16 +86,16 @@ func loadGiftCounts() map[string]int64 {
|
|||||||
return counts
|
return counts
|
||||||
}
|
}
|
||||||
|
|
||||||
// defaultGiftCosts 默认三阶梯:50 / 100 / 200
|
// defaultGiftCosts 默认三阶梯:50 / 100 / 200(永结同心为终章,默认 200)
|
||||||
var defaultGiftCosts = map[string]int64{
|
var defaultGiftCosts = map[string]int64{
|
||||||
"520": 50,
|
"520": 50,
|
||||||
"forever": 50,
|
"forever": 50,
|
||||||
"bald": 50,
|
"bald": 50,
|
||||||
"concentric": 50,
|
|
||||||
"1314": 100,
|
"1314": 100,
|
||||||
"heaven": 100,
|
"heaven": 100,
|
||||||
"moisten": 100,
|
"moisten": 100,
|
||||||
"match": 200,
|
"match": 200,
|
||||||
|
"concentric": 200,
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,13 +1,13 @@
|
|||||||
/** 礼物类型常量表(与后端 giftTypeWhitelist / defaultGiftCosts 一致) */
|
/** 礼物类型常量表(与后端 giftTypeWhitelist / defaultGiftCosts 一致;永结同心放最后) */
|
||||||
export const GIFT_TYPES = [
|
export const GIFT_TYPES = [
|
||||||
{ key: '520', label: '520', cost: 50, preview: 'linear-gradient(135deg, #ff8da6 0%, #ff2d55 55%, #c41e3a 100%)' },
|
{ 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: '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: '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: '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: '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: '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: '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]))
|
export const GIFT_LABEL_MAP = Object.fromEntries(GIFT_TYPES.map((g) => [g.key, g.label]))
|
||||||
|
|||||||
@@ -1088,6 +1088,8 @@ let freeScrollLastTs = 0
|
|||||||
let freeScrollLastApplied = -1
|
let freeScrollLastApplied = -1
|
||||||
/** 进度条节流 */
|
/** 进度条节流 */
|
||||||
let freeScrollProgressTick = 0
|
let freeScrollProgressTick = 0
|
||||||
|
/** 底部自动回顶动画中:暂停自由滚,并自行驱动进度条 */
|
||||||
|
let isReturningToTop = false
|
||||||
let scrollHeightObserver = null
|
let scrollHeightObserver = null
|
||||||
/**
|
/**
|
||||||
* iOS 自由自动滚:用 GPU transform 平移内容,全程不写 scrollTop。
|
* iOS 自由自动滚:用 GPU transform 平移内容,全程不写 scrollTop。
|
||||||
@@ -1396,16 +1398,39 @@ const scheduleBottomReturn = (reset = false) => {
|
|||||||
const smoothScrollTo = (target, duration) => {
|
const smoothScrollTo = (target, duration) => {
|
||||||
cancelAnimationFrame(animId)
|
cancelAnimationFrame(animId)
|
||||||
if (iosTransformActive) exitIosTransformScroll()
|
if (iosTransformActive) exitIosTransformScroll()
|
||||||
const start = pageScrollTopNative(), dist = target - start
|
const start = pageScrollTopNative()
|
||||||
if (!dist) return
|
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()
|
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 t0 = performance.now()
|
||||||
const tick = (now) => {
|
const tick = (now) => {
|
||||||
const p = Math.min(1, (now - t0) / duration)
|
const p = Math.min(1, (now - t0) / duration)
|
||||||
const e = p < 0.5 ? 2 * p * p : 1 - Math.pow(-2 * p + 2, 2) / 2
|
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)
|
if (p < 1) animId = requestAnimationFrame(tick)
|
||||||
|
else finishReturn()
|
||||||
}
|
}
|
||||||
animId = requestAnimationFrame(tick)
|
animId = requestAnimationFrame(tick)
|
||||||
}
|
}
|
||||||
@@ -1427,6 +1452,7 @@ const canAutoAdvance = () =>
|
|||||||
isAutoScroll.value
|
isAutoScroll.value
|
||||||
&& !isInteracting.value
|
&& !isInteracting.value
|
||||||
&& !isSnapping.value
|
&& !isSnapping.value
|
||||||
|
&& !isReturningToTop
|
||||||
&& !isDrawerOpen.value
|
&& !isDrawerOpen.value
|
||||||
&& !showBlessingDrawer.value
|
&& !showBlessingDrawer.value
|
||||||
&& !showGiftPanel.value
|
&& !showGiftPanel.value
|
||||||
@@ -1434,6 +1460,11 @@ const canAutoAdvance = () =>
|
|||||||
&& !showMapOptions.value
|
&& !showMapOptions.value
|
||||||
&& !showOpenInBrowser.value
|
&& !showOpenInBrowser.value
|
||||||
|
|
||||||
|
const syncProgressFromY = (y) => {
|
||||||
|
const max = pageScrollMax()
|
||||||
|
progress.value = max > 0 ? Math.min(1, Math.max(0, y / max)) : 0
|
||||||
|
}
|
||||||
|
|
||||||
/** 图挂载后刷新文档高度(画廊不停滚,仅校正 scrollMax) */
|
/** 图挂载后刷新文档高度(画廊不停滚,仅校正 scrollMax) */
|
||||||
const onGalleryReady = () => {
|
const onGalleryReady = () => {
|
||||||
invalidateScrollMax()
|
invalidateScrollMax()
|
||||||
@@ -1512,6 +1543,9 @@ const scrollPageToTop = () => {
|
|||||||
document.documentElement.scrollTop = 0
|
document.documentElement.scrollTop = 0
|
||||||
document.body.scrollTop = 0
|
document.body.scrollTop = 0
|
||||||
freeScrollOffset = 0
|
freeScrollOffset = 0
|
||||||
|
freeScrollLastApplied = 0
|
||||||
|
progress.value = 0
|
||||||
|
isReturningToTop = false
|
||||||
}
|
}
|
||||||
|
|
||||||
const toggleAutoScroll = () => {
|
const toggleAutoScroll = () => {
|
||||||
@@ -2434,7 +2468,7 @@ watch(
|
|||||||
left: 0;
|
left: 0;
|
||||||
font-size: 11px;
|
font-size: 11px;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
color: #a88c6b;
|
color: #c62828;
|
||||||
text-shadow:
|
text-shadow:
|
||||||
0 0 6px rgba(253, 251, 247, 0.95),
|
0 0 6px rgba(253, 251, 247, 0.95),
|
||||||
0 1px 0 rgba(255, 255, 255, 0.8);
|
0 1px 0 rgba(255, 255, 255, 0.8);
|
||||||
|
|||||||
Reference in New Issue
Block a user