diff --git a/miniprogram/src/pages/booking/index.config.js b/miniprogram/src/pages/booking/index.config.js index 00aeddc..b6e60d7 100644 --- a/miniprogram/src/pages/booking/index.config.js +++ b/miniprogram/src/pages/booking/index.config.js @@ -1 +1 @@ -export default { navigationBarTitleText: '活动', navigationStyle: 'custom' }; +export default { navigationBarTitleText: '活动', navigationStyle: 'custom', disableScroll: true }; diff --git a/miniprogram/src/pages/booking/index.jsx b/miniprogram/src/pages/booking/index.jsx index 2a6d18a..0ab63f1 100644 --- a/miniprogram/src/pages/booking/index.jsx +++ b/miniprogram/src/pages/booking/index.jsx @@ -1,4 +1,4 @@ -import { View, Text, Button, Image } from '@tarojs/components'; +import { View, Text, Button, Image, ScrollView } from '@tarojs/components'; import Taro from '@tarojs/taro'; import { useState, useEffect } from 'react'; import { getBookableEvents, fmtEvt, priceText } from '@/utils/booking'; @@ -39,16 +39,6 @@ export default function Booking() { const [filter, setFilter] = useState('all'); const [err, setErr] = useState(''); const [loaded, setLoaded] = useState(false); - const [tabsTop, setTabsTop] = useState(0); - // tabs 吸顶位置 = 固定标题区实测高度(滚动到顶时 tabs 悬浮在标题区正下方) - useEffect(() => { - Taro.nextTick(() => { - Taro.createSelectorQuery() - .select('.page-navbar') - .boundingClientRect((r) => { if (r && r.height) setTabsTop(r.height); }) - .exec(); - }); - }, []); useEffect(() => { Promise.all([ @@ -118,29 +108,33 @@ export default function Booking() { - {/* 筛选 tab */} - + {/* 筛选 tab(固定区,与资讯页一致) */} + {FILTERS.map((f) => ( setFilter(f.key)}>{f.label} ))} - {/* 双列海报瀑布流 */} - - {!loaded && Array.from({ length: 4 }).map((_, i) => ( - - - - - - + {/* 内容独立滚动 */} + + {/* 双列海报瀑布流 */} + + {!loaded && Array.from({ length: 4 }).map((_, i) => ( + + + + + + + - - ))} - {loaded && filtered.map((e) => renderCard(e))} - - {loaded && filtered.length === 0 && !err && 暂无该类型活动,切换筛选看看。} - {err && {err}} + ))} + {loaded && filtered.map((e) => renderCard(e))} + + {loaded && filtered.length === 0 && !err && 暂无该类型活动,切换筛选看看。} + {err && {err}} + + ); } diff --git a/miniprogram/src/pages/booking/index.scss b/miniprogram/src/pages/booking/index.scss index ffd8d0a..d8e7e47 100644 --- a/miniprogram/src/pages/booking/index.scss +++ b/miniprogram/src/pages/booking/index.scss @@ -1,11 +1,15 @@ /* 活动列表 · 小程序样式(双列海报瀑布流 · 参考活动平台布局) */ .events { - padding: 24rpx 24rpx 180rpx; + display: flex; flex-direction: column; + height: 100vh; overflow: hidden; + padding: 0 24rpx; + box-sizing: border-box; position: relative; z-index: 2; + background: linear-gradient(165deg, #edf2ff 0%, #f6eefc 34%, #ecf7f6 68%, #eaf4ff 100%); } -@supports (padding-bottom: env(safe-area-inset-bottom)) { - .events { padding-bottom: calc(180rpx + env(safe-area-inset-bottom)); } -} +/* 内容区独立滚动(页头+倒计时+tab固定) */ +.ev-scroll { flex: 1 1 0; height: 0; min-height: 0; } +.ev-scroll-pad { height: 200rpx; } /* 区块头 */ .ev-head { display: flex; flex-direction: column; align-items: flex-start; gap: 6rpx; margin: 32rpx 0 20rpx; padding: 0 8rpx; } @@ -13,7 +17,7 @@ .ev-title { font-size: 40rpx; font-weight: 800; letter-spacing: -0.5rpx; line-height: 1.3; background: linear-gradient(120deg, #8fc3ff 0%, #a8a0ff 45%, #e0a0ff 80%, #7fe0ff 100%); -webkit-background-clip: text; background-clip: text; color: transparent; } .ev-en { font-family: 'BubbledotICG', monospace; color: #5b5b5b; font-size: 24rpx; letter-spacing: 2rpx; } -/* 筛选 tab(吸顶:透明背景,与资讯页一致,页面渐变背景透出) */ +/* 筛选 tab(固定区,与资讯页一致:透明背景,页面渐变背景透出) */ .ev-tabs { display: flex; flex-wrap: nowrap; /* 单行横滑,绝不换行 */ @@ -23,9 +27,7 @@ gap: 12rpx; padding: 18rpx 0 16rpx; margin-top: 0; - position: sticky; - top: 0; /* 运行时由内联 style 覆盖为标题区实测高度 */ - z-index: 3; + flex-shrink: 0; background: transparent; } .ev-tab {