vue+element弹窗可拖拽拉伸和弹窗内table高度自适应

   需求是这样的:需要将目前的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 &&
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值