VUE实现拖拽功能

VUE实现拖拽功能

 <template>
    <div class="error">
        <div id="lucky" 
        @mousedown="down" @touchstart="down"
        @mousemove="move" @touchmove="move"
        @mouseup="end" @touchend="end" @click="click"></div>
    </div>
</template>

<script>
export default {
    name: 'Error',
    data() {
        return {
            flags: false,
            position: { x: 0, y: 0 },
            nx: '',
            ny: '', 
            dx: '', 
            dy: '', 
            xPum: '', 
            yPum: '',
        }
    },
    methods: {
        // 实现移动端拖拽
        down(){
            var moveDiv = document.getElementById('lucky')
            this.flags = true;
            var touch;
            if(event.touches){
                touch = event.touches[0];
            }else {
                touch = event;
            }
            this.position.x = touch.clientX;
            this.position.y = touch.clientY;
            this.dx = moveDiv.offsetLeft;
            this.dy = moveDiv.offsetTop;
        },
        move(){
            var moveDiv = document.getElementById('lucky')
            if(this.flags){
            var touch ;
            if(event.touches){
                touch = event.touches[0];
            }else {
                touch = event;
            }
            this.nx = touch.clientX - this.position.x;
            this.ny = touch.clientY - this.position.y;
            this.xPum = this.dx+this.nx;
            this.yPum = this.dy+this.ny;
            moveDiv.style.left = this.xPum+"px";
            moveDiv.style.top = this.yPum +"px";
            //阻止页面的滑动默认事件;如果碰到滑动问题,1.2 请注意是否获取到 touchmove
                event.preventDefault();
            }
        },
        //鼠标释放时候的函数
        end(){
            this.flags = false;
            // 鼠标释放的时候从这里判断块是否被拖到窗口外变成负值,从而进行恢复
        },
        click() {
            console.log('click')
        }
    }
}
</script>

<style lang="scss" scoped>
.error {
    #lucky {
        width: 100px;
        height: 100px;
        background: red;
        position: fixed;
        top: 6rem;
        right: 0;
        z-index: 20070;
    }
}
</style>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue实现卡片拖拽功能可以使用vue-grid-layout插件,它是一个基于Gridster.js封装的Vue组件,支持拖拽、排序、缩放等功能。下面是一个简单的示例: 1. 安装vue-grid-layout插件: ``` npm install vue-grid-layout --save ``` 2. 在Vue组件中引入并注册vue-grid-layout组件: ``` <template> <div> <vue-grid-layout :layout="layout" :col-num="12" :row-height="30" :is-draggable="true" :is-resizable="true" :vertical-compact="false" :margin="[10, 10]"> <div v-for="item in items" :key="item.id" :data-grid="{x: item.x, y: item.y, w: item.w, h: item.h}"> <div class="card">{{ item.text }}</div> </div> </vue-grid-layout> </div> </template> <script> import VueGridLayout from 'vue-grid-layout' export default { components: { VueGridLayout }, data() { return { layout: [ { x: 0, y: 0, w: 4, h: 2 }, { x: 4, y: 0, w: 4, h: 2 }, { x: 8, y: 0, w: 4, h: 2 }, { x: 0, y: 2, w: 4, h: 2 }, { x: 4, y: 2, w: 4, h: 2 }, { x: 8, y: 2, w: 4, h: 2 }, { x: 0, y: 4, w: 4, h: 2 }, { x: 4, y: 4, w: 4, h: 2 }, { x: 8, y: 4, w: 4, h: 2 } ], items: [ { id: 1, text: 'Card 1', x: 0, y: 0, w: 4, h: 2 }, { id: 2, text: 'Card 2', x: 4, y: 0, w: 4, h: 2 }, { id: 3, text: 'Card 3', x: 8, y: 0, w: 4, h: 2 }, { id: 4, text: 'Card 4', x: 0, y: 2, w: 4, h: 2 }, { id: 5, text: 'Card 5', x: 4, y: 2, w: 4, h: 2 }, { id: 6, text: 'Card 6', x: 8, y: 2, w: 4, h: 2 }, { id: 7, text: 'Card 7', x: 0, y: 4, w: 4, h: 2 }, { id: 8, text: 'Card 8', x: 4, y: 4, w: 4, h: 2 }, { id: 9, text: 'Card 9', x: 8, y: 4, w: 4, h: 2 } ] } } } </script> <style> .card { background-color: #eee; padding: 10px; } </style> ``` 3. 在Vue组件中使用vue-grid-layout组件,并设置相关属性和回调函数。 其中,`layout`为卡片的布局数据,`items`为卡片数据,可以设置卡片的大小、位置、内容等。`col-num`为列数,`row-height`为行高,`is-draggable`和`is-resizable`分别为是否可拖拽和缩放,`vertical-compact`为是否自动间隙调整,`margin`为卡片之间的间距。 通过以上步骤,就可以在Vue实现卡片拖拽功能了。如果需要更多定制化的功能,可以参考vue-grid-layout的文档进行配置。 ### 回答2: Vue.js是一个流行的JavaScript框架,提供了许多便捷的工具和组件,可以帮助我们快速构建交互式的Web应用程序。在Vue实现卡片拖拽功能可以通过使用Vue的指令和事件来实现。 首先,我们可以使用Vue的自定义指令来实现拖拽功能。我们可以创建一个名为`v-draggable`的指令,并在其中添加适当的事件监听器。在指令的`bind`和`update`钩子函数中,我们可以添加`mousedown`、`mousemove`和`mouseup`事件的监听器来跟踪鼠标的位置,并计算卡片的偏移量。在`bind`钩子函数中,我们还可以将卡片的初始位置保存起来,以便在拖拽结束时进行处理。 接下来,我们可以在需要拖拽功能的卡片元素上添加`v-draggable`指令,并传入相应的参数。例如,我们可以将卡片的位置信息传递给指令,使其知道卡片应该在哪个位置进行拖拽。这可以通过在指令的`bind`钩子函数中将卡片的位置信息保存到指令实例的属性中来实现。 最后,我们还可以在指令中添加一些逻辑,以处理拖拽结束时的操作。例如,我们可以在`mouseup`事件的监听器中更新卡片的位置信息,并触发相应的事件来通知其他组件或监听器。 通过以上步骤,我们可以在Vue实现卡片拖拽功能。并且,由于Vue的响应式系统,我们可以很方便地更新卡片的位置信息,并对其进行相应的处理。这使得卡片拖拽功能更加灵活和易于扩展。 ### 回答3: Vue实现卡片拖拽功能可以通过Vue的事件绑定和动态样式来实现。以下是一个简单的示例代码: 首先,在Vue的data中定义一个卡片对象数组,包含每个卡片的位置信息,如left和top: ```javascript data() { return { cards: [ { id: 1, left: 0, top: 0 }, { id: 2, left: 100, top: 0 }, { id: 3, left: 200, top: 0 } ], draggingCardId: null, offsetX: 0, offsetY: 0 }; }, ``` 然后,通过v-for指令渲染卡片列表,并为每个卡片绑定mousedown、mousemove、mouseup事件: ```html <div id="app"> <div class="card" v-for="card in cards" :key="card.id" :style="{ left: card.left + 'px', top: card.top + 'px' }" @mousedown="startDragging(card.id, $event)"> Card {{ card.id }} </div> </div> ``` 在methods中,定义startDragging方法用于设置拖拽起点和拖拽的卡片ID,还有onDrag和stopDragging方法用于设置卡片位置和清空拖拽信息: ```javascript methods: { startDragging(cardId, event) { this.draggingCardId = cardId; this.offsetX = event.clientX - this.cards[cardId - 1].left; this.offsetY = event.clientY - this.cards[cardId - 1].top; document.addEventListener('mousemove', this.onDrag); document.addEventListener('mouseup', this.stopDragging); }, onDrag(event) { if (this.draggingCardId !== null) { this.cards[this.draggingCardId - 1].left = event.clientX - this.offsetX; this.cards[this.draggingCardId - 1].top = event.clientY - this.offsetY; } }, stopDragging() { this.draggingCardId = null; document.removeEventListener('mousemove', this.onDrag); document.removeEventListener('mouseup', this.stopDragging); } } ``` 通过上述代码,我们就可以实现拖拽卡片的功能。当鼠标按下时,调用startDragging方法设置起点和卡片ID,然后在mousemove事件中通过onDrag方法不断更新卡片的位置,当鼠标释放时,调用stopDragging方法将拖拽信息清空。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值