前端如何实现拖拽?附组件

拖拽组件需求

在开发过程中遇到的需求:要求拖拽改变元素的大小和位置,主要是用于可视化大屏的创建,考虑到项目的二次开发以及后续,作者决定自己开发一个拖拽组件,供项目使用。(此组件是vue3版本,如果需要vue2版本文章底部也有连接)
组件名称:gaius-utilsgithub地址

拖拽位置部分(只提供了主要的逻辑)

这部分主要是通过监听mousedown、mousemove、mouseup事件,获取鼠标按下及鼠标弹起的事件信息来获取鼠标移动的距离,根据下图的示意图可知:鼠标移动的距离和dom元素要移动的距离是相同的,接下来只需要获得到鼠标的移动的距离然后和dom初始位置在X、Y轴上进行加减计算便可以得到dom的新位置坐标。
计算公式
公式说明
鼠标按下后 鼠标相当于当前dom的位置应该是不变的(dom随着鼠标移动),所以disX,disY的值就是固定的,mousemove移动过程中的鼠标位置在变更,dom位置X,Y应该也是随之变化。他们之前总是差着disX、disY的距离即可。
当鼠标弹起时注销事件即可。

示意图
代码部分如下

let { left: curX, top: curY } = transformToValue() //通过函数获取当前dom的X\Y的位置
let disX = e.clientX - parseFloat(curX) // 鼠标按下时的位置和dom之前X轴的差距 
let disY = e.clientY - parseFloat(curY)// 鼠标按下时的位置和dom之间Y轴的差距 
document.onmousemove = function (e) {
            let x = e.clientX - disX // 鼠标移动后的位置 - X差距 就是现在domX的位置
            let y = e.clientY - disY //鼠标移动后的位置 - Y差距 就是现在domY的位置
            dragResize.value.style.transform = `translate3d(${x}px, ${y}px,0)`
        }
document.onmouseup = function () {
            document.onmousemove = null
            document.onmouseup = null     
        }

(完整代码可以在上面的github地址查阅)

拖拽改变大小部分

同上述,鼠标移动的距离即是dom变更前后的宽高的差值。不多说上代码。

		const height = dragResize.value.clientHeight
        const width = dragResize.value.clientWidth
        const startX = event.clientX
        const startY = event.clientY
        const move = (moveEvent:MouseEvent) => {
            const currX = moveEvent.clientX
            const currY = moveEvent.clientY
            const disY = currY - startY
            const disX = currX - startX
            const newHeight = (height + disY) > minh.value 
                ? (height + disY) 
                : minh.value
            const newWidth = (width + disX) > minw.value 
                ? (width + disX) 
                : minw.value
            dragResize.value.style.width = newWidth + 'px'
            dragResize.value.style.height = newHeight + 'px'
        }

        const up = () => {
            document.removeEventListener('mousemove', move)
            document.removeEventListener('mouseup', up)
        }

除此之外也有以下几点需要考虑

  1. 组件拖拽移动的性能问题。

直接修改dom的left、top会引发重排消耗的性能相较于重绘大,所以最后采用translate只重绘又因为translate3d 会使用显卡计算减少卡顿效果,本组件中使用的是translate3d。

  1. 组件超出父组件的大小范围、移动范围。

本组件在实际代码中考虑到这一点会通过比较父级dom的大小以及计算位置关系保证不会超出父组件。

  1. vue2项目怎么用(较长时间未更新)

在开发过程中同时开发了vue2的版本不过较长时间未更新。
组件名称(ray-drag-resize-v2)npm地址github地址

上述的组件在对应的npm地址都有使用说明,这里就不在详细说明,如有使用问题可以github提issue或者csdn留言即可。

  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端拖拽组件生成页面是一种通过拖拽组件来生成动态页面的方法。这种方法可以帮助开发者快速搭建页面,提高开发效率。在实际应用中,可以使用一些第三方插件来实现这个功能,比如vuedraggable。 vuedraggable是一个Vue.js的插件,它提供了一种简单的方实现拖拽组件。你可以通过拖拽组件来生成页面。具体的实现步骤如下: 1. 首先,在你的项目中引入vuedraggable插件。你可以通过在项目中引入draggable组件来使用该插件。 2. 然后,根据你的需求,结合相关的文档和示例代码,来进行开发。你可以根据自己的需求来定义拖拽组件的样、属性和行为。 3. 接下来,你可以将需要拖拽组件放置在页面上,并配置好拖拽的规则和交互效果。你可以使用vuedraggable提供的一些API来实现拖拽组件的排序、限制拖拽的范围和处理拖拽事件。 4. 最后,你可以在浏览器中预览生成的动态页面,通过拖拽组件实现页面的交互和布局调整。你可以根据需要对拖拽组件进行修改和优化,以满足项目的需求。 通过使用前端拖拽组件生成页面的方法,你可以更加灵活和高效地进行页面开发,同时提供了一种可视化的方来搭建页面结构。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [vue使用vuedraggable拖拽组件,进行组件生成](https://blog.csdn.net/m0_59023970/article/details/129798365)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Vue拖拽组件列表实现动态页面配置功能](https://download.csdn.net/download/weixin_38732463/12940620)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值