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

uni-app(vue3)动态获取swiper的区域高度以及通过scroll-view实现区域滚动和scroll-view的置顶功能

在这里插入图片描述

计算方式:
swiper高度 = page高度 - tabs高度 - search高度

具体实现:

      <swiper class="swiper-box" :duration="500" @change="changeSwiper" :current="currentSwiperIndex" :style="'height:' + swiperHeight + 'px'"><swiper-item class="swiper-item"><scroll-view scroll-y="true" :show-scrollbar="false" :style="'height:' + swiperHeight + 'px'" @scrolltolower="lower" :scroll-top="scrollTop" @scroll="scroll"><Recommend :openUpdateFlag="openUpdateFlag" @closeUpdateFlag="handleDataUpdate" /></scroll-view></swiper-item></swiper></view><!-- 置顶 --><view class="topIcon" v-if="isShowArrowUpward" @click="goScrollTop"><up-icon name="arrow-upward" color="#fff" size="28"></up-icon></view>
  • swiperHeight:计算swiper动态高度
  • :scroll-top: 用于重置"scroll"高度
  • @scroll: 获取"scroll"滚动后的信息
  • @scrolltolower: 触底后自动触发,用于异步请求以加载更多数据
  • :show-scrollbar: 不显示滚动条

注意: scroll-view同样需要计算区域高度

const isShowArrowUpward = ref(false); // 置顶图标
const swiperHeight = ref(0); // swiper高度
const tmpScrollHeight = ref(0); // 记录scroll临时高度
const scrollTop = ref(0); // 重置scroll高度

计算swiper的高度

// 计算swiper的高度
onMounted(() => {let headerSearchHeight,headerTabsHeight = 0;// 头部搜索height: header-containerlet headerSearchView = uni.createSelectorQuery().select('.header-container');headerSearchView.boundingClientRect((data) => {headerSearchHeight = data.height;}).exec();// 顶部tabs-height:let headerTabsView = uni.createSelectorQuery().select('.u-tabs');headerTabsView.boundingClientRect((data) => {headerTabsHeight = data.height;}).exec();// swiper-heightuni.getSystemInfo({success: (res) => {swiperHeight.value = res.windowHeight - headerSearchHeight - headerTabsHeight;}});
});

注意: 需要在dom渲染完成后(onMounted、onReady)才能获取到高度值

/*** scroll-view 是区域滚动,所以无法去监听屏幕滚动*/
const scroll = (e) => {// 记录"scroll-view"临时滚动的高度tmpScrollHeight.value = e.detail.scrollTop;if (e.detail.scrollTop > 400) {// 显示"置顶"图标 isShowArrowUpward.value = true;} else {isShowArrowUpward.value = false;}
};

scroll-view置顶(方案一: 无动画)

// scroll-view高度置顶
const goScrollTop = () => {// 解决view层不同步的问题scrollTop.value = tmpScrollHeight.value;// 强制刷新nextTick(() => {scrollTop.value = 0;});
};

scroll-view置顶(方案二: 添加过渡动画)

JavaScript 模拟平滑滚动(适用于所有平台,包括微信小程序)‌

const scrollDuration = 300; // 动画时长(ms)const goScrollTop = () => {// 解决view层不同步的问题scrollTop.value = tmpScrollHeight.value;const startTime = Date.now();const startTop = scrollTop.value;const distance = startTop; // 需要滚动的距离const scrollStep = () => {const currentTime = Date.now();const timeElapsed = currentTime - startTime;const progress = Math.min(timeElapsed / scrollDuration, 1); // 0~1// 使用缓动函数(如 easeOutQuad)const easeProgress = 1 - Math.pow(1 - progress, 2);scrollTop.value = startTop - distance * easeProgress;if (timeElapsed < scrollDuration) {requestAnimationFrame(scrollStep);} else {// 强制刷新nextTick(() => {scrollTop.value = 0; // 确保最终位置准确});}};requestAnimationFrame(scrollStep);
};
.topIcon {position: fixed;bottom: 120rpx;right: 30rpx;width: 44rpx;height: 44rpx;background-color: rgb(0, 0, 0, 0.5);border-radius: 40rpx;display: flex;justify-content: center;align-items: center;
}

相关文章:

  • 纷析云开源财务软件:基于Spring Boot的轻量化财务中台实践
  • 2025系统架构师---论企业集成平台的技术与应用
  • 阿里qiankun微服务搭建
  • ShaderToy学习笔记 04.绘制多个3D对象
  • 第一章:User Interface Abstraction
  • C++复习补充 类型转换和RTTI
  • Vue 中局部指令(directives)的用法详解
  • 深入了解指针(6)
  • 微信小程序中基于 SSE 实现轻量级实时通讯 —— 原理、实践与对比分析
  • MySQL5.7.21查询入门
  • Java生成微信小程序码及小程序短链接
  • 文档在线协同工具ONLYOFFICE教程:如何使用宏突出显示具有特定提示文本的空文本字段
  • 基于YOLO的瓷砖缺陷检测系统设计与实现(附数据集+源码)
  • EMB量产首航!炯熠电子引领「线控底盘革命」
  • vue3使其另一台服务器上的x.html,实现x.html调用中的函数,并向其传递数据。
  • react中有哪几种数据结构?分别是干什么的?
  • 水表盘数字显示区域分割数据集labelme格式538张2类别
  • 【知识科普】今天聊聊CDN
  • 【AI Weekly】AI前沿热点周刊(4.21~4.27)
  • GD32F407单片机开发入门(十六)单片机IAP(在应用编程)详解及实战源码
  • 重庆大学通报本科生发14篇SCI论文处理结果
  • 兵韬志略|美2026国防预算未达1万亿,但仍寻求“暗度陈仓”
  • 印巴冲突升级,巴基斯坦股市重挫7.29%,创5年来最大单日跌幅
  • 上交现场配乐4K修复版《神女》:默片巅峰有了新的打开方式
  • 公元1057年:千年龙虎榜到底有多厉害?
  • 4月份全球制造业PMI继续下降,经济下行压力有所加大