uniapp移动端实现触摸滑动功能:上下滑动展开收起内容,左右滑动删除列表

uni-app移动端实现触摸滑动功能:展开收起、滑动删除;根据X轴或者Y轴的坐标,计算差值,当差值超出设置的滑动阈值(自定义大小),执行所需要的功能。

一、滑动展开收起内容

实现:弹出框默认展示部分内容,手触摸当前内容,向上滑动显示全部内容,向下滑动收起页面展示默认的内容;

html 复制代码
<template>
	<u-popup class="custom-popup" :show="showPopup" mode="bottom" :mask-close-able="true" :closeable="true"
		:overlay="false" customStyle="border-radius: 30rpx 30rpx 0rpx 0rpx;" zIndex="1001" bgColor="transparent"
		@close="closePopup">
		<!-- 弹出内容 -->
		<view class="popup-container" @touchstart="handleTouchStart" @touchmove="handleTouchMove"
			@touchend="handleTouchEnd">
			<view class="device-top flex">
				<!-- 默认显示内容 -->
			</view>
			<view class="device-other" :class="{ 'show-all': isExpanded }">
				<!-- 展开内容 -->
			</view>
		</view>
	</u-popup>
</template>
javascript 复制代码
<script>
	export default {
		name: "UsbBlue",
		props: {
			showPopup: {
				type: Boolean,
				default: false
			},
			deviceData: {
				type: Object,
				default: null
			},
		},
		data() {
			return {
				isExpanded: false,
				isDragging: false,
				startY: 0,
			};
		},
		mounted() {},
		methods: {
			handleTouchStart(event) {
				this.isDragging = true;
				this.startY = event.touches[0].clientY; // 记录开始时的Y坐标
			},
			handleTouchMove(event) {
				if (!this.isDragging) return;
				const currentY = event.touches[0].clientY; // 当前触摸的Y坐标
				const diffY = this.startY - currentY; // 计算Y方向的移动距离(正值表示向下拖动,负值表示向上拖动)
				console.log(diffY);
				if (diffY > 10 && !this.isExpanded) { // 向上滑动时展开
					this.isExpanded = true;
					this.isDragging = false;
				} else if (diffY < -20 && this.isExpanded) { // 向下滑动时收起
					this.isExpanded = false;
					this.isDragging = false;
				} else if (diffY < -50) { // 大幅向下滑动时关闭弹窗
					this.closePopup();
					this.isDragging = false;
				}
			},
			handleTouchEnd() {},
			closePopup() {
				this.$emit("closePopup")
			}
		}
	}
</script>
css 复制代码
<style lang="scss" scoped>
	.popup-container {
		.device-other {
			transition: max-height 0.3s ease;
			max-height: 0rpx; /* 初始高度 */

			&.show-all {
				max-height: 700rpx; /* 展开时高度 */
			}
		}
	}
</style>

二、左右滑动清除列表

实现:手触摸列表,左右滑动清除当前列表;

html 复制代码
<template>
	<view class="device-tips">
		<view class="device-tips-item flex" v-for="(item,index) in deviceList" :key="index"
			@touchstart="(e) => handleTouchStart(e, index)" @touchmove="(e) => handleTouchMove(e, index)"
			@touchend="(e) => handleTouchEnd(e, index)">
			<!-- 列表内容 -->
		</view>
	</view>
</template>
javascript 复制代码
<script>
	export default {
		data() {
			return {
				deviceList: [{
					name: "设备名称",
					id: "H9K018008Y",
					count: 2,
				}, {
					name: "Unknow",
					id: "9012008Y",
					count: 5,
				}],
				startX: 0,
				currentIndex: -1,
			}
		},
		mounted() {},
		methods: {
			// 删除数据
			deleteData() {
				this.deviceList.splice(this.currentIndex, 1)
				// 删除后清理触摸状态
				this.currentIndex = null;
			},
			// 开始触摸
			handleTouchStart(event, index) {
				event.preventDefault();
				event.stopPropagation();
				this.startX = event.touches[0].clientX;
				this.currentIndex = index;
			},
			// 滑动中
			handleTouchMove(event, index) {
				const currentX = event.touches[0].clientX;
				const diffX = this.startX - currentX;
				// 左右滑动清除
				if (diffX > 200 || diffX < -200) {
					console.log(index, diffX, this.currentIndex);
					if (index === this.currentIndex) {
						this.deleteData(this.currentIndex);
						// 删除后清理触摸状态,防止重复触发
						this.startX = null;
					}
				}
			},

			handleTouchEnd(event, index) {},
		}
	}
</script>
相关推荐
蒲公英源码2 小时前
uniapp开源ERP多仓库管理系统
mysql·elementui·uni-app·php
shykevin2 小时前
uni-app x开发商城系统,小程序发布,h5发布,安卓打包
android·小程序·uni-app
且白2 小时前
uniapp接入安卓端极光推送离线打包
android·uni-app
Ayn慢慢2 小时前
uni-app PDA焦点录入实现
前端·javascript·uni-app
一位搞嵌入式的 genius2 小时前
微前端架构:JavaScript 隔离方案全解析(含 CSS 隔离)概要
前端·css·前端实战
4_0_42 小时前
一步一步实现 Shader 水波纹效果(入门到进阶)
前端·three.js
lemonboy2 小时前
可视化大屏适配方案:用 Tailwind CSS 直接写设计稿像素值
前端·vue.js
鹏仔工作室2 小时前
vue中实现1小时不操作则退出登录功能
前端·javascript·vue.js
海云前端12 小时前
前端必备 Nginx 实战指南 8 个核心场景直接抄
前端