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

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;
}
http://www.xdnf.cn/news/2639.html

相关文章:

  • LangChain入门(二)安装开发环境
  • 【论文复现】SmoothQuant的安装与使用
  • (云计算HCIP)HCIP全笔记(十三)本篇介绍虚拟化技术,内容包含:虚拟化资源、虚拟化过程、I/O虚拟化、虚拟化架构KVM和Xen介绍、主流虚拟化技术介绍
  • 亚马逊云科技2025战略解析:AI驱动下的全球生态重塑
  • 链表相关——Python实现
  • 【Rust通用集合类型】Rust向量Vector、String、HashMap原理解析与应用实战
  • 使用 MQTT - C 访问 IoTDA 平台:一个完整的嵌入式示例
  • Java面试场景深度解析
  • 排序--数据结构初阶(4)(C/C++)
  • QT开发技术【qcustomplot 曲线与鼠标十字功能】
  • 【C++ Qt】快速上手 显⽰类控件(Label、LCDNumber、ProcessBar、CalendarWidget)
  • Java项目技术栈使用场景深度解析
  • el-Input输入数字自动转千分位进行展示
  • Golang|外观模式和具体逻辑
  • 前端:纯HTML、CSS和JS菜单样式
  • 如何免费把PPT的页面输出为透明的图片-快速制作图新说汇报内容
  • 【Java开发日记】OpenFeign 的 9 个坑
  • 【wpf】 WPF中实现动态加载图片浏览器(边滚动边加载)
  • GCC 15.1 发布,包含 COBOL 编译器及多项其他改进
  • FastAPI中使用Pydantic进行数据验证的示例与关键技术点分析
  • java Optional
  • 【vLLM 学习】CPU 离线处理
  • 通俗易懂一文讲透什么是 MCP?
  • 坐标转换:从WGS-84到国内坐标系(GCJ-02BD-09)
  • 大语言模型 - 运行、微调的显存计算详解与优化 全量微调、LoRA 优化策略
  • windows安装docker教程
  • PTA -L1-005 考试座位号(BufferedReader、Arraylist动态数组、Map)
  • 记录一下从debian12升级到debian13出现的小插曲01
  • C++翻转数相乘 2024年信息素养大赛复赛 C++小学/初中组 算法创意实践挑战赛 真题详细解析
  • shell编程基础知识及脚本示例