当前位置: 首页 > news >正文

吸顶交互逻辑全解析

页面加载 ↓ getRecommendPosition() 获取 recommendTop // 需要吸顶区域 ↓ 用户滚动页面 ↓ handlePageScroll(scrollTop) ↓ ┌─ isFixed = true? ─┐ │ ↓ │ │ ┌─是─┐ ┌─否─┐ │ │ │ │ │ │ │ │ ↓ │ ↓ │ │ │ scrollTop │ scrollTop │ │ < recommendTop-50? │ >= recommendTop? │ │ ↓ │ ↓ │ │ 解吸顶 │ 吸顶 │ │ ↓ │ ↓ │ │ return │ isFixed=true │ │ │ ↓ │ │ │ return │ │ │ │ └─────────┴───────────┘

逻辑梳理

一、初始化阶段

页面加载时,通过uni.createSelectorQuery获取分类导航元素(#recommend-section)距离视口顶部的距离,保存到recommendTop变量中。这个值表示分类导航在页面自然状态下的位置

1. 数据定义 (data) // 分类导航吸顶相关 isFixed: false, // 是否固定定位,控制是否吸顶 recommendTop: 0, // 分类导航距离顶部的距离 2. 初始化位置 (onLoad) // 获取分类导航距离顶部的距离,用于吸顶效果 this.$nextTick(() => { this.getRecommendPosition(); }); 3. 获取位置信息 (getRecommendPosition) getRecommendPosition() { // 使用 uni.createSelectorQuery() 获取 #recommend-section 元素距离视口顶部的距离,存入 recommendTop。 const query = uni.createSelectorQuery().in(this); query .select("#recommend-section") .boundingClientRect((data) => { if (data) { this.recommendTop = data.top; // 获取元素距离视口顶部的距离 } }) .exec(); },
二、吸顶条件

当页面滚动时,比较当前滚动距离scrollToprecommendTop的大小。只要scrollTop >= recommendTop,就将isFixed设为true,分类导航固定在搜索栏下方

4. 滚动监听 (onPageScroll → handlePageScroll) onPageScroll(e) { this.handlePageScroll(e.scrollTop); }, handlePageScroll(scrollTop) { // 如果已经吸顶 if (this.isFixed) { // 当滚动回顶部(小于吸顶阈值)时,解除吸顶 if (scrollTop < this.recommendTop - 50) { this.isFixed = false; } return; } // 如果还未吸顶,检查是否需要吸顶 if (!this.recommendTop) return; // 当滚动距离大于等于分类导航的初始位置时,吸顶 if (scrollTop >= this.recommendTop) { this.isFixed = true; } }, 核心逻辑: 吸顶条件:scrollTop >= recommendTop 解除条件:scrollTop < recommendTop - 50(向上滚动50px以上才解除)
三、保持吸顶

一旦isFixed变为true,滚动监听函数会直接返回,不再判断是否需要吸顶或解除吸顶。这样做的目的是防止页面内容变化(如切换分类清空列表)导致页面回弹时,吸顶状态被意外取消。

四、解除吸顶

当吸顶状态已激活时,只有用户向上滚动,使scrollTop < recommendTop - 50时,才将isFixed设为false。预留 50px 的缓冲距离,避免频繁切换。

五、切换分类

点击分类时,清空当前列表并加载新数据。如果之前处于吸顶状态,切换完成后会重新获取分类导航的位置,确保吸顶位置准确。由于吸顶后直接返回,列表清空引起的页面回弹不会影响吸顶状态。

// 切换分类处理 (goCategory) goCategory(item) { const wasFixed = this.isFixed; // 保存吸顶状态 this.currentCategoryId = item.id; this.categoryPage = 0; this.categoryHasMore = true; this.categoryInfoList = []; // 清空列表(会导致页面回弹) this.loadCategoryData(); // 如果之前是吸顶状态,切换分类后重新检查 if (wasFixed) { this.$nextTick(() => { this.getRecommendPosition(); }); } }, 问题:清空 categoryInfoList 会导致页面内容减少,触发页面回弹。但由于吸顶后直接 return,所以不会影响 isFixed。
六、样式切换

通过isFixed控制类名recommend-fixed,使分类导航从正常文档流切换为position: fixed,并设置合适的top值固定在搜索栏下方。

<view id="recommend-section" class="recommend-section" :class="{ 'recommend-fixed': isFixed }" > .recommend-section.recommend-fixed { position: fixed; top: calc(72rpx + 40rpx); // 固定在搜索栏下方 left: 0; right: 0; z-index: 199; margin: 0; padding: 16rpx 18rpx; background: #fffbf5; box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.08); }
http://www.jsqmd.com/news/850696/

相关文章:

  • 思源宋体TTF:如何用开源字体解决中文排版三大技术难题
  • 2026年5月全球领先GEO优化服务商五强技术实力与场景适配深度评估 - 产业观察网
  • 6大升级拆解(上):Rhapsody SE如何把复杂系统变得“可控、可追溯”
  • 如何在PowerPoint中高效使用LaTeX进行数学公式排版
  • DataGrip分屏操作全攻略:如何像高手一样同时调试多个SQL窗口?
  • 从宿舍到机房:手把手用两台华为交换机搭建小型办公网(含VLAN与静态路由)
  • Linux 的 uniq 命令
  • [RDMA]重传机制深度剖析:从Error触发到网络恢复的完整链路
  • 2026淮南装修公司推荐榜:口碑排名前五,选对不踩坑 - 速递信息
  • Halcon实战:用投影变换搞定倾斜标定板图像校正(附完整代码)
  • 2026邛崃市本地人必选的瓷砖空鼓专业维修公司TOP5推荐!卫生间空鼓翘边,厨房空鼓翘边,客厅空鼓翘边,全天响应,免费上门,5月专业瓷砖空鼓修复公司持证上岗师傅排名最新深度调研方案) - 一修哥修缮
  • 告别Keil卡顿!用J-Link和Ozone V3.32a调试STM32,体验丝滑的变量波形图
  • 避坑指南:OpenCV人脸识别项目整合MySQL时,你可能会遇到的5个数据存储难题
  • 5月最新:实测10款降AI率工具大汇总(附免费方案) - 殷念写论文
  • 2026年淮安婚纱摄影店排行榜:金帝皇后婚纱摄影,综合实力与口碑最优选 - 华Sir1
  • 账龄分析是什么?账龄分析如何助力企业高效经营?
  • PotPlayer字幕翻译插件终极指南:免费实现多语言实时字幕转换
  • 别再为CMSIS-DAP仿真器接线发愁了!板载与外置两种方案,从接线到Keil参数配置保姆级指南
  • 楼宇自控系统阀门技术:精准控制、节能原理与智能化集成实践
  • 【智慧养老合集】800余份智慧康养、数智康养、银发经济、智慧养老、数字养老、养老信息化平台方案报告(PPT+WORD+PDF)
  • 从‘压高光’到‘提暗部’:深入聊聊手机相机AE里的Histogram Stretch到底在干嘛
  • 2026年景区智能检票设备制造商深度测评:如何为你的景区匹配最佳方案? - 速递信息
  • 无锡兆材包装:新吴二手拖盘回收公司怎么联系 - LYL仔仔
  • 公众号排版如何做到“好看又省时”?这里有一份保姆级操作指南+公众号排版工具 - 小小智慧树~
  • Aximmetry Broadcast DE 2023.2.2 补丁:解锁一体化虚拟制作新潜能
  • ppt模板_0033_圣诞主题2
  • 伸缩门选型技术全解析:从耐用性到场景适配 - 奔跑123
  • Memcached add 命令详解
  • R3nzSkin深度技术解析:英雄联盟皮肤修改器的架构解密与实战手册
  • Adobe-GenP 3.0终极指南:5分钟免费激活Adobe全系列创意软件