vue el-dialog 拖拽 全屏 拉伸

image.png

首先---js文件

Vue.prototype.dropDialog = function (el){
    // 彈框可拉伸最小寬高
    const minWidth = 820
    // eslint-disable-next-line no-unused-vars
    const minHeight = 460
    // 初始非全屏
    let isFullScreen = false
    // 當(dāng)前寬高
    let nowWidth = 0
    // eslint-disable-next-line no-unused-vars
    let nowHeight = 0
    // 當(dāng)前頂部高度
    let nowMarginTop = 0
    // 獲取彈框頭部(這部分可雙擊全屏)
    const dialogHeaderEl = el.querySelector('.el-dialog__header')
    // 彈窗
    const dragDom = el.querySelector('.el-dialog')
    // 給彈窗加上overflow auto师坎;不然縮小時框內(nèi)的標(biāo)簽可能超出dialog赠群;
    dragDom.style.overflow = 'auto'
    // 清除選擇頭部文字效果
    // dialogHeaderEl.onselectstart = new Function("return false");
    // 頭部加上可拖動cursor
    dialogHeaderEl.style.cursor = 'move'
    // 獲取原有屬性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
    const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null)
    const moveDown = (e) => {
        // 鼠標(biāo)按下蹂随,計算當(dāng)前元素距離可視區(qū)的距離
        const disX = e.clientX - dialogHeaderEl.offsetLeft
        const disY = e.clientY - dialogHeaderEl.offsetTop
        // 獲取到的值帶px 正則匹配替換
        let styL, styT
        // 注意在ie中 第一次獲取到的值為組件自帶50% 移動之后賦值為px
        if (sty.left.includes('%')) {
            styL = +document.body.clientWidth * (+sty.left.replace(/%/g, '') / 100)
            styT = +document.body.clientHeight * (+sty.top.replace(/%/g, '') / 100)
        } else {
            styL = +sty.left.replace(/px/g, '')
            styT = +sty.top.replace(/px/g, '')
        }
        document.onmousemove = function (e) {
            // 通過事件委托曲饱,計算移動的距離
            const l = e.clientX - disX
            const t = e.clientY - disY
            // 移動當(dāng)前元素
            dragDom.style.left = `${l + styL}px`
            dragDom.style.top = `${t + styT}px`
            // 將此時的位置傳出去
            // binding.value({ x: e.pageX, y: e.pageY })
        }
        document.onmouseup = function (e) {
            document.onmousemove = null
            document.onmouseup = null
        }
    }
    dialogHeaderEl.onmousedown = moveDown
    // 雙擊頭部全屏效果
    dialogHeaderEl.ondblclick = (e) => {
        if (isFullScreen === false) {
            nowHeight = dragDom.clientHeight
            nowWidth = dragDom.clientWidth
            nowMarginTop = dragDom.style.marginTop
            dragDom.style.left = 0
            dragDom.style.top = 0
            dragDom.style.height = '100VH'
            dragDom.style.width = '100VW'
            dragDom.style.marginTop = 0
            isFullScreen = true
            dialogHeaderEl.style.cursor = 'initial'
            dialogHeaderEl.onmousedown = null
        } else {
            dragDom.style.height = 'auto'
            dragDom.style.width = nowWidth + 'px'
            dragDom.style.marginTop = nowMarginTop
            isFullScreen = false
            dialogHeaderEl.style.cursor = 'move'
            dialogHeaderEl.onmousedown = moveDown
        }
    }
    dragDom.onmousemove = function (e) {
        // eslint-disable-next-line no-unused-vars
        const moveE = e
        if (e.clientX > dragDom.offsetLeft + dragDom.clientWidth - 10 || dragDom.offsetLeft + 10 > e.clientX) {
            dragDom.style.cursor = 'w-resize'
            // eslint-disable-next-line brace-style
        }
        else if (el.scrollTop + e.clientY > dragDom.offsetTop + dragDom.clientHeight - 10) {
            dragDom.style.cursor = 's-resize'
        } else {
            dragDom.style.cursor = 'default'
            dragDom.onmousedown = null
        }
        dragDom.onmousedown = (e) => {
            const clientX = e.clientX
            const clientY = e.clientY
            const elW = dragDom.clientWidth
            // eslint-disable-next-line no-unused-vars
            const elH = dragDom.clientHeight
            const EloffsetLeft = dragDom.offsetLeft
            const EloffsetTop = dragDom.offsetTop
            dragDom.style.userSelect = 'none'
            // eslint-disable-next-line no-unused-vars
            const ELscrollTop = el.scrollTop
            // 判斷點(diǎn)擊的位置是不是為頭部
            if (clientX > EloffsetLeft && clientX < EloffsetLeft + elW && clientY > EloffsetTop && clientY < EloffsetTop + 100) {
                // 如果是頭部在此就不做任何動作阳啥,以上有綁定dialogHeaderEl.onmousedown = moveDown;
            } else {
                document.onmousemove = function (e) {
                    e.preventDefault() // 移動時禁用默認(rèn)事件
                    // 左側(cè)鼠標(biāo)拖拽位置
                    if (clientX > EloffsetLeft && clientX < EloffsetLeft + 10) {
                        // 往左拖拽
                        if (clientX > e.clientX) {
                            dragDom.style.width = elW + (clientX - e.clientX) * 2 + 'px'
                        }
                        // 往右拖拽
                        if (clientX < e.clientX) {
                            if (dragDom.clientWidth < minWidth) {
                            } else {
                                dragDom.style.width = elW - (e.clientX - clientX) * 2 + 'px'
                            }
                        }
                    }
                    // 右側(cè)鼠標(biāo)拖拽位置
                    if (clientX > EloffsetLeft + elW - 10 && clientX < EloffsetLeft + elW) {
                        // 往左拖拽
                        if (clientX > e.clientX) {
                            if (dragDom.clientWidth < minWidth) {
                            } else {
                                dragDom.style.width = elW - (clientX - e.clientX) * 2 + 'px'
                            }
                        }
                        // 往右拖拽
                        if (clientX < e.clientX) {
                            dragDom.style.width = elW + (e.clientX - clientX) * 2 + 'px'
                        }
                    }
                    // 底部鼠標(biāo)拖拽位置
                    if (ELscrollTop + clientY > EloffsetTop + elH - 20 && ELscrollTop + clientY < EloffsetTop + elH) {
                        // 往上拖拽
                        if (clientY > e.clientY) {
                            if (dragDom.clientHeight < minHeight) {
                            } else {
                                dragDom.style.height = elH - (clientY - e.clientY) * 2 + 'px'
                            }
                        }
                        // 往下拖拽
                        if (clientY < e.clientY) {
                            dragDom.style.height = elH + (e.clientY - clientY) * 2 + 'px'
                        }
                    }
                }
                // 拉伸結(jié)束
                document.onmouseup = function (e) {
                    document.onmousemove = null
                    document.onmouseup = null
                }
            }
        }
    }
}

2.頁面引入js文件 給dialog加入open事件和 ref

image.png

methods調(diào)用方法

 open_handling_Surrender() { //彈框拖拽
                    this.dropDialog(this.$refs.handling_SurrenderDialog.$el)
                },
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市连舍,隨后出現(xiàn)的幾起案子兜喻,更是在濱河造成了極大的恐慌,老刑警劉巖埋虹,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猜憎,死亡現(xiàn)場離奇詭異,居然都是意外死亡搔课,警方通過查閱死者的電腦和手機(jī)胰柑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爬泥,“玉大人柬讨,你說我怎么就攤上這事∨鄯龋” “怎么了踩官?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長境输。 經(jīng)常有香客問我蔗牡,道長,這世上最難降的妖魔是什么嗅剖? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任辩越,我火速辦了婚禮,結(jié)果婚禮上信粮,老公的妹妹穿的比我還像新娘黔攒。我一直安慰自己,他們只是感情好强缘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布督惰。 她就那樣靜靜地躺著,像睡著了一般旅掂。 火紅的嫁衣襯著肌膚如雪姑丑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天辞友,我揣著相機(jī)與錄音,去河邊找鬼。 笑死称龙,一個胖子當(dāng)著我的面吹牛留拾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鲫尊,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼痴柔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了疫向?” 一聲冷哼從身側(cè)響起咳蔚,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎搔驼,沒想到半個月后谈火,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舌涨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年糯耍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片囊嘉。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡温技,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扭粱,到底是詐尸還是另有隱情舵鳞,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布琢蛤,位于F島的核電站蜓堕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏虐块。R本人自食惡果不足惜俩滥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贺奠。 院中可真熱鬧霜旧,春花似錦、人聲如沸儡率。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽儿普。三九已至崎逃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間眉孩,已是汗流浹背个绍。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工勒葱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人巴柿。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓凛虽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親广恢。 傳聞我的和親對象是個殘疾皇子凯旋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容