需求是这样的:需要将目前的el-dialog弹窗都改成可拉伸和拖拽的。并且做自适应。(一番交涉下来,最终是如果弹窗里面有table的话,我们给table的高度自适应,普通表单不需要)。
确定了需求,准备开发,在网上找了一圈,大家的都差不多,所以我在他们的基础上加了一些自己的改动。说说目前网上其他我搜到的文件用在我们的项目的问题:1.拖动的时候到处飞,没有加边界条件。 2.可以把弹窗拉的非常小,以至于出现滚动条之后,右侧再无法拉伸。3.使用了拉伸的方法后,弹窗内的form表单无法进行拖拽选中input内的文字。
针对上面几个问题,改了些地方。一起来写吧!
1.开始自定义指定
从别人的文档“借鉴”过来的自定义指令外壳。将几个方法都拿出来当方法了。(公司要求方法行数不能大于50行_(:з」∠)_,只能硬拆)
import Vue from 'vue';
// v-dialogDrag: 弹窗拖拽属性
Vue.directive('dialogDrag', {
bind(el, binding, vnode, oldVnode) {
// 弹框可拉伸最小宽高,不设置的话,会导致出现滚动条无法进行拉伸。
let minWidth = 620
let minHeight = 370
// 获取弹框头部
const dialogHeaderEl = el.querySelector('.dialog_header');
// 获取弹窗
const dragDom = el.querySelector('.el-dialog')
// 给弹窗加上overflow:auto;不然缩小时框内的标签可能超出dialog
dragDom.style.overflow = 'auto'
// 头部加上可拖动cursor
dialogHeaderEl.style.cursor = 'move'
// 头部拖拽
dialogHeaderEl.onmousedown = (e) => {
moveDown(e,dialogHeaderEl,dragDom)
},
document.onmousemove = function (e) {
// 获取弹窗的边界位置值
let domRect = dragDom.getBoundingClientRect()
let endX =e.clientX,
endY=e.clientY
// 获取鼠标在边角的样式。头部因为有拖拽事件,所以无法拉伸。
cursorType(e,el,dragDom)
// 不在弹窗 - 10px 的内部,才走这些方法。防止拉伸事件影响表单选中文本
if(isBorder(domRect,{endX,endY})){
dragDom.onmousedown = e =>{
const initHeight = dragDom.clientHeight
const clientX = e.clientX // clientX事件属性返回当事件被触发时相对于浏览器页面(或客户区)的水平坐标
const clientY = e.clientY
let elW = dragDom.clientWidth
let elH = dragDom.clientHeight
let EloffsetLeft = dragDom.offsetLeft
let EloffsetTop = dragDom.offsetTop
dragDom.style.userSelect = 'text'
let ElscrollTop = el.scrollTop
// 判断点击的位置是不是为头部
if (
clientX > EloffsetLeft &&
clientX < EloffsetLeft + elW &&

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



