uniapp开发小程序—scroll-view实现内容滚动时, 标题也滚动

一、需求

scroll-view实现内容滚动时, 标题也滚动

二、效果

在这里插入图片描述

三、代码实现

<template><view class="content"><view class="head">头部固定区域</view><view class="list_box"><!-- 菜单左边 --><view class="left"><scroll-view scroll-y="true" class="scroll"><view class="item" v-for="(item,index) in leftArray" :key="index":class="{ 'active':index==leftIndex }" :data-index="index" @tap="leftTap">{{item.id}}</view></scroll-view></view><!-- 右侧内容部分 --><view class="main"><scroll-view scroll-y="true" @scroll="mainScroll" class="scroll" :scroll-into-view="scrollInto":scroll-with-animation="true" @touchstart="mainTouch" id="scroll-el"><block v-for="(item,index) in mainArray" :key="index"><scroll-view class="right-scroll"  :id="'item-'+index"><!-- :scroll-x="true" 加上可以横向滑动 --><block v-for="(item2,index2) in item.list" :key="index2"><view class="item"><view class="goods"><view>左边是第{{ index + 1 }}</view><view>右边是第{{ index2+1 }}</view></view></view></block></scroll-view></block></scroll-view></view></view></view>
</template><script>export default {data() {return {leftArray: [{id: 1},{id: 2},{id: 3},{id: 4},{id: 5},{id: 6},{id: 7},{id: 8},],mainArray: [],topArr: [],leftIndex: 0,isMainScroll: false,scrollInto: ''}},mounted() {this.getListData();},methods: {/* 获取列表数据 */getListData() {/* 因无真实数据,当前方法模拟数据 */let [left, main] = [[],[]];for (let i = 0; i < 8; i++) {left.push(`${i+1}类商品`);let list = [];for (let j = 0; j < (i + 1); j++) {list.push(j);}main.push({title: `第${i+1}类商品标题`,list})}this.mainArray = main;this.$nextTick(() => {setTimeout(() => {this.getElementTop();}, 10)});},//获取距离顶部的高度getScrollTop(selector) {return new Promise((resolve, reject) => {let query = uni.createSelectorQuery().in(this);query.select(selector).boundingClientRect(data => {resolve(data.top)}).exec();})},/* 获取元素顶部信息 */async getElementTop() {/* Promise 对象数组 */let p_arr = [];/* 遍历数据,创建相应的 Promise 数组数据 */for (let i = 0; i < this.mainArray.length; i++) {const resu = await this.getScrollTop(`#item-${i}`)p_arr.push(resu - 200)}/* 主区域滚动容器的顶部距离 */this.getScrollTop("#scroll-el").then((res) => {let top = res;// #ifdef H5top += 43; //因固定提示块的需求,H5的默认标题栏是44px// #endif/* 所有节点信息返回后调用该方法 */Promise.all(p_arr).then((data) => {this.topArr = data;});})},/* 主区域滚动监听 */mainScroll(e) {if (!this.isMainScroll) {return;}let top = e.detail.scrollTop;let index = -1;if (top >= this.topArr[this.topArr.length - 1]) {index = this.topArr.length - 1;} else {index = this.topArr.findIndex((item, index) => {return this.topArr[index + 1] >= top;});}this.leftIndex = (index < 0 ? 0 : index);// console.log('打印',this.leftIndex)},/* 主区域触摸 */mainTouch() {this.isMainScroll = true;},/* 左侧导航点击 */leftTap(e) {let index = e.currentTarget.dataset.index;this.isMainScroll = false;this.leftIndex = Number(index);this.scrollInto = `item-${index}`;}}}
</script><style lang="scss" scoped>.content {.head {width: 100%;height: 400rpx;background-color: pink;display: flex;align-items: center;justify-content: center;}.list_box {display: flex;flex-direction: row;flex-wrap: nowrap;justify-content: flex-start;align-items: flex-start;align-content: flex-start;font-size: 28rpx;height: calc(100vh - 400rpx);.left {width: 200rpx;background-color: orange;line-height: 80rpx;box-sizing: border-box;font-size: 32rpx;height: 100%;.item {padding-left: 20rpx;position: relative;&:not(:first-child) {margin-top: 1px;&::after {content: '';display: block;height: 0;border-top: #d6d6d6 solid 1px;width: 620upx;position: absolute;top: -1px;right: 0;transform: scaleY(0.5);}}&.active,&:active {color: #42b983;background-color: #fff;}}}.main {height: 100%;background-color: #fff;padding: 0 20rpx;width: 0;flex-grow: 1;box-sizing: border-box;.tips {line-height: 64rpx;font-size: 24rpx;font-weight: bold;color: #666;height: 64rpx;position: fixed;top: 44px;right: 0;width: 530rpx;z-index: 10;background-color: #fff;padding-left: 10rpx;}.right-scroll {height: calc(100vh - 400rpx);width: 100%;background-color: #efba21;border-bottom: 2rpx solid #fff;/* 横向滚动 */white-space: nowrap;flex-direction: row;.item {width: 100%;height: 100%;/* item的外层定义成行内元素才可进行滚动 inline-block / inline-flex 均可 */display: inline-flex;.goods {width: 100%;height: 100%;padding: 20rpx;box-sizing: border-box;background-color: #42b983;display: flex;flex-direction: column;flex-wrap: nowrap;justify-content: center;align-items: center;align-content: center;margin-bottom: 10rpx;border-right: 2rpx solid #fff;}.goods:last-child {border-right: 0;}}}.right-scroll:last-child {border-bottom: 0;}}.scroll {height: 100%;}}}
</style>

完成

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

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

相关文章

React16源码: React中的beginWork的源码实现

beginWork 1 &#xff09;概述 在 renderRoot 之后&#xff0c;要对我们的 Fiber 树每一个节点进行对应的更新更新节点的一个入口方法&#xff0c;就是 beginWork这个入口方法会有帮助我们去优化整棵树的更新过程 react 它的节点其实是非常多的&#xff0c;如果每一次子节点的…

学习 SSR(Server-Side Rendering)的心得和体会

学习SSR&#xff08;Server-Side Rendering&#xff09;的心得和体会 引言 在现代的前端开发中&#xff0c;性能优化和用户体验始终是核心考量之一。而在众多优化策略中&#xff0c;服务器端渲染&#xff08;Server-Side Rendering&#xff0c;简称SSR&#xff09;是一个重要…

netty 使用证书

1创建私钥&#xff08;.key&#xff09; openssl genrsa -out server.key 2048 2基于私钥&#xff08;.key&#xff09;创建证书签名请求&#xff08;.csr&#xff09; openssl req -new -key server.key -out server.csr -config ./…/ssl.cnf 3.生成CA私钥&#xff08;ca…

【c++】栈(satck)和队列(queue)

目录 一、stack 1.stack的介绍 2.stack的使用 3.stack的模拟实现 二、queue 1.queue的介绍 2.queue的使用 3.queue的模拟实现 三、priority_queue 1.priority_queue的介绍 2.priority_queue的使用 一、stack 1.stack的介绍 &#xff08;1&#xff09;stack是一种容…

kotlin 和 java 的区别

一、什么是kotlin&#xff1f; Kotlin&#xff08;科特林&#xff09;是一个用于现代多平台应用的静态编程语言&#xff0c;由 JetBrains 开发。Kotlin可以编译成Java字节码&#xff0c;也可以编译成JavaScript&#xff0c;方便在没有JVM的设备上运行。除此之外Kotlin还可以编…

pytest -- 基本使用详解

1. pytest基本介绍 pytest 是一个功能强大且易于使用的 Python 测试框架&#xff0c;用于编写单元测试、集成测试和功能测试。 它提供了丰富的功能和灵活的用法&#xff0c;使得编写和运行测试变得简单而高效。 --------------->>>>> pytest框架优点&#xff1a…

Git中config配置

文章目录 简介一、config级别二、config基本配置 简介 Git是一个开源的分布式版本控制系统&#xff0c;用于处理各种规模的项目版本管理。它由Linus Torvalds设计&#xff0c;主要用于Linux内核开发。Git的特点包括速度、简单的设计、对非线性开发模式的支持、完全的分布式能力…

springboot(ssm仓库管理系统 wms智能仓储管理系统Java系统

springboot(ssm仓库管理系统 wms智能仓储管理系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff09; …

企业怎么传输大容量视频?

在企业中&#xff0c;视频的应用越来越广泛&#xff0c;不论是在内部沟通、培训、宣传&#xff0c;还是在外部合作、推广、展示方面&#xff0c;视频都扮演着不可或缺的角色。然而&#xff0c;由于视频文件通常较大&#xff0c;传输时往往会面临网速慢、容量限制、安全风险等问…

flutter 五点一:MaterialApp Theme

ThemeData factory ThemeData({bool? applyElevationOverlayColor, //material2的darkTheme下 增加一个半透明遮罩 来凸显阴影效果 material3下无效 貌似没啥用NoDefaultCupertinoThemeData? cupertinoOverrideTheme, //ios组件样式 Iterable<ThemeExtension<dyn…

【Java基础_01】Java运行机制及运行过程

【Java基础_01】Java运行机制及运行过程 文章目录 【Java基础_01】Java运行机制及运行过程1.Java 运行机制及运行过程1.1 Java 核心机制-Java 虚拟机 [JVM java virtual machine] 1.2 JDK&#xff0c;JRE1.3 JVM,JDK和JRE1.4 环境变量path1.4.1 为什么要配置path1.4.2 配置环…

C++中的三元运算符(也称为条件运算符)是一种简洁的语法,用于基于一个布尔条件表达式选择两个值中的一个。

文章目录 用法举例&#xff1a;另一个例子&#xff1a;注意事项&#xff1a; C中的三元运算符&#xff08;也称为条件运算符&#xff09;是一种简洁的语法&#xff0c;用于基于一个布尔条件表达式选择两个值中的一个。三元运算符的一般形式是&#xff1a; condition ? expr1 :…

集中常见的排序方法Go语言版本实现

简单排序&#xff1a;插入排序、选择排序、 冒泡排序 分治排序&#xff1a;快速排序、归并排序 分配排序&#xff1a;桶排序、基数排序 树状排序&#xff1a;堆排序 其他&#xff1a;计数排序、希尔排序 稳定排序&#xff1a;如果 a 原本在 b 的前面&#xff0c;且 a b&#x…

Mesh自组网通信技术概述

Mesh自组网核心技术 Mesh自组网&#xff08;Mesh Networking&#xff09;是一种网络技术&#xff0c;主要用于在多个节点之间建立动态的、自我管理的网络连接。这种技术的核心在于其自我组织和自我修复的能力&#xff0c;使得网络能够在节点移动或节点故障时自动调整。以下是Me…

2024.1.17 用户画像day02 - Elastic Search

目录 ES和数据库的类比 ELK集中日志协议栈介绍 ES的介绍 ES的架构 ES中的名词 ES中的角色 分片与副本的区别在于: MYSQL分库与分表: 倒排序索引: ES写入数据原理: ES读取、检索数据原理: 重点: ES 的架构 , ES读写的原理 ES和数据库的类比 关系型数据库非关系型数…

mysql进阶-索引进阶

目录 1. 索引的相关语法 1.1 创建索引&#xff1a; 1.2 删除索引&#xff1a; 1.3 其他修改或创建方法&#xff1a; 2. 索引创建分类 2.1 索引类型 2.2 索引方法 2.3 索引分类 3. 索引原则 3.1 覆盖索引 3.2 最左前缀原则 3.3 索引下推(index condition pushdown) …

C++发展史

目录 什么是C C的发展史 C的重要性 C在实际工作中的应用 “21天教你学会C” 什么是C 先看看祖师爷&#xff0c;记得多拜拜&#x1f92d; C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的 程序&#xff0c;需要高度…

逻辑卷管理、逻辑卷扩展、文件系统刷新、逻辑卷删除、VDO、RAID磁盘阵列、查看进程命令、进程控制、进程管理

1 打开虚拟机 2 环境准备&#xff1a;添加一块新的80G硬盘 [rootlocalhost ~]# lsblk 80G硬盘进行&#xff08;MBR分区模式&#xff09;规划分区 划分3个10G的主分区;2个20G的逻辑分区 [rootlocalhost ~]# fdisk /dev/vdb n 创建主分区--->回车--->回车--->回车…

Vue3 + Electron框架读取程序外部配置文件

网上找了一堆都不行&#xff0c;根据这个步骤来肯定能用 1. 在项目下新建一个config.json文件 2. json文件中写入一些配置 3. vue.config.js中配置打包时把config.json文件copy到应用目录下 pluginOptions:{electronBuilder:{nodeIntegration:true,builderOptions: {extraReso…

MySQL表的基本插入查询操作详解

博学而笃志&#xff0c;切问而近思 文章目录 插入插入更新 替换查询全列查询指定列查询查询字段为表达式查询结果指定别名查询结果去重 WHERE 条件基本比较逻辑运算符使用LIKE进行模糊匹配使用IN进行多个值匹配 排序筛选分页结果更新数据删除数据截断表聚合函数COUNTSUMAVGMAXM…