uniapp自定义拖拽排列

uniapp自定义拖拽排列并改变下标

javascript 复制代码
<!-- 页面模板 -->
<template>
	<view class="container">
		<view v-for="(item, index) in list" :key="item.id" class="drag-item" :style="{
        transform: `translate(${activeIndex === index ? offsetX : 0}px, ${activeIndex === index ? offsetY : 0}px)`,
        transition: activeIndex === index ? 'none' : 'transform 0.3s',
        zIndex: activeIndex === index ? 999 : 1,
        boxShadow: activeIndex === index ? '0 8px 20px rgba(0,0,0,0.2)' : '0 2px 6px rgba(0,0,0,0.1)'
      }" @touchstart="handleTouchStart(index, $event)" @touchmove="handleTouchMove(index, $event)"
			@touchend="handleTouchEnd">
			{{ item.content }}
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				list: [
				{ id: 1, content: 'Item 1' },
				{ id: 2, content: 'Item 2' },
				{ id: 3, content: 'Item 3' },
				{ id: 4, content: 'Item 4' },
				{ id: 5, content: 'Item 5' },
				{ id: 6, content: 'Item 6' },
				{ id: 7, content: 'Item 7' },
				{ id: 8, content: 'Item 8' },
				{ id: 9, content: 'Item 9' },
				{ id: 10, content: 'Item 10' },
				{ id: 11, content: 'Item 11' },
				{ id: 12, content: 'Item 12' },
				{ id: 13, content: 'Item 13' },
				{ id: 14, content: 'Item 14' },
				], 
				activeIndex: -1, // 当前激活元素索引
				startX: 0, // 触摸起始X坐标
				startY: 0, // 触摸起始Y坐标
				offsetX: 0, // X轴偏移量
				offsetY: 0, // Y轴偏移量
				positions: [] // 元素位置缓存数组:ml-citation{ref="1,3" data="citationList"}
			}
		},
		mounted() {
			// this.initPositions()
		},
		methods: {
			// 初始化元素位置信息:ml-citation{ref="3,5" data="citationList"}
			initPositions() {
				uni.createSelectorQuery().in(this).selectAll('.drag-item')
					.boundingClientRect(rects => {
						this.positions = rects.map(rect => ({
							left: rect.left,
							top: rect.top,
							width: rect.width,
							height: rect.height
						}))
					}).exec()
			},

			// 触摸开始事件:ml-citation{ref="2,7" data="citationList"}
			handleTouchStart(index, e) {
				this.activeIndex = index
				this.startX = e.touches[0].clientX
				this.startY = e.touches[0].clientY
				this.initPositions()
			},

			// 触摸移动事件:ml-citation{ref="4,8" data="citationList"}
			handleTouchMove(index, e) {
				if (index !== this.activeIndex) return

				const currentX = e.touches[0].clientX
				const currentY = e.touches[0].clientY
				this.offsetX = currentX - this.startX
				this.offsetY = currentY - this.startY

				// 查找目标位置:ml-citation{ref="1,6" data="citationList"}
				const targetIndex = this.findTargetIndex(currentX, currentY)
				if (targetIndex !== -1 && targetIndex !== this.activeIndex) {
					this.swapElements(this.activeIndex, targetIndex)
					this.activeIndex = targetIndex
					this.startX = currentX
					this.startY = currentY
					this.offsetX = 0
					this.offsetY = 0
				}
			},

			// 查找目标插入位置:ml-citation{ref="5,6" data="citationList"}
			findTargetIndex(x, y) {
				for (let i = 0; i < this.positions.length; i++) {
					const pos = this.positions[i]
					if (x > pos.left && x < pos.left + pos.width &&
						y > pos.top && y < pos.top + pos.height) {
						return i
					}
				}
				return -1
			},

			// 交换数组元素:ml-citation{ref="2,7" data="citationList"}
			swapElements(oldIndex, newIndex) {
				const temp = [...this.list]
				const movedItem = temp.splice(oldIndex, 1)[0]
				temp.splice(newIndex, 0, movedItem)
				this.list = temp
				this.$nextTick(() => this.initPositions())
			},

			// 触摸结束事件:ml-citation{ref="4,8" data="citationList"}
			handleTouchEnd() {
				this.activeIndex = -1
				this.offsetX = 0
				this.offsetY = 0
			}
		}
	}
</script>

<style>
	.container {
		padding: 10px;
		overflow: hidden;
		/* 处理浮动元素换行 */
	}

	.drag-item {
		float: left;
		width: 160px;
		height: 80px;
		margin: 8px;
		background: #fff;
		border-radius: 12px;
		display: flex;
		align-items: center;
		justify-content: center;
		transition: all 0.3s;
		user-select: none;
	}
</style>
相关推荐
sunbyte2 小时前
Tailwind CSS 初学者入门指南:项目集成,主要变更内容!
前端·css
可爱的秋秋啊3 小时前
vue3,element ui框架中为el-table表格实现自动滚动,并实现表头汇总数据
前端·vue.js·笔记·elementui
良艺呐^O^3 小时前
uniapp实现app自动更新
开发语言·javascript·uni-app
IT瘾君5 小时前
JavaWeb:Html&Css
前端·html
264玫瑰资源库5 小时前
问道数码兽 怀旧剧情回合手游源码搭建教程(反查重优化版)
java·开发语言·前端·游戏
喝拿铁写前端5 小时前
从圣经Babel到现代编译器:没开玩笑,普通程序员也能写出自己的编译器!
前端·架构·前端框架
HED6 小时前
VUE项目发版后用户访问的仍然是旧页面?原因和解决方案都在这啦!
前端·vue.js
拉不动的猪6 小时前
前端自做埋点,我们应该要注意的几个问题
前端·javascript·面试
王景程6 小时前
如何测试短信接口
java·服务器·前端