vue項目中實現(xiàn)el-dialog組件可拖拽效果
0. 首先上圖,看效果

1. 實現(xiàn)方法
第一步:創(chuàng)建 drag.js文件 實現(xiàn)拖拽源碼
/**
?* 拖拽移動
?* @param ?{elementObjct} bar 鼠標點擊控制拖拽的元素
?* @param {elementObjct} ?target 移動的元素
?* @param {function} ?callback 移動后的回調(diào)
?*/
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';
??
? ? // 獲取相關(guān)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 >= params.cWidth - parseInt(params.tWidth * 0.5)) {
? ? ? ? ? ? zLeft = params.cWidth - parseInt(params.tWidth * 0.5);
? ? ? ? ? }
??
? ? ? ? ? zTop = parseInt(params.top) + disY;
? ? ? ? ? // 限制Y軸范圍
? ? ? ? ? if (zTop <= 0) {
? ? ? ? ? ? zTop = 0;
? ? ? ? ? }
? ? ? ? ? if (zTop >= params.cHeight - parseInt(params.tHeight * 0.5)) {
? ? ? ? ? ? zTop = params.cHeight - parseInt(params.tHeight * 0.5);
? ? ? ? ? }
??
? ? ? ? ? // 執(zhí)行移動
? ? ? ? ? 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 文件,創(chuàng)建vue指令配置文件
// 引入拖拽js
import { startDrag } from './drag.js'
/**
?* 為el-dialog彈框增加拖拽功能
?* @param {*} el 指定dom
?* @param {*} binding 綁定對象
?* desc ? 只要用到了el-dialog的組件,都可以通過增加v-draggable屬性變?yōu)榭赏献У膹椏?
?*/
const draggable = (el, binding) => {
? ? // 綁定拖拽事件 [綁定拖拽觸發(fā)元素為彈框頭部、拖拽移動元素為整個彈框]
? ? startDrag(el.querySelector('.el-dialog__header'), el.querySelector('.el-dialog'), binding.value);
};
const directives = {
? ? draggable,
};
// 這種寫法可以批量注冊指令
export default {
? install(Vue) {
? ? ? Object.keys(directives).forEach((key) => {
? ? ? Vue.directive(key, directives[key]);
? ? });
? },
};第三步:main.js文件中全局引入vue指令
/* 注冊全局指令 */ import directive from './utils/directive'; Vue.use(directive) ? 第四步:使用v-draagble <el-dialog ? ?v-draggable ? ?title="新增" ? ?:visible.sync="isShow" ? ?@close="handleCancelConfigInfo"> ? ?<-- xxxx 彈框內(nèi)容... --> ? ?</el-form> ? ?<div slot="footer"> ? ? ? <el-button size="small">取消</el-button> ? ? ? <el-button size="small">保存</el-button> ? ?</div> </el-dialog>
注意事項
文件引入路徑需前后保持一致
參考資料
Vue 自定義拖拽指令 v-drag vue+element 實現(xiàn)拖拽 Drag 彈框
到此這篇關(guān)于vue項目中實現(xiàn)el-dialog組件可拖拽效果的文章就介紹到這了,更多相關(guān)vue el-dialog可拖拽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VUE異步更新DOM - 用$nextTick解決DOM視圖的問題
這篇文章主要介紹了VUE異步更新DOM - 用$nextTick解決DOM視圖的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
Vue項目如何根據(jù)圖片url獲取file對象并用axios上傳
這篇文章主要介紹了Vue項目如何根據(jù)圖片url獲取file對象并用axios上傳問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
vue實現(xiàn)將數(shù)據(jù)存入vuex中以及從vuex中取出數(shù)據(jù)
今天小編就為大家分享一篇vue實現(xiàn)將數(shù)據(jù)存入vuex中以及從vuex中取出數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11
vue監(jiān)聽瀏覽器原生返回按鈕,進行路由轉(zhuǎn)跳操作
這篇文章主要介紹了vue監(jiān)聽瀏覽器原生返回按鈕,進行路由轉(zhuǎn)跳操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
公共Hooks封裝useTableData表格數(shù)據(jù)實例
這篇文章主要為大家介紹了公共Hooks封裝useTableData表格數(shù)據(jù)實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12

