uniapp+vue3 微信小程序中 页面切换tab 页面滚动到指定锚点位置,滚动页面时候到达指定锚点位置吸顶tab 会自动进行切换

uniapp+vue3 微信小程序中 页面切换tab 页面滚动到指定锚点位置,滚动页面时候到达指定锚点位置吸顶tab 会自动进行切换

页面布局如下:

javascript 复制代码
<view class="tabs-box" v-if="showTabs">
	<view class="tabs-cell" :class="[tabsActive==index?'active':'']" @click="tabsFun(index)"
	v-for="(item,index) in tabsList" :key="index">{{item.name}}</view>
</view>
<view class="tabs0"> 。。。。。</view>
<view class="tabs1"> 。。。。。</view>
<view class="tabs2"> 。。。。。</view>

<script setup>
import { reactive, ref ,nextTick, } from 'vue';
let targetId = ref(null)//锚点id
let showTabs = ref(false)//是否显示tabs
let tabsActive = ref(0)//默认tabs选择
let tabsList = ref([{name:'商品',h:0},{name:'评价',h:0},{name:'详情',h:0}])
//切换tab 方法
function tabsFun(e){
	tabsActive.value = e
	//切换tab 滚动到对应锚点位置
	const query = uni.createSelectorQuery();
	query.select(`#tabs${e}`).boundingClientRect();
	query.selectViewport().scrollOffset();
	query.exec(res => {
	  if (res[0] && res[1]) {
	    const { top } = res[0];
	    const { scrollTop } = res[1];
		// console.log(scrollTop+top)
	    uni.pageScrollTo({
	      scrollTop: scrollTop + top - 120,//120 为实际顶部tab的高度
	      duration: 300 // 滚动持续时间,单位为ms
	    });
	  }
	});
}
//下面是滚动页面 切换顶部tab的方法
import { onPageScroll} from "@dcloudio/uni-app"
//首先 获取每个锚点元素距离顶部的高度距离
nextTick(()=>{
	tabsList.value.map((item,index)=>{
		const query = wx.createSelectorQuery()
		query.select(`#tabs${index}`).boundingClientRect(rect => {
			if (rect) { 
			//获取元素距离顶部的高度有时会忽略padding或margin的高度  这里适度加上一些高度即可  
			//如果中间有循环列表高度 需要加上 length*height 高度的距离 否则滚动不准确 如果列表为5 margin为20
				tabsList.value[index].h = rect.top + (20 * 5) 
			}
		}).exec();
	})
})
// onPageScroll 方法来更新 scrollTop 的值
onPageScroll((e) => {
	// tabs切换判断
	tabsList.value.map((item,index)=>{
		//如果第一个tab高度为0  可以自己判断
		if((e.scrollTop + 120) > item.h){ //120 为实际顶部tab的高度
			tabsActive.value = index
		}
	})
	// 是否显示吸顶tabs按钮
	if(e.scrollTop > 200){
		showTabs.value = true
	}else{
		showTabs.value = false
		tabsActive.value = 0
	}
})

</script>

注意 onPageScroll 方法 如果不生效 查找代码中是否有如下问题

1,页面最外层盒子容器 是否设置了 overflow-y: auto; overflow: hidden; 设置了就删除 否则滚动不生效,

2,pages.json 中指定页面 "disableScroll": false 必须设置为 false

3,如果是自定义导航栏 需要设置 "navigationStyle": "custom",

javascript 复制代码
 {
	"path" : "pages/goods/goodsInfo",//商品详情
	"style" : {
		"navigationStyle": "custom", 
		"disableScroll": false 
	}
}
相关推荐
微笑的曙光15 小时前
第八期 · 情绪闯关挑战盒:一个「无惩罚」成就系统的数据建模
java·微信小程序
andrsted19 小时前
练题簿在线免费刷题:顺序续练、优先新题与题型筛选,让复习一轮轮推进
微信小程序·小程序·刷题
拖孩19 小时前
全程 AI 写的小程序,刚接上会员虚拟支付,上线第二天就有人真金白银买单了|双签名、定价、iOS 的坑我全踩了一遍
前端·后端·微信小程序
2501_9159214320 小时前
详细教程:使用Perfdog工具测量iOS应用的功耗性能与优化方法
android·macos·ios·小程序·uni-app·cocoa·iphone
醒醒11120 小时前
深入浅出:如何用 Python 实现一个小程序污点分析引擎
微信小程序
梦曦i21 小时前
uni-app、uni-app x 与 Flutter 深度对比:2026年跨平台开发框架选型指南
flutter·uni-app·uni-app x
andrsted1 天前
练题簿在线免费刷题:Excel、CSV 批量导题与章节整理,把现成表格变成日常题库
学习·微信小程序·小程序·刷题·在线刷题
计算机毕设定制辅导-无忧学长1 天前
《基于微信小程序的校园文化活动报名与管理系统》
java·spring boot·微信小程序·uniapp·校园文化活动报名与管理小程序
fengGer的bugs2 天前
新生儿喂养记录微信小程序:本地存储、四套主题,以及一份可改期的疫苗体检日程
微信小程序
普马萨特2 天前
uni-app x 定位踩坑实录:H5/小程序/App 统一经纬度与逆地理编码
uni-app