Uni-App 双栏联动滚动组件开发详解 (电梯导航)

本文基于提供的代码实现一个左右联动的滚动组件,以下是详细的代码解析与实现原理说明:

<!--双栏联动滚动组件 - 技术解析功能特性:1. 左侧导航栏与右侧内容区双向联动2. 自适应容器高度3. 平滑滚动定位4. 动态内容位置计算
-->
<template><view class="container"><!-- 外层容器 --><view class="nav-container" id="navContainer"><!-- 左侧导航 ScrollView --><scroll-view:scroll-y="true":style="{ height: containerHeight + 'px' }"class="nav-sidebar":scroll-into-view="leftScrollId"scroll-with-animation><!-- 导航项循环渲染 --><viewv-for="(item, index) in leftData":key="index":id="'navItem-' + index":class="['nav-item', { active: currentIndex === index }]"@tap="handleNavClick(index)">{{ item }}</view></scroll-view><!-- 右侧内容 ScrollView --><scroll-view:scroll-y="true":style="{ height: containerHeight + 'px' }"class="content-main":scroll-into-view="rightScrollId"@scroll="handleContentScroll"scroll-with-animation><!-- 内容区块循环渲染 --><viewv-for="(section, sIndex) in rightData":key="sIndex":id="'content-' + sIndex"class="content-section"><view class="section-title">{{ section.title }}</view><viewv-for="(para, pIndex) in section.content":key="pIndex"class="content-para">{{ para }}</view></view><view :style="{ height: fillHeight + 'px' }"></view></scroll-view></view></view>
</template><script>export default {// 组件参数定义props: {leftData: {// 左侧导航数据type: Array,default: () => ['章节1', '章节2', '章节3', '章节4', '章节5', '章节6'],},rightData: {// 右侧内容数据type: Array,default: () => [{title: '章节1',content: ['内容1'],},{title: '章节2',content: ['内容1'],},{title: '章节3',content: ['内容1'],},{title: '章节4',content: ['内容1'],},{title: '章节5',content: ['内容1'],},],},},// 组件状态管理data() {return {containerTop: 0, //容器距离顶部距离containerHeight: 500, // 容器动态高度currentIndex: 0, // 当前激活索引sectionPositions: [], // 章节位置缓存数组positionsReady: false, // 位置计算完成标志fillHeight: 50, // 填充盒子的高度,内容滚动最后一项增加高度方便滚动}},// 计算属性computed: {// 左侧导航自动定位ID(保持选中项在可视区)leftScrollId() {return `navItem-${Math.max(this.currentIndex - 2, 0)}` // 提前2项滚动},// 右侧内容自动定位IDrightScrollId() {return `content-${this.currentIndex}`},},// 生命周期钩子mounted() {this.initContainer().then(() => this.calcSectionPositions()).catch(console.error)},// 组件方法methods: {/*** 初始化容器尺寸* 使用 Promise 保证高度计算完成*/initContainer() {return new Promise((resolve) => {uni.createSelectorQuery().in(this).select('#navContainer').boundingClientRect((res) => {this.containerTop = res.top //距离父元素顶部高度this.containerHeight = res.heightresolve()}).exec()})},/*** 计算内容区块位置* 使用 uni API 获取元素位置信息*/calcSectionPositions() {uni.createSelectorQuery().in(this).selectAll('.content-section').boundingClientRect((res) => {// 缓存各章节顶部位置this.sectionPositions = res.map((item) => item.top - this.containerTop)this.positionsReady = truelet lastHeight = res[res.length - 1].heightconsole.log(this.containerHeight, 8454545)//如果滚动显示的区域大于右侧单个元素的高度就要加入填充高度让元素滚动的时候 左侧的标签可以正常切换if (lastHeight- 20 < this.containerHeight ) {this.fillHeight = this.containerHeight - last + 20}}).exec()},/*** 导航点击处理* @param {number} index - 点击的导航索引*/handleNavClick(index) {this.currentIndex = index // 更新当前索引},/*** 内容滚动处理* @param {Object} e - 滚动事件对象*/handleContentScroll(e) {if (!this.positionsReady) returnconst scrollTop = e.detail.scrollTopconst positions = this.sectionPositions// 二分查找算法优化(当前使用顺序查找)let current = this.currentIndexwhile (current < positions.length && positions[current] < scrollTop + 50) {current++}this.currentIndex = Math.max(current - 1, 0)},},}
</script><!-- 样式设计说明 -->
<style>/* 容器布局 */.container {height: 20vh; /* 全屏高度 */background: #ffffff;}.nav-container {display: flex; /* 弹性布局 */height: 100%;}/* 左侧导航样式 */.nav-sidebar {width: 200rpx; /* 固定宽度 */background: #f5f7fa; /* 浅色背景 */border-right: 1px solid #e4e7ed;}.nav-item {padding: 24rpx;transition: all 0.3s; /* 平滑过渡效果 */}.nav-item.active {color: #409eff; /* 主题色 */background: #ecf5ff; /* 激活背景 */}/* 右侧内容样式 */.content-main {flex: 1; /* 剩余空间填充 */padding: 32rpx;}.section-title {font-size: 36rpx; /* 标题字号 */font-weight: 600;}.content-para {background: #fafafa; /* 段落背景 */border-radius: 8rpx;}
</style>

技术实现要点

1. 双向滚动联动机制

  • 导航 → 内容:通过 scroll-into-view 绑定计算属性,点击时自动定位
  • 内容 → 导航:监听滚动事件,计算当前可见章节并更新激活状态

2. 性能优化设计

  • 位置信息缓存:预先计算章节位置,避免频繁查询DOM
  • 节流处理:滚动事件默认自带节流,保证性能
  • 异步计算:使用 Promise 链保证初始化顺序

3. 自适应布局

  • 动态高度计算:通过 uni API 获取容器实际高度
  • Flex 布局:实现左右栏自适应排列

4. 扩展性考虑

  • 组件化设计:通过 props 接收数据,方便复用
  • 样式可配置:通过 class 控制样式,易于主题定制

使用示例

<template><dual-scroll :left-data="categories" :right-data="contents"/>
</template><script>
// 示例数据结构
const categories = ['水果', '蔬菜', '肉类']
const contents = [{title: '水果',content: ['苹果', '香蕉', '橙子']},{title: '蔬菜',content: ['白菜', '萝卜', '番茄']}
]
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/74304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软考复习-传输介质与编码

传输介质 双绞线 传输距离100一200m&#xff0c;即网线&#xff0c;有多种分类 UTP非屏蔽双绞线 STP屏蔽双绞线 线序标准有两种为&#xff1a; T568A标准&#xff1a;绿白、绿、橙白、蓝、蓝白、橙、棕白、棕 T568B标准&#xff1a;橙白、橙、绿白、蓝、蓝白、绿、棕白、…

论文阅读笔记:Denoising Diffusion Probabilistic Models (3)

论文阅读笔记&#xff1a;Denoising Diffusion Probabilistic Models (1) 论文阅读笔记&#xff1a;Denoising Diffusion Probabilistic Models (2) 论文阅读笔记&#xff1a;Denoising Diffusion Probabilistic Models (3) 4、损失函数逐项分析 可以看出 L L L总共分为了3项…

PyTorch 面试题及参考答案(精选100道)

目录 PyTorch 的动态计算图与 TensorFlow 的静态计算图有何区别?动态图的优势是什么? 解释张量(Tensor)与 NumPy 数组的异同,为何 PyTorch 选择张量作为核心数据结构? 什么是 torch.autograd 模块?它在反向传播中的作用是什么? 如何理解 PyTorch 中的 nn.Module 类?…

#C8# UVM中的factory机制 #S8.1.4# 约束的重载

今天,复习一下《UVM实战》一书中的 关于约束的重载 章节学习。 一 问题引导 文件:src/ch8/section8.1/8.1.2/rand_mode/my_transaction.sv4 class my_transaction extends uvm_sequence_item; …17 constraint crc_err_cons{18 crc_err == 1b0;19 }20 const…

空调遥控器低功耗单片机方案

RAMSUN空调遥控器采用先进的32位低功耗单片机作为核心控制器&#xff0c;通过优化软件算法和硬件设计&#xff0c;实现了空调遥控器的低功耗运行。单片机集成了多种功能模块&#xff0c;包括红外发射、按键扫描、电源管理等&#xff0c;有效降低了整体功耗。同时&#xff0c;该…

结构型——代理模式

结构型——代理模式 代理模式指的是通过创建一个代理来控制对原始对象的访问。代理在客户端与实际对象之间充当“中介” 特点 访问控制&#xff1a;代理对象可以控制对实际对象的访问&#xff0c;从而实现对访问权限的控制。延迟加载&#xff1a;代理对象可以在实际对象被调…

【算法】常见排序算法(插入排序、选择排序、交换排序和归并排序)

文章目录 前言一、排序概念及常见排序算法框图1.排序概念2.常见排序算法框图 二、实现比较排序算法1.插入排序1.1 直接插入排序1.2 希尔排序 2.选择排序2.1 直接选择排序2.2 堆排序 3.交换排序3.1 冒泡排序3.2 快速排序3.2.1 hoare版本3.2.2 挖坑法3.2.3 lomuto前后指针 3.3 快…

Go语言分布式锁实战:dlock助力构建高并发稳定系统

在构建分布式系统时&#xff0c;一个常见且棘手的问题便是资源竞争和数据一致性问题。分布式锁作为一种常用的解决方案&#xff0c;在多个进程或节点之间协调访问共享资源时显得尤为重要。今天&#xff0c;我们将介绍一款分布式锁库——dlock&#xff0c;并通过详细的使用示例带…

算法方法快速回顾

&#xff08;待修改&#xff09; 目录 1. 双指针2. 滑动窗口理论基础 3. 二分查找3. 二分查找理论基础 4. KMP5. 回溯算法6. 贪心算法7. 动态规划7.1. 01背包7.2. 完全背包7.3. 多重背包 8. 单调栈9. 并查集10. 图论10.1. 广度优先搜索&#xff08;BFS&#xff09;10.2. 深度优…

深度学习:让机器学会“思考”的魔法

文章目录 引言&#xff1a;从“鹦鹉学舌”到“举一反三”一、深度学习是什么&#xff1f;1. 定义&#xff1a;机器的“大脑”2. 核心思想&#xff1a;从数据中“悟”出规律 二、深度学习的“大脑”结构&#xff1a;神经网络1. 神经元&#xff1a;深度学习的基本单元2. 神经网络…

电动自行车/电动工具锂电池PCM方案--SH367003、SH367004、SH79F329

在消费电子系统中&#xff0c;如手机电池包&#xff0c;笔记本电脑电池包等&#xff0c;带有控制IC、功率MOSFETFE管以及其他电子元件的电路系统称为电池充放电保护板Protection Circuit Module &#xff08;PCM&#xff09;&#xff0c;而对于动力电池的电池管理系统&#xff…

补码详细分析

补码引入 举一个生活化的例子 假设由一个挂钟&#xff0c;它只能顺时钟调时间&#xff0c;那么它调时间就分成了一下两种情况 正好顺时针调就能调好 如&#xff1a;时针从5调到9需要逆时针调才能调好 如&#xff1a;时针从10调到7 在上面的情况中1是不用处理的&#xff0c;2…

计算机网络入门:物理层与数据链路层详解

&#x1f310; &#xff08;专业解析 中学生也能懂&#xff01;&#xff09; &#x1f4d6; 前言 计算机网络就像数字世界的“高速公路系统”&#xff0c;而物理层和数据链路层是这条公路的基石。本文用 专业视角 和 生活化比喻 &#xff0c;带你轻松理解这两层的核心原理&a…

哪些视频格式在webview2中播放可以设置成透明的?

在WebView2中&#xff0c;能够播放并设置成透明背景的视频格式主要取决于其支持的编解码器以及视频是否包含alpha通道&#xff08;透明度信息&#xff09;。以下是支持透明背景的视频格式&#xff1a; 支持透明背景的视频格式 1. WebM&#xff08;使用VP9编解码器&#xff09; …

【基于ROS的A*算法实现路径规划】A* | ROS | 路径规划 | Python

### 记录一下使用Python实现ROS平台A*算法路径规划 ### 代码可自取 &#xff1a;Xz/little_projecthttps://gitee.com/Xz_zh/little_project.git 目录 一、思路分析 二、算法实现 三、路径规划实现 一、思路分析 要求使用A*算法实现路径规划&#xff0c;可以将该任务分为三…

2025-03-23 吴恩达机器学习3——多维特征

文章目录 1 多元引入2 矢量化2.1 示例2.2 非矢量化实现2.3 矢量化实现2.4 应用 3 特征缩放3.1 举例3.2 必要性3.3 方法3.3.1 最大最小值缩放&#xff08;Min-Max Scaling&#xff09;3.3.2 均值归一化&#xff08;Mean Normalization&#xff09;3.3.3 Z 分数归一化&#xff08…

正点原子内存管理学习和修改

由于项目需要用到内存管理进行动态申请和释放&#xff0c;今天又重新学习了一下正点原子的内存管理实验&#xff0c;温习了一下内存管理的实质。首先先上正点原子内存管理的源代码&#xff1a; malloc.c文件&#xff1a; #include "./MALLOC/malloc.h"#if !(__ARMC…

时空观测者:俯身拾贝

目录 中华文明时空贝壳集&#xff08;按时间排序&#xff09;1. 良渚玉琮&#xff08;约公元前3300-2300年&#xff09;2. 三星堆青铜神树&#xff08;公元前1200年&#xff09;3. 殷墟甲骨文&#xff08;约公元前14世纪&#xff09;4. 京杭大运河&#xff08;公元前486年始建&…

护网期间监测工作全解析:内容与应对策略

护网期间监测工作全解析&#xff1a;内容与应对策略 一、引言 在数字化浪潮中&#xff0c;网络安全的重要性愈发凸显&#xff0c;护网行动作为保障关键信息基础设施安全的关键举措&#xff0c;备受瞩目。护网期间&#xff0c;监测工作是发现潜在威胁、防范攻击的重要防线。全…

【Centos7搭建Zabbix4.x监控HCL模拟网络设备:zabbix-server搭建及监控基础05

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 5.zabbix监控HCL模拟网络设备 在保证zabbix-server与HCL网络相通的情况下进行如下操作。 5.1创建主机群 配置-主机群-创建主机群 图 19 取名&#xff0c;添加。 图 20 5.2 创建监控…