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

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

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

  • 1. 思路解析
  • 2. 代码示例

效果截图示例:

  • 点击左侧menu,右侧列表数据实现锚点定位
    在这里插入图片描述

1. 思路解析

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

【scroll-view官网】

2. 代码示例

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

// 定义数据
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 = indexcategory.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


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

http://www.lryc.cn/news/446695.html

相关文章:

  • wordpress迁移到别的服务器
  • cefsharp新版本OnBeforeResourceLoad 禁止http自动跳转https显示404错误解决办法 含代码
  • RK 方案如何做到上电关机
  • 基于量子通讯进行安全认证
  • C语言贪吃蛇小游戏演示和说明
  • C++三大特性——继承性(超万字详解)
  • electron使用npm install出现下载失败的问题
  • HT513 2.8W I2S 输入单声道D类音频功率放大器
  • [PICO VR]Unity如何往PICO VR眼镜里写持久化数据txt/json文本
  • zico2打靶记录
  • pick你的第一个人形机器人——青龙强化学习环境测试
  • 了解主机及进程资源占用情况、性能情况、性能瓶颈,TOP命令输出解释
  • 计算机网络-小型综合网络的搭建涉及到无线路由交换安全
  • CleanClip For Mac 強大的剪貼簿助手Paste替代工具 v2.2.1
  • python全栈学习记录(十八)re、os和sys、subprocess
  • GO Fsnotify学习与使用
  • 除了递归算法,要如何优化实现文件搜索功能
  • 【AI算法岗面试八股面经【超全整理】——NLP】
  • Unity 设计模式 之 创建型模式 -【单例模式】【原型模式】 【建造者模式】
  • CSS中的字体样式、文本样式、列表样式以及背景和渐变
  • 教你如何在Java中操作Redis
  • nsight-system教程
  • 进程的那些事--进程控制
  • FortiOS SSL VPN 用户访问权限配置
  • C++_vector类
  • Spring Boot入门到精通:网上购物商城系统
  • 在Vue.js中,你可以使用Element UI的el-input组件结合计算属性来实现模糊查询
  • delphi制作漂亮的农历窗体(IntraWeb+Layui的完美结合)
  • 发票OFD格式转换成PDF
  • 高通AI应用程序开发3:网络模型(一)