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

Uniapp实现页面滚动Tab吸顶,点击tab内容滚动到对应tab内容位置

思路:运用uniapp原生提供方法uni.createSelectorQuery()获取滚动对应节点的信息,即节点距离页面顶部的距离,再通过uniapp原生监听页面滚动事件onPageScroll,获取页面内容滚动的高度,二者相加即定位到对应节点的滚动距离。

1.template结构

    <view class="content-tabs-box"><view class="content-tabs" :class="{'is-fixed': isTabFixed}"><viewv-for="(item, index) in detailTabs" :key="index" class="tab" :class="{'active': curTab === index}" @click="scrollTo(index, item.className)">{{item.name}}</view></view></view><!-- 正文详情 --><view class="library-detail-content"><view v-if="libraryDetail.videoUrl" class="content-msg"><video :src="libraryDetail.videoUrl" autoplay style="width: 100%;" /></view><view v-else class="content-msg" v-html="libraryDetail.content"></view></view><!-- 相关附件 --><view v-if="attachment.length > 0" class="library-detail-attachment"><view class="attachment-box"><view class="title">相关附件</view></view><view class="attachment-list-box"><view v-for="(item, index) in attachment" :key="index" class="attchment-list"><view class="list-name">{{ item.name }}</view><view class="download-btn" @click="download(item.url)"><image src="@/static/images/allPolicy/download-btn.png" style="width: 35rpx;height: 36rpx;margin-right: 10rpx;" mode="scaleToFill" /><view>下载</view></view></view></view></view><!-- 图文解读 --><view v-if="relatedPosts.length > 0" class="library-detail-relatedPosts"><view class="attachment-box"><view class="title">图文解读</view></view><view class="attachment-list-box"><view v-for="(item, index) in relatedPosts" :key="index" @click="toWebView(item.url, item.title)" class="attchment-list"><view><span style="margin-right: 20rpx;">{{ postType(item.related_classify) }}</span> {{ item.title }}</view></view></view></view> 

2.定义变量

  data() {return {curTab: 0,isTabFixed: false,tabTop: 0,  // tab距离顶部的距离curClassName: '',pageScrollTop: 0}},computed() {detailTabs() {let tabs = [{name: '正文详情',className: '.library-detail-content'}]if(this.attachment && this.attachment.length > 0) {tabs.splice(1, 0, {name: '相关附件',className: '.library-detail-attachment'})}if(this.relatedPosts && this.relatedPosts.length > 0) {tabs.splice(2, 0, {name: '图文解读',className: '.library-detail-relatedPosts'})}return tabs},}

3.方法定义

// 点击tab滚动事件scrollTo(tab, className) {if(!className) returnif(this.curClassName == className) returnthis.curTab = tabconst query = uni.createSelectorQuery().in(this);query.select(className).boundingClientRect(data => {uni.pageScrollTo({scrollTop: className == '.library-detail-content' ? 0 : (data?.top + ((this.pageScrollTop || 0))),duration: 300})}).exec();this.curClassName = className},// uni页面滚动监听事件onPageScroll(e) {// 获取tabs的距离顶部的距离this.tabTop = uni.createSelectorQuery().select('.content-tabs').boundingClientRect(data => {this.tabTop = data.top;this.isTabFixed = (e.scrollTop > this.tabTop)this.pageScrollTop = e.scrollTop}).exec();},

4.实现效果

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

相关文章:

  • 在Elasticsearch中-SpaceJam一个全文搜索的实例
  • Microsoft Edge浏览器安装crx拓展插件教程
  • 陈晓婚前婚后大变样
  • Linux sudo -i取消密码的方法
  • PMP考试多少分才算合格通过?
  • 原生js写数据自动纵向滚动,鼠标移入后停止滚动可手动滚动,鼠标移出转自动
  • 板凳----Linux/Unix 系统编程手册 25章 进程的终止
  • 若依Ruoyi-vue和element admin的区别,该如何选择。
  • Sklearn之朴素贝叶斯应用
  • 网络编程(二)TCP编程 TCP粘包问题
  • 【总线】AXI总线:FPGA设计中的通信骨干
  • Cesium源码解析六(3dtiles属性获取、建筑物距离计算、建筑物着色及其原理分析)
  • AI 情感聊天机器人之旅 —— 相关论文调研
  • WPF Prism框架搭建
  • MyBatisplus使用报错--Invalid bound statement
  • QT-QPainter实现一个动态充电的电池
  • 【云原生】Kubernetes----Metrics-Server组件与HPA资源
  • 模拟原神圣遗物系统-小森设计项目,设计圣遗物(生之花,死之羽,时之沙,空之杯,理之冠)抽象类
  • 仿真模拟--telnet服务两种认证模式(自作)
  • Apple Phone Memory
  • Kubernetes容器运行时:Containerd vs Docke
  • 【java 线程的状态】
  • php加密验签
  • 【Golang - 90天从新手到大师】Day06 - 数组
  • java的有参构造方法
  • Vue66-vue-默认插槽
  • tsf-consul的使用
  • 【perl】基本语法 /备忘录/
  • mongodb 集群安装
  • 绿茶集团重启IPO:流量渐退、业绩波动,还能讲出好故事吗?