uni-app - - - - - 实现锚点定位和滚动监听功能(滚动监听功能暂未添加,待后续更新)

实现锚点定位和滚动监听功能

  • [1. 思路解析](#1. 思路解析)
  • [2. 代码示例](#2. 代码示例)

效果截图示例:

  • 点击左侧menu,右侧列表数据实现锚点定位

1. 思路解析

  • 点击左侧按钮,更新右侧scroll-view对应的scroll-into-view的值,即可实现右侧锚点定位
  • 滚动右侧区域,计算右侧滚动距离 动态更新左侧scroll-view对应的scroll-into-view的值,即可实现左侧锚点定位(暂无需求,先提供思路)

【scroll-view官网】

2. 代码示例

HTML

html 复制代码
<view>


	<!-- 左侧menu -->
	<scroll-view scroll-y="true" :scroll-into-view="category.categoryMenuIntoView"
		scroll-with-animation="true">
		
		<view :id='"category-menu-" + index' v-for="(item, index) in category.coffeeList" :key="item.categoryId" @click="switchCategoryMenu(item,index)">
			{{ item.categoryName }}		
		</view>
		
	</scroll-view>




	<!-- 右侧列表 -->
	<scroll-view scroll-y="true" :scroll-into-view="category.coffeeIntoView" scroll-with-animation="true">
	
		<view :id='"category-coffee-" + index' @scroll='coffeeScroll'>
			{{item.name}}
		</view>
		
	</scroll-view>

</view>

重点:

  • scroll-into-view:值应为某子元素id(id不能以数字开头)。设置哪个方向可滚动,则在哪个方向滚动到该元素
  • id设置:唯一值切不能为数字开头(后续需该值赋给scroll-into-view

JS

js 复制代码
// 定义数据
const category = reactive({
	idx: 0,
	coffeeList: [],
	categoryMenuIntoView: 'category-menu-0',
	coffeeIntoView: 'category-coffee-0'

})



/**
 * 点击切换左侧menu
 */
const switchCategoryMenu = (item, index) => {
	if (category.idx == index) return console.log('点击即为当前选中分类,无需切换逻辑')
	category.idx = index
	category.categoryMenuIntoView = `category-menu-${index}`
	category.coffeeIntoView = `category-coffee-${index}`
}



/**
 *  onLoad之后执行,预先计算出右侧锚点卡片的范围
 */
const getDistanceToTop = () => {
	distanceList.value = []; // 清空旧的距离列表
	const selectorQuery = uni.createSelectorQuery();
	selectorQuery.selectAll('.coffee-box').boundingClientRect(rects => {
		console.log('rects.map(rect => rect.top)', rects.map(rect => rect.top))
		distanceList.value = rects.map(rect => rect.top); // 直接映射为 `top` 值
	}).exec();
}



/**
 *  节流监听右侧区域滚动,联动左侧menu锚点定位
 *  根据滚动出的距离,属于getDistanceToTop对应的哪一个范围,动态修改左侧scroll-into-view的值即可
 */
const coffeeScroll = throttle((event) => {
	let scrollTop = event.detail.scrollTop;
}, 200); // 节流时间 300ms


如此即可实现锚点定位功能。(滚动监听功能后续可能会更新)

相关推荐
2501_9160074718 小时前
HTTPS 抓包的流程,代理抓包、设备数据线直连抓包、TCP 数据分析
网络协议·tcp/ip·ios·小程序·https·uni-app·iphone
游戏开发爱好者820 小时前
React Native iOS 代码如何加密,JS 打包 和 IPA 混淆
android·javascript·react native·ios·小程序·uni-app·iphone
2501_9159184121 小时前
iOS mobileprovision 描述文件管理,新建、下载和内容查看
android·ios·小程序·https·uni-app·iphone·webview
00后程序员张21 小时前
iOS 应用程序使用历史记录和耗能记录怎么查?
android·ios·小程序·https·uni-app·iphone·webview
学亮编程手记1 天前
Mars-Admin 基于Spring Boot 3 + Vue 3 + UniApp的企业级管理系统
vue.js·spring boot·uni-app
万物得其道者成1 天前
uni-app CLI:APP 多环境打包(测试/正式)最简配置 + `import.meta.env` 为 `undefined` 的解决
uni-app
毕设源码-邱学长1 天前
【开题答辩全过程】以 基于 uni-app Node.js 的音乐系统设计与实现为例,包含答辩的问题和答案
uni-app
qq_316837751 天前
华为obs 私有桶 音频 使用uniapp 安卓端播放-99的问题
uni-app·音视频
凉辰2 天前
uniapp实现生成海报功能 (开箱即用)
javascript·vue.js·小程序·uni-app
笨笨狗吞噬者2 天前
【uniapp】小程序支持分包引用分包 node_modules 依赖产物打包到分包中
前端·微信小程序·uni-app