Uniapp 实现微信小程序滑动面板功能详解

文章目录

  • 前言
  • 一、功能概述
  • 二、实现思路
  • 三、代码实现
  • 总结


前言

Uniapp 实现微信小程序滑动面板功能详解


一、功能概述

滑动面板是移动端常见的交互组件,通常用于在页面底部展开内容面板。本文将介绍如何使用 Uniapp 开发一个支持手势滑动的底部面板组件,实现以下核心功能:
触摸滑动调整面板高度
边界限制
与地图组件的层级适配

二、实现思路

使用 Uniapp 框架实现跨平台兼容
通过 CSS transform 实现动画效果
基于微信小程序触摸事件体系
结合选择器 API 获取元素尺寸
触摸事件监听:捕获 touchstart/touchmove/touchend 事件
滑动距离计算:通过 clientY 坐标差值计算滑动距离
边界限制:确保面板在允许的高度范围内滑动
弹性动画:使用 CSS transition 实现平滑过渡
层级管理:通过 z-index 控制与其他组件的层级关系

三、代码实现

<template><viewclass="slider-panel"@touchstart="handleTouchStart"@touchmove.stop.prevent="handleTouchMove"@touchend="handleTouchEnd":style="{'min-height': `${initialPosition}px`,transform: `translateY(${translateY}px)`}"><view class="slider-panel-handle"></view><view class="slider-panel-content"><slot></slot></view></view>
</template>
<script>
export default {name: 'SliderPanel',props: {initialPosition: {type: Number,default: 100},deltaYThreshold: {type: Number,default: 100}},data() {return {isDragging: false,startY: 0,translateY: 0,panelHeight: 0,panelInitialShowHeight: 0}},async mounted() {const { height } = await this.getSelectorRect('.slider-panel-content')this.panelHeight = heightif (this.initialPosition > this.panelHeight) {this.panelInitialShowHeight = this.panelHeight} else {this.panelInitialShowHeight = height - this.initialPositionthis.translateY = this.panelInitialShowHeight}},methods: {getSelectorRect(selector) {const query = wx.createSelectorQuery().in(this)return new Promise((resolve) => {query.select(selector).boundingClientRect((rect) => {resolve(rect)}).exec()})},handleTouchStart(event) {const { clientY } = event.touches[0]this.isDragging = truethis.startY = clientY},handleTouchMove(event) {if (this.isDragging) {const { clientY } = event.touches[0]const deltaY = clientY - this.startYthis.startY = clientYthis.translateY += deltaYif (this.translateY < 0) {this.translateY = 0}if (this.translateY > this.panelInitialShowHeight) {this.translateY = this.panelInitialShowHeight}}},handleTouchEnd() {this.isDragging = false}}
}
</script><style scoped lang="scss">
.slider-panel {position: fixed;width: 100%;box-sizing: border-box;left: 0;bottom: 0;background: #fff;padding: 20rpx;border-radius: 24px 24px 0 0;box-shadow: 0 -4px 12px rgba(0, 0, 0, 0.1);z-index: 30;will-change: transform;.slider-panel-handle {width: 60rpx;height: 6rpx;border-radius: 3rpx;background: #f0f0f0;margin: 16rpx auto 24rpx;}
}
</style>
<template><view class="container"><map style="width: 100%; height: 100%" :enable-scroll="false"></map><slider-panel><view v-for="item in 20" :key="item"><view class="item">{{ item }}</view></view></slider-panel></view>
</template>
<script>
import SliderPanel from '@/components/sliderPanel'
export default {components: {SliderPanel},data() {return {}},methods: {}
}
</script><style lang="scss">
page {height: 100%;width: 100%;
}
</style><style scoped lang="scss">
.container {position: relative;height: 100%;width: 100%;overflow: hidden;.item {display: flex;align-items: center;justify-content: center;border-bottom: 1px solid #ccc;height: 80rpx;}
}
</style>

总结

通过 Uniapp 开发滑动面板组件,可以有效实现跨平台兼容。核心在于:
正确处理触摸事件流
合理使用 CSS 动画
精确控制滑动边界
做好性能优化

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

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

相关文章

【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(12)

1.问题描述&#xff1a; pushdeviceid的长度是固定的吗&#xff1f; 解决方案&#xff1a; 在鸿蒙系统中&#xff0c;设备ID的长度是固定的。 2.问题描述&#xff1a; 通过REST API三方推送IM类消息&#xff0c;如何实现应用处于前台时不展示三方推送通知。 解决方案&…

【小兔鲜】day02 Pinia、项目起步、Layout

【小兔鲜】day02 Pinia、项目起步、Layout 1. Pinia2. 添加Pinia到Vue项目3. 案例&#xff1a;Pinia-counter基础使用3.1 Store 是什么&#xff1f;3.2 应该在什么时候使用 Store? 4. Pinia-getters和异步action4.1 getters4.2 action如何实现异步 1. Pinia Pinia 是 Vue 的专…

Android学习之计算器app(java + 详细注释 + 源码)

运行结果&#xff1a; 基础的四则运算&#xff1a; 可能会出现的问题以及解决方法&#xff1a; 问题1&#xff1a;出现多个操作符。 例子&#xff1a;12 解决方法&#xff1a; 在用户点击操作符之后&#xff0c;去检查之前的最后一位&#xff0c;如果最后一位也是操作符的话…

GMap.NET + WPF:构建高性能 ADS-B 航空器追踪平台

ADS-B 简介 ADS - B&#xff08;Automatic Dependent Surveillance - Broadcast&#xff0c;广播式自动相关监视&#xff09;是一种先进的航空监视技术。它依靠飞机上的机载设备&#xff0c;自动收集诸如飞机的位置、高度、速度、航向等关键数据&#xff0c;并周期性地以广播的…

关于testng.xml无法找到类的问题

问题&#xff1a;testng.xml添加测试类的时候飘红 解决办法&#xff1a; 1.试图通过自动生成testng.xml插件去解决&#xff0c;感觉也不是这个问题&#xff0c;没有尝试&#xff1b; 2.以为是创建包的方式不对&#xff0c;重新删除后新建--还是找不到 想新建类的时候发现从m…

数据在内存中存储(C语言)

文章目录 前言一、整数在内存中的存储1.1 计算机存储数据的基本单位示例代码 1.2 无符号整数的存储1.3 有符号整数的存储&#xff08;补码&#xff09;示例代码 二、大小端字节序和字节序判断2.1 什么是大小端&#xff1f;示例代码 2.2 为什么会有大小端&#xff1f;2.3 字节序…

Python爬虫第2节-网页基础和爬虫基本原理

目录 一、网页基础 1.1 网页的组成 1.2 网页的结构 1.3 节点树及节点间的关系 1.4 选择器 二、爬虫的基本原理 2.1 爬虫概述 2.2 能抓怎样的数据 2.3 JavaScript 渲染页面 一、网页基础 使用浏览器访问网站时&#xff0c;我们会看到各式各样的页面。你是否思考过&…

python-leetcode 64.在排序数组中查找元素的第一个和最后一个位置

题目&#xff1a; 给一个按照非递减顺序排列的整数数组nums,和一个目标值target,请找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值target,返回[-1,-1] 方法一&#xff1a;二分查找 直观的思路肯定是从前往后遍历一遍。用两个变量记录第一次和最后一次…

分享一些新版GPT-4o使用方式!能多模态生图!

目前GPT-4o的整体测评&#xff0c;真的很惊艳。 不知道又有多少人因为OpenAI的这次更新而失业&#xff0c;当然只要AI用得好&#xff0c;会有更多人因之而受益&#xff01;很多人表示不知道怎么用&#xff0c;对于门外汉来说&#xff0c;4o似乎有点高端。 今天就给大家介绍几…

软件工程面试题(二十四)

1、连接池的原理 j2ee 服务器启动时会建立一定数量的池连接,并一直维持不少于此数量的池连接。当客户端程序需要连接时,吃驱动程序会返回一个未使用的池连接并将其标记为忙。如果当前 没有空闲连接,池驱动就建立一定新的 连接 2、用javascript编写脚本小程序,实现点击全选…

Android:Dialog的使用详解

Android中Dialog的使用详解 Dialog&#xff08;对话框&#xff09;是Android中常用的UI组件&#xff0c;用于临时显示重要信息或获取用户输入。 1. 基本Dialog类型 1.1 AlertDialog&#xff08;警告对话框&#xff09; 最常用的对话框类型&#xff0c;可以设置标题、消息、…

arinc818 fpga单色图像传输ip

arinc818协议支持的常用线速率如下图 随着图像分辨率的提高&#xff0c;单lane的速率无法满足特定需求&#xff0c;一种方式是通过多个LANE交叉的去传输图像&#xff0c;另外一种是通过降低图像的带宽&#xff0c;即通过只传单色图像达到对应的效果 程序架构如下图所示&#x…

透视投影(Perspective projection)与等距圆柱投影(Equirectangular projection)

一、透视投影 1.方法概述 Perspective projection&#xff08;透视投影&#xff09;是一种模拟人眼观察三维空间物体时的视觉效果的投影方法。它通过模拟观察者从一个特定视点观察三维场景的方式来创建二维图像。在透视投影中&#xff0c;远处的物体看起来比近处的物体小&…

三.微服务架构中的精妙设计:服务注册/服务发现-Eureka

一.使用注册中心背景 1.1服务远程调用问题 服务之间远程调⽤时, 我们的URL是写死的 String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 缺点&#xff1a; 当更换机器, 或者新增机器时, 这个URL就需要跟着变更, 就需要去通知所有的相关服…

FPGA实现4K MIPI视频解码H265压缩网络推流输出,基于IMX317+VCU架构,支持4K60帧,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的 MIPI 编解码方案我这里已有的视频图像编解码方案 3、详细设计方案设计框图FPGA开发板IMX317摄像头MIPI D-PHYMIPI CSI-2 RX Subsystem图像预处理Sensor …

Ollama+open-webui搭建私有本地大模型详细教程

Ollamaopen-webui搭建私有本地大模型详细教程 1. 什么是 Ollama&#xff1f; 1.1. Ollama 简介 ​ Ollama 是一个轻量级的 AI 模型运行时&#xff0c;专注于简化 AI 模型的部署和使用。它支持多种预训练模型&#xff08;如 Llama、Vicuna、Dolly 等&#xff09;&#xff0c;…

解决Centos7集成IDEA报git版本太低问题

Centos 7 服务器上默认安装的 Git 是 1.8.3.1 版本的 与最新的IDEA已无法匹配&#xff0c;需要更新 首先&#xff0c;卸载老版本 sudo yum -y remove git sudo yum -y remove git-*添加 End Point 到 CentOS 7 仓库 sudo yum -y install https://packages.endpointdev.com/r…

Qt常用宏定义判断大全

Qt 提供了一系列预定义宏用于判断 Qt 版本、操作系统平台、编译器特性等。这些宏在跨平台开发中非常有用。 1. Qt 版本判断宏 // 检查Qt版本 #if QT_VERSION > QT_VERSION_CHECK(5, 15, 0)// Qt 5.15.0及以上版本特有代码 #endif// 常用版本判断 #if QT_VERSION > QT_V…

实战 | 餐厅点餐小程序技术解析:SpringBoot + UniApp 高效开发指南

&#x1f5a5;️ 一、系统架构概览 1.1 技术选型 为了确保开发效率和系统稳定性&#xff0c;我们采用以下技术栈&#xff1a; 模块技术选型后台服务SpringBoot MyBatis-Plus MySQL用户端&#xff08;点餐小程序&#xff09;UniApp&#xff08;Vue 语法&#xff09;师傅端&…

实现在Unity3D中仿真汽车,而且还能使用ros2控制

文章目录 前言&#xff08;Introduction&#xff09;搭建开发环境&#xff08;Setup Development Environment&#xff09;在window中安装Unity&#xff08;Install Unity in window&#xff09;创建Docker容器&#xff0c;并安装相关软件&#xff08;Create Docker containers…