vue 实现页面div盒子拖拽排序功能

本文介绍了如何利用CSS3的transition-group在Vue中实现拖拽排序功能。通过在DOM中设置transition-group,结合data和methods中的拖拽事件处理,以及特定的拖拽完成动画样式,实现了元素的平滑移动效果。最后,文章提供了相关的资源链接供进一步学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:目前市面上有很多实现拖拽排序功能的插件和方法,本节不过多累述,只讲一种:css3transition-group方法

效果图:

 1. DOM中使用:

    <transition-group class="container" name="sort">
        <div class="app-item" v-for="app in customApps" :key="app.id" :draggable="true"
            @dragstart="dragstart(app)"
            @dragenter="dragenter(app,$event)"
            @dragend="getDragend(customApps, 'customer', $event)">
            <div>
                <img class="icon_a" v-if="app.logo" :src="app.logo" >
                <div class="ellipsis" >{{app.name}}</div>
            </div>
        </div>
    </transition-group>

2. data中定义数据

    import { APi } from '@/api/enterpriseAPi'
    <script>
        export default {
            data() {
                return {
                    oldData: [],
                    newData: [],
                    customApps: [],
                    dragStartId: '',
                    dragEndId: ''
                }
            }
        }
    </script>

3. methods方法中使用

    dragstart(value) {
        this.oldData = value
        this.dragStartId = value.id
    },
    dragenter(value) {
        this.newData = value
        this.dragEndId = value.id
    },
    getDragend(listData, type) {
            if (this.oldData !== this.newData) {
                let oldIndex = listData.indexOf(this.oldData)
                let newIndex = listData.indexOf(this.newData)
                let newItems = [...listData]
                // 删除之前DOM节点
                newItems.splice(oldIndex, 1)
                // 在拖拽结束目标位置增加新的DOM节点
                newItems.splice(newIndex, 0, this.oldData)
                // 每次拖拽结束后,将拖拽处理完成的数据,赋值原数组,使DOM视图更新,页面显示拖拽动画
                this.customApps = newItems
                // 每次拖拽结束后调用接口时时保存数据
               Api(this.dragStartId, this.dragEndId).then((res) => {})
            }
        }

4. 拖拽完成动画样式

    <style lang="scss" scoped>
        .sort-move {
            transition: transform 1s;
        }
    </style>

更多资源:掘金

end...

 

你可以使用`vue-draggable-resizable`插件来实现一个类似网格布局的拖拽排序效果。首先,确保你已经在项目中安装了该插件。 接下来,你可以按照以下步骤实现你的需求: 1. 创建一个父容器,设置其为flex布局,并且设置`flex-wrap: wrap`以支持换行。 ```html <div class="grid-container"> <!-- 子元素 --> </div> ``` 2. 在父容器中循环渲染子元素,每个子元素都是一个正方形盒子。 ```html <div class="grid-container"> <div v-for="(item, index) in items" :key="index" class="grid-item"> <!-- 子元素内容 --> </div> </div> ``` 3. 使用`vue-draggable-resizable`插件将子元素变为可拖拽和可调整大小的元素。你可以在`mounted`钩子中初始化插件。 ```javascript import VueDraggableResizable from 'vue-draggable-resizable' export default { components: { VueDraggableResizable }, data() { return { items: [ // 子元素数据 ] } }, mounted() { // 初始化 vue-draggable-resizable 插件 VueDraggableResizable.mount(this.$refs.container) } } ``` 4. 在子元素的模板中使用`vue-draggable-resizable`组件,并设置合适的属性。 ```html <div class="grid-container" ref="container"> <vue-draggable-resizable v-for="(item, index) in items" :key="index" :w="100" :h="100" :x="item.x" :y="item.y" :isDraggable="true" :isResizable="true" @dragStop="onDragStop(index, $event)" @resizeStop="onResizeStop(index, $event)" > <!-- 子元素内容 --> </vue-draggable-resizable> </div> ``` 5. 在组件中添加对应的事件处理方法,用于更新子元素的位置和大小。 ```javascript export default { // ... methods: { onDragStop(index, event) { // 更新子元素的位置 this.items[index].x = event.x this.items[index].y = event.y }, onResizeStop(index, event) { // 更新子元素的大小 this.items[index].w = event.width this.items[index].h = event.height } } } ``` 通过以上步骤,你可以实现一个基于`vue-draggable-resizable`插件的flex布局类似网格的拖拽排序效果,其中子元素为正方形盒子。记得根据你的需求,调整样式和属性值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值