您好,登錄后才能下訂單哦!
今天小編給大家分享一下vue項(xiàng)目中怎么實(shí)現(xiàn)el-dialog組件可拖拽效果的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
第一步:創(chuàng)建 drag.js文件 實(shí)現(xiàn)拖拽源碼
/** * 拖拽移動(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; }; }; }
第二步:新建 directive.js 文件,創(chuàng)建vue指令配置文件
// 引入拖拽js import { startDrag } from './drag.js' /** * 為el-dialog彈框增加拖拽功能 * @param {*} el 指定dom * @param {*} binding 綁定對(duì)象 * desc 只要用到了el-dialog的組件,都可以通過增加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 <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>
注意事項(xiàng)
文件引入路徑需前后保持一致
以上就是“vue項(xiàng)目中怎么實(shí)現(xiàn)el-dialog組件可拖拽效果”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。