uniapp怎么实现多张图片拖拽。每个图片底下有个描述,描述位置不动,只有图片进行拖拽移动排序归位到正确的描述位置,类似于要上传多个汽车方位图,上传完成后根据描述把多张图片放在描述相对应的位置 并写下示例代码
时间: 2024-03-08 21:49:53 浏览: 114
好的,以下是一个简单的示例代码:
HTML部分:
```html
<template>
<view class="wrapper">
<view class="item" v-for="(image, index) in images" :key="index">
<image class="image" :src="image.src" @tap="handleTap(index)" draggable="true" drag-id="image" />
<view class="description" @dragover="handleDragOver(index)">{{ image.description }}</view>
</view>
</view>
</template>
```
CSS部分:
```css
.wrapper {
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: center;
height: 100%;
}
.item {
display: flex;
flex-direction: column;
align-items: center;
margin: 20rpx;
}
.image {
width: 150rpx;
height: 100rpx;
}
.description {
width: 150rpx;
height: 40rpx;
background-color: #f0f0f0;
text-align: center;
font-size: 28rpx;
line-height: 40rpx;
overflow: hidden;
}
```
JavaScript部分:
```javascript
<script>
export default {
data() {
return {
images: [
{
src: '/static/images/1.jpg',
description: '前视图'
},
{
src: '/static/images/2.jpg',
description: '后视图'
},
{
src: '/static/images/3.jpg',
description: '左侧视图'
},
{
src: '/static/images/4.jpg',
description: '右侧视图'
}
]
}
},
methods: {
handleTap(index) {
console.log('tap image', index)
},
handleDragOver(targetIndex) {
uni.getSystemInfo({
success: res => {
const { windowWidth } = res
const itemWidth = 190
const rowItemCount = Math.floor(windowWidth / itemWidth)
const rowIndex = Math.floor(targetIndex / rowItemCount)
const rowStartIndex = rowIndex * rowItemCount
const rowEndIndex = rowStartIndex + rowItemCount - 1
const draggedImageIndex = this.getDraggedImageIndex()
if (draggedImageIndex >= 0 && draggedImageIndex !== targetIndex && targetIndex >= rowStartIndex && targetIndex <= rowEndIndex) {
const direction = draggedImageIndex < targetIndex ? 1 : -1
let newImages = this.images.slice()
for (let i = draggedImageIndex; i !== targetIndex; i += direction) {
newImages[i] = this.images[i + direction]
}
newImages[targetIndex] = this.images[draggedImageIndex]
this.images = newImages
}
}
})
},
getDraggedImageIndex() {
const dragInfo = uni.getStorageSync('drag_info') || {}
if (dragInfo.dragging === true) {
return this.images.findIndex(image => image === dragInfo.image)
}
return -1
}
}
}
</script>
```
这个示例代码中,我们使用了flex布局,把图片和描述元素放在同一行。图片使用了uni-dragger组件,可以拖拽移动。描述元素在拖拽过程中不动,只用来作为拖拽目标的判断。
在drag-over事件中,我们根据目标元素的位置信息来计算出应该把拖拽的图片放到哪个位置,并且调整图片的位置。需要注意的是,我们在拖拽过程中需要判断拖拽元素和目标元素的位置关系,以确保图片可以正确归位。
另外,在handleTap方法中,我们可以监听图片的点击事件,做一些响应。
希望这个示例代码能够帮助到你。
阅读全文