export default {
bind(el, binding, vnode) {
const dialogHeaderEl = el.querySelector('.el-dialog__header');
const dragDom = el.querySelector('.el-dialog');
dialogHeaderEl.style.cssText += ';cursor:move;';
dragDom.style.cssText += ';top:0px;';
const getStyle = (function () {
if (window.document.currentStyle) {
return (dom, attr) => dom.currentStyle[attr];
} else {
return (dom, attr) => getComputedStyle(dom, false)[attr];
}
})();
dialogHeaderEl.onmousedown = (e) => {
// 鼠标按下时,计算当前元素距离可视区的距离
const disX = e.clientX - dialogHeaderEl.offsetLeft;
const disY = e.clientY - dialogHeaderEl.offsetTop;
const dragDomWidth = dragDom.offsetWidth;
const dragDomHeight = dragDom.offsetHeight;
const screenWidth = document.body.clientWidth;
const screenHeight = document.body.clientHeight;
const minDragDomLeft = dragDom.offsetLeft;
const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth;
const minDragDomTop = dragDom.offsetTop;
const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight;
// 获取到的值带px 正则匹配替换
let styL = getStyle(dragDom, 'left');
let styT = getStyle(dragDom, 'top');
if (styL.includes('%')) {
styL = +document.body.clientWidth * (+styL.replace(/%/g, '') / 100);
styT = +document.body.clientHeight * (+styT.replace(/%/g, '') / 100);
} else {
styL = +styL.replace(/\px/g, '');
styT = +styT.replace(/\px/g, '');
}
document.onmousemove = function (e) {
// 通过事件委托,计算移动距离
let left = e.clientX - disX;
let top = e.clientY - disY;
// 边界处理
if (-left > minDragDomLeft) {
left = -minDragDomLeft;
} else if (left > maxDragDomLeft) {
left = maxDragDomLeft;
}
if (-top > minDragDomTop) {
top = -minDragDomTop;
} else if (top > maxDragDomTop) {
top = maxDragDomTop;
}
// 移动当前元素
dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`;
// 提交onDrag事件
vnode.child.$emit('dragDialog');
document.onmouseup = function () {
document.onmousemove = null;
document.onmouseup = null;
};
};
document.onmouseup = function () {
document.onmousemove = null;
document.onmouseup = null;
};
};
}
};
自定义标签-拖拽功能实现
需积分: 0 62 浏览量
更新于2023-12-25
收藏 1KB RAR 举报
在前端开发中,自定义标签和拖拽功能是两个重要的技术点,它们极大地提升了用户体验和交互性。Element UI 是一个流行的 Vue.js 组件库,它提供了丰富的组件来帮助开发者快速构建用户界面。在这个主题中,我们将深入探讨如何利用 Element UI 实现自定义标签的拖拽功能。
自定义标签(Customized Tags)是一种允许用户创建和管理他们自己的标签的方式,常见于笔记应用、项目管理工具等。实现自定义标签通常涉及以下几个步骤:
1. 创建输入框:用户可以在这里输入新的标签。
2. 添加按钮:用户点击后将输入框中的文本转化为标签。
3. 显示标签:新创建的标签会展示在页面上,可以通过样式设计来优化视觉效果。
4. 删除功能:每个标签应有一个删除按钮,允许用户移除不再需要的标签。
拖拽功能(Drag and Drop)是Web开发中的交互特性,让用户可以通过鼠标或触摸设备移动元素,常用于文件上传、布局调整等场景。在 Element UI 中,我们可以利用它的内置指令(directives)来实现拖拽操作。具体实现分为以下几步:
1. 引入 Element UI 的 Drag directive:在 Vue 组件中导入 `v-drag` 指令,它提供了基本的拖拽功能。
2. 配置拖拽区域:将需要拖拽的元素绑定 `v-drag` 指令,同时可能需要设置数据属性来跟踪元素的状态。
3. 监听拖放事件:通过 Vue 的事件监听器(@dragstart、@dragend 等)来处理拖动过程中的开始、结束、移动等事件。
4. 处理拖放逻辑:在事件回调中,更新数据模型以反映拖放后的状态,比如改变元素的位置或者进行其他业务逻辑处理。
在文件名列表 `directive` 中,我们可以推测这个压缩包可能包含了一个或多个与自定义拖拽功能相关的 Vue 指令实现文件。这些文件可能包含了自定义指令的定义、事件处理函数以及与其他组件的交互逻辑。在实际开发中,你需要将这些指令集成到你的项目中,通过Vue组件的模板语法使用它们。
实现 Element UI 的自定义标签拖拽功能,需要结合 Vue 的组件化思想,利用 Element UI 的指令系统,以及对HTML5拖放API的理解。这不仅可以提升应用的交互性,还能提高用户的满意度。通过不断学习和实践,你将能更熟练地掌握这一技术,并在你的项目中创造出更多富有创新性的交互体验。