首页 > 其他分享 >elementUI中或者其他的div的弹框拖拽

elementUI中或者其他的div的弹框拖拽

时间:2024-12-27 10:09:54浏览次数:7  
标签:event el target elementUI 弹框 params var div 拖拽

项目中的el-dialog的随意拖拽,相关代码如下:

一、dom代码:

<template>
  <div class="about">
    <el-button type="text" @click="dialogVisible = true">弹框的可拖拽</el-button>
    <!-- el-dialog 弹框的时候直接按照demo用就可以了 -->
      <el-dialog
        v-draggable
        title="提示"
        :visible.sync="dialogVisible"
        width="30%"
        :before-close="handleClose">
        <span>这是可拖拽弹框的demo</span>
        <el-input v-model="input" placeholder="请输入内容" style="margin-top:20px"></el-input>
        <span slot="footer" class="dialog-footer">
          <el-button @click="dialogVisible = false">取 消</el-button>
          <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
        </span>
      </el-dialog>
      <!-- 如果是自定义拖拽框的话,在directive中修改绑定的拖拽元素,除了e-dialog,建议制作class标识,不做样式,这样方便全局统一。
          v-draggable要放在最外层的的div的在外一层,具体使用见directive.js -->
      <div class="vardBox" v-draggable>
        <div class="box-card" style="box-shadow:0px 0px 10px rgba(0,0,0,0.5)">
          <p class="ppp">这是文字标题</p>
          <div v-for="o in 4" :key="o" class="text item">
            {{'列表内容 ' + o }}
          </div>
        </div>
      </div>

  </div>
</template>

二、创建drag.js

/**
 * 拖拽移动
 * @param  {elementObjct} bar 鼠标点击控制拖拽的元素
 * @param {elementObjct}  target 移动的元素
 * @param {function}  callback 移动后的回调
 */
export function startDrag(bar, target, callback) {
  var params = {
    top: 0,
    left: 0,
    currentX: 0,
    currentY: 0,
    flag: false,
    cWidth: 0,
    cHeight: 0,
    tWidth: 0,
    tHeight: 0
  };

  // 给拖动块添加样式
  bar.style.cursor = 'move';

  // 获取相关CSS属性
  // o是移动对象
  // var getCss = function (o, key) {
  //   return o.currentStyle ? o.currentStyle[key] :             document.defaultView.getComputedStyle(o, false)[key];
  // };

  bar.onmousedown = function (event) {
    // 按下时初始化params
    var e = event ? event : window.event;
    params = {
      top: target.offsetTop,
      left: target.offsetLeft,
      currentX: e.clientX,
      currentY: e.clientY,
      flag: true,
      cWidth: document.body.clientWidth,
      cHeight: document.body.clientHeight,
      tWidth: target.offsetWidth,
      tHeight: target.offsetHeight
    };

    // 给被拖动块初始化样式
    target.style.margin = 0;
    target.style.top = params.top + 'px';
    target.style.left = params.left + 'px';

    if (!event) {
      // 防止IE文字选中
      bar.onselectstart = function () {
        return false;
      }
    }

    document.onmousemove = function (event) {
      // 防止文字选中
      window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();

      var e = event ? event : window.event;
      if (params.flag) {
        var nowX = e.clientX;
        var nowY = e.clientY;
        // 差异距离
        var disX = nowX - params.currentX;
        var disY = nowY - params.currentY;
        // 最终移动位置
        var zLeft = 0;
        var zTop = 0;

        zLeft = parseInt(params.left) + disX;
        // 限制X轴范围
        // if (zLeft <= -parseInt(params.tWidth / 2)) {
        //   zLeft = -parseInt(params.tWidth / 2);
        // }
        if (zLeft <= 0) {
          zLeft = 0;
        }
        if (zLeft >= params.cWidth - parseInt(params.tWidth * 1)) {
          zLeft = params.cWidth - parseInt(params.tWidth * 1);
        }

        zTop = parseInt(params.top) + disY;
        // 限制Y轴范围
        if (zTop <= 0) {
          zTop = 0;
        }
        if (zTop >= params.cHeight - parseInt(params.tHeight *1)) {
          zTop = params.cHeight - parseInt(params.tHeight * 1);
        }

        // 执行移动
        target.style.left = zLeft + 'px';
        target.style.top = zTop + 'px';
      }

      if (typeof callback == "function") {
        callback(zLeft, zTop);
      }
    }

    document.onmouseup = function () {
      params.flag = false;
      document.onmousemove = null;
      document.onmouseup = null;
    };
  };
}

三、创建directive.js

// 引入拖拽js
import { startDrag } from './drag.js'

/**
 * 为el-dialog弹框增加拖拽功能
 * @param {*} el 指定dom
 * @param {*} binding 绑定对象
 * desc   只要用到了el-dialog的组件,都可以通过增加v-draggable属性变为可拖拽的弹框
 */
const draggable = (el, binding) => {
    // 绑定拖拽事件 [绑定拖拽触发元素为弹框头部、拖拽移动元素为整个弹框]
    startDrag(el.querySelector('.el-dialog__header'), el.querySelector('.el-dialog'), binding.value);
    // 这是自定义的可拖拽的框
    // startDrag(el.querySelector('.ppp'), el.querySelector('.box-card'), binding.value);
};

const directives = {
    draggable,
};
// 这种写法可以批量注册指令
export default {
  install(Vue) {
      Object.keys(directives).forEach((key) => {
      Vue.directive(key, directives[key]);
    });
  },
};

四、全局引用

//拖拽box
import directive from './api/directive';
Vue.use(directive)

 

标签:event,el,target,elementUI,弹框,params,var,div,拖拽
From: https://www.cnblogs.com/menxiaojin/p/18634862

相关文章

  • 【GreatSQL优化器-08】statistics和index dives
    【GreatSQL优化器-08】statistics和indexdives一、statistics和index_dives介绍GreatSQL的优化器对于查询条件带有范围的情况,需要根据mmtree来估计该范围内大概有多少行,然后以此来计算cost。对于等号条件,给出了两种方法来估计对应行数--Statistics和indexdives,前者不精确后......
  • Educational Codeforces Round 173 (Rated for Div. 2) E
    CF2043E题意给定两个\(n\timesm\)的矩阵\(A\)和\(B\)(其中的整数介于\(0\)和\(10^9\)之间),可以对\(A\)矩阵进行如下操作,问是否能变换为矩阵\(B\)。\(\&=\):选择两个整数\(i\)和\(x\(1\leqi\leqn,x\geq0)\),并将第\(i\)行中的每个元素替换为\(x\)与该......
  • 拖拽改变div大小方法
    constupdateWidth=()=>{letresize=document.getElementById("datatree");letmainForm=document.getElementsByClassName("mainForm");resize.onmousedown=function(e){letstartX=e.clientX;......
  • Codeforces Round 995 (Div. 3)(补题)
    CodeforcesRound995(Div.3)D.CountingPairs(离散化+二分)题目描述给你一个由\(n\)个整数组成的序列\(a\),其中序列的\(i\)-th元素等于\(a_i\)。同时还给出两个整数\(x\)和\(y\)(\(x\ley\))。如果满足以下条件,一对整数\((i,j)\)就会被认为是有趣的:\(1......
  • Codeforces Round 993 (Div. 4)(补题)
    CodeforcesRound993(Div.4)只选择对我有价值的题目记录E.InsaneProblem题目描述给定五个整数\(k\),\(l_1\),\(r_1\),\(l_2\)和\(r_2\),Wave希望你帮助她计算满足以下所有条件的有序对\((x,y)\)的数量:\(l_1\leqx\leqr_1\)。\(l_2\leqy\leqr_2\)。存在一......
  • CF补题 993-Div.4
    CF补题993-Div.4-20241221Dashboard-CodeforcesRound993(Div.4)-CodeforcesA:题目大意:给出一个\(n\),求有多少有序正整数数对\((a,b)\),使得\(a=n-b\)#include<iostream>#definestreampreset()ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);usingnames......
  • Codeforces Round 994 (Div. 2) (D-F)
    answerpage还有好多没补,但是既然赛时写出了e就应该去补f,不进则退这场没开排行榜埋头苦写第一次赛时出e了,也是第一次400名,可喜可贺//(虽然d不会)DE#include<bits/stdc++.h>usingnamespacestd;constintN=2e2+10;#definelowbit(x)(x&(-x))//#defineendl'\n'......
  • 「ABC245D」 Polynomial division
    题意给定多项式\(A\)和\(C\),求\(C\)除以\(A\)的结果\(B\)。分析先考虑用\(a_i\)和\(b_j\)表示\(c_{i+j}\),多项式乘法的朴素方法是把两式的每一位都乘起来,最后相加。具体形式为\[\begin{array}{c}c_{n+m}=a_{n}b_{m}\\c_{n+m-1}=a_{n}b_{m-1}+a_{n-1}b_{m}\\c......
  • 弹框 勾选 列表 分页
    <template><!--搜索筛选--><van-popupv-model="showPopup"roundposition="bottom":style="{height:'70%'}"closeableclose-icon="cross"class="page-filte......
  • 弹框 列表选择没有分页
    <van-popupv-model="showProject"position="bottom"get-container="body"class="pb20":style="{height:'80%',}"closeableround......