vue/Element?UI實(shí)現(xiàn)Element?UI?el-dialog自由拖動(dòng)功能實(shí)現(xiàn)
前言:
最近有個(gè)項(xiàng)目,客戶要求彈窗可拖動(dòng),但是由于elemen ui本身的彈窗并沒(méi)有拖動(dòng)的屬性,無(wú)法滿足客戶的需求。
于是我百度找到了幾篇文章,終于可以實(shí)現(xiàn)客戶的需求!
請(qǐng)往下看↓↓
一、新建一個(gè)目錄:utils

二、創(chuàng)建drag .js文件
/**
* 拖拽移動(dòng)
* @param {elementObjct} bar 鼠標(biāo)點(diǎn)擊控制拖拽的元素
* @param {elementObjct} target 移動(dòng)的元素
* @param {function} callback 移動(dòng)后的回調(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
};
// 給拖動(dòng)塊添加樣式
bar.style.cursor = 'move';
// 獲取相關(guān)CSS屬性
// o是移動(dòng)對(duì)象
// var getCss = function (o, key) {
// return o.currentStyle ? o.currentStyle[key] : document.defaultView.getComputedStyle(o, false)[key];
// };
bar.onmousedown = function (event) {
// 按下時(shí)初始化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
};
// 給被拖動(dòng)塊初始化樣式
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;
// 最終移動(dòng)位置
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í)行移動(dòng)
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;
};
};
}三、創(chuàng)建directive.js 文件
// 引入拖拽js
import { startDrag } from './drag.js'
/**
* 為el-dialog彈框增加拖拽功能
* @param {*} el 指定dom
* @param {*} binding 綁定對(duì)象
* desc 只要用到了el-dialog的組件,都可以通過(guò)增加v-draggable屬性變?yōu)榭赏献У膹椏?
*/
const draggable = (el, binding) => {
// 綁定拖拽事件 [綁定拖拽觸發(fā)元素為彈框頭部、拖拽移動(dòng)元素為整個(gè)彈框]
startDrag(el.querySelector('.el-dialog__header'), el.querySelector('.el-dialog'), binding.value);
};
const directives = {
draggable,
};
// 這種寫法可以批量注冊(cè)指令
export default {
install(Vue) {
Object.keys(directives).forEach((key) => {
Vue.directive(key, directives[key]);
});
},
};四、main.js文件中全局引入vue指令
全局注冊(cè)
import directive from './utils/directive' Vue.use(directive)
五、使用v-draagble
在頁(yè)面上使用v-draagble

好了,經(jīng)過(guò)以上的幾步,已經(jīng)可以實(shí)現(xiàn)拖動(dòng)功能了!
如果有不同看法,歡迎留言交流,謝謝?。?/p>
下面是一個(gè)博主的文章,大家不懂也可以參考一下
參考鏈接:http://www.fzitv.net/article/234469.htm
總結(jié)
到此這篇關(guān)于vue/Element UI實(shí)現(xiàn)Element UI el-dialog自由拖動(dòng)功能實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Element UI el-dialog自由拖動(dòng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Vue中使用elementui與Sortable.js實(shí)現(xiàn)列表拖動(dòng)排序
- 關(guān)于Element UI table 順序拖動(dòng)方式
- 解決element-ui table設(shè)置列fixed時(shí)X軸滾動(dòng)條無(wú)法拖動(dòng)問(wèn)題
- vue使用Element的Tree樹形控件實(shí)現(xiàn)拖動(dòng)改變節(jié)點(diǎn)順序方式
- element plus tree拖動(dòng)節(jié)點(diǎn)交換位置和改變層級(jí)問(wèn)題(解決方案)
- elementplus+splitpanes實(shí)現(xiàn)左右拖動(dòng)控制寬度的項(xiàng)目實(shí)踐
相關(guān)文章
vue2.0 下拉框默認(rèn)標(biāo)題設(shè)置方法
今天小編就為大家分享一篇vue2.0 下拉框默認(rèn)標(biāo)題設(shè)置方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
Vue+Element一步步實(shí)現(xiàn)動(dòng)態(tài)添加Input_輸入框案例
這篇文章主要介紹了Vue+Element一步步實(shí)現(xiàn)動(dòng)態(tài)添加Input_輸入框案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
Spring boot 和Vue開發(fā)中CORS跨域問(wèn)題解決
這篇文章主要介紹了Spring boot 和Vue開發(fā)中CORS跨域問(wèn)題解決,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
fetch網(wǎng)絡(luò)請(qǐng)求封裝示例詳解
這篇文章主要介紹了fetch網(wǎng)絡(luò)請(qǐng)求封裝的示例內(nèi)容詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11
Vue數(shù)據(jù)監(jiān)聽方法watch的使用
這篇文章主要介紹了Vue數(shù)據(jù)監(jiān)聽方法watch的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
Vue中如何進(jìn)行數(shù)據(jù)響應(yīng)式更新
Vue是一款流行的JavaScript框架,它提供了數(shù)據(jù)響應(yīng)式更新的能力,可以讓我們輕松地更新數(shù)據(jù),并自動(dòng)更新視圖,本文將介紹Vue中如何進(jìn)行數(shù)據(jù)響應(yīng)式更新,包括使用Vue的響應(yīng)式系統(tǒng)、使用計(jì)算屬性和使用Vue的watcher,需要的朋友可以參考下2023-06-06
解決vue項(xiàng)目中某一頁(yè)面不想引用公共組件app.vue的問(wèn)題
這篇文章主要介紹了解決vue項(xiàng)目中某一頁(yè)面不想引用公共組件app.vue的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08

