微信小程序tab模块滚动至顶部导航栏置顶效果实现

需要实现的效果:

markdown 复制代码
1. 顶部标题栏置顶实现  
2. 监听滚动使Tab切换区域动态置顶
3. 多模块置顶衔接与背景图处理  

① 滑动前效果:

② 滑动中效果:

③ 双置顶效果:

技术实现

1、顶部导航栏置顶

分析:

1、顶部导航栏置顶,只需借助vant组件 fixed设置为true即可。

2、页面滑动时,导航栏背景图与页面背景图一致,因此需要给导航栏添加页面背景图。

html 复制代码
<van-nav-bar 
	title="{{pageTitle}}" 
	border="{{false}}" 
	fixed="{{true}}" 
	custom-class="nav-style" 
	custom-style="background-image: url({{bgUrl}});"
>
</van-nav-bar>

2、监听滚动使Tab切换区域动态置顶

分析:

  1. 滚动监听实现方式

    • 采用页面级监听:使用onPageScroll方法
    • 或使用组件级监听:通过scroll-view的bind:scroll事件
    • 两种方式均可实时获取当前scrollTop值
  2. 置顶逻辑实现要点

    • 当tab区域滑动至导航栏位置时触发置顶
    • 当tab区域离开导航栏位置时取消置顶
    • 关键计算步骤:
      • 通过boundingClientRect()获取tab区域位置(tabScrollTop)
      • 置顶临界值 = scrollTop -
        tabTop + 导航栏高度
      • 使用wx.getMenuButtonBoundingClientRect()将导航栏高度menuHeight变为可控变量。

获取导航栏高度:

javascript 复制代码
wx.getSystemInfo({
      success: res => {
        // 导航栏.top 导航栏.bottom 导航栏.height 
        let menuButtonRect = wx.getMenuButtonBoundingClientRect()
        this.setData({
          menuHeight: menuButtonRect.bottom
        })
        console.log('导航栏高度', this.data.menuHeight)
      }
})

导航栏样式:

在上面背景图的基础上增加固定高度样式

导航栏可用内容高度:36px

不可用区域padding-top值: menuHeight - 36px

底部留白:padding-bottom: 12px;

总高度:menuHeight + 12px

tab执行位置:menuHeight + 12px

html 复制代码
<van-nav-bar 
	title="{{pageTitle}}" 
	border="{{false}}" 
	fixed="{{true}}" 
	custom-class="nav-style" 
	custom-style="background-image: url({{bgUrl}}); height: 36px; line-height: 48px; padding-bottom: 12px;padding-top: {{menuHeight - 36}}px"
>
</van-nav-bar>

获取tab区域tabTop值:

javascript 复制代码
setTimeout(() => {
	let query = this.createSelectorQuery().in(this)
	query.selectViewport().scrollOffset();
	query.select('#sticky-container').boundingClientRect();
	query.exec(res => {
		this.setData({
			stickyTop: res[1].top,
		})
	})
})

监听滚动设置置顶:

javascript 复制代码
onScroll(el) {
	let scrollTop = el.detail.scrollTop
	let tabTop = this.data.stickyTop
	let topNavHeight = this.data.menuHeight + 12
	if(scrollTop >= tabTop - topNavHeight) {
		this.showFixed(true) // 显示执行样式
	}else {
		this.showFixed(false) // 取消执行样式
	}
}

背景衔接处理

html 复制代码
<view 
	wx:if="{{isFixed && list.length > 0}}" 
	class="sticky-container sticky-fixed" 
	style="top: {{menuHeight + 12}}px;background-image: url({{bgUrl}});background-position: 0 -{{menuHeight + 12}}px;"
>
</view>
<view wx:if="{{!isFixed && list.length > 0}}" class="sticky-fixed" >
</view>
相关推荐
00后程序员张2 天前
HTTPS单向认证、双向认证、抓包原理与反抓包策略详解
网络协议·http·ios·小程序·https·uni-app·iphone
梦梦代码精2 天前
LikeShop按摩到家系统:2026年本地生活创业新风口,上门服务O2O源码私有化部署实战
大数据·docker·小程序·uni-app·生活·高并发·开源软件
leduo668899o2 天前
商城小程序自由容器支持图片自适应详解:从入门到实战全攻略
小程序
这是个栗子2 天前
【uni-app微信小程序问题解决】Uni-app 微信小程序组件不渲染
微信小程序·小程序·uni-app
倒流时光三十年2 天前
第四章 WXSS 样式系统与布局
spring boot·微信小程序
万岳科技系统开发2 天前
外卖跑腿配送开发搭建指南:从用户下单到配送完成全流程解析
大数据·前端·小程序
靠谱品牌推荐官2 天前
【高性能工程】每秒万次物联网数据高频握手:如何设计一套抗丢包的工业级小程序后端微服务架构?
物联网·小程序·架构
靠谱品牌推荐官2 天前
【高并发实战】如何基于缓存穿透治理机制设计一套高可用的小程序本地缓存中台架构?
缓存·小程序·架构
小羊Yveesss2 天前
商家小程序外卖订单打印方案:云打印机对接、分单逻辑与模板配置实战
小程序·apache
爱学习 爱分享3 天前
微信小程序html 在 webview 会打开再缩放一下
微信小程序·小程序·html