国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于element-ui el-dialog組件封裝,可縮放+可移動(dòng)的彈窗組件

這篇具有很好參考價(jià)值的文章主要介紹了基于element-ui el-dialog組件封裝,可縮放+可移動(dòng)的彈窗組件。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

源碼下載

改組件繼承el-dialog組件百分之95屬性,可直接對<el-dialog>進(jìn)行替換。在項(xiàng)目中我的命名為:

SkDialog。廢話不多說,直接上代碼:

vue代碼:搞成組件,路徑隨意,推薦統(tǒng)一放在組件目錄下

el–dialog如何放大縮小,element,ui,vue.js,前端

<!--
@author: kzy;
 -->
<template>
  <el-dialog ref="skDialog"
             custom-class="dialogHeightFull skDialog"
             :title="title"
             :fullscreen="fullFlag"
             :visible.sync="dialogVisible"
             :append-to-body="appendToBody"
             :lock-scroll="lockScroll"
             :modal-append-to-body="modalAppendToBody"
             :close-on-click-modal="closeOnClickModal"
             :close-on-press-escape="closeOnPressEscape"
             :show-close="false"
             :before-close="beforeClose"
             :center="center"
             :destroy-on-close="destroyOnClose"
             :width="width"
             :top="top"
             v-if="dialogVisible"
             v-sk-dialog-drag
             @closed="closeSkDialog">
    <div slot="title" class="skDialog-header">
      <div class="skDialog-title"><span>{{title}}</span></div>
      <div class="skDialog-icon">
        <i :class="fullFlag? 'el-icon-copy-document' : 'el-icon-full-screen' " @click="IsFullscreen"></i>
        <i class="el-icon-close" @click="closeSkDialog"></i>
      </div>
    </div>
    <div class="el-dialog__body"  v-if="rendered"><slot :style="{height:height}"></slot></div>
    <div class="el-dialog__footer" v-if="$slots.footer">
      <slot name="footer"></slot>
    </div>
    <div class="resize"></div>
  </el-dialog>
</template>

<script>
  export default {
    name: 'SkDialog',
    props: {
      visible: {
        type: Boolean,
        default: false
      },
      titleVisible: {
        type: Boolean,
        default: true
      },
      width: {
        type: String,
        default: '50%'
      },
      height: {
        type: String,
        default: '100%'
      },
      top: {
        type: String,
        default: '30px'
      },
      title: {
        type: String,
        default: ''
      },
      isfullscreen: {
        type: Boolean,
        default: false // 默認(rèn)全屏
      },

      modal: {
        type: Boolean,
        default: true
      },

      modalAppendToBody: {
        type: Boolean,
        default: true
      },

      appendToBody: {
        type: Boolean,
        default: true
      },

      lockScroll: {
        type: Boolean,
        default: true
      },

      closeOnClickModal: {
        type: Boolean,
        default: false
      },

      closeOnPressEscape: {
        type: Boolean,
        default: false
      },

      showClose: {
        type: Boolean,
        default: true
      },

      customClass: {
        type: String,
        default: ''
      },

      beforeClose: Function,
      center: {
        type: Boolean,
        default: false
      },

      destroyOnClose: Boolean
    },
    data() {
      return {
        full: false, // 全屏
      }
    },
    computed: {
      fullFlag: {
        get: function() {
          return this.full ?? this.isfullscreen;
        },
        set: function(n) {
          return this.full
        }
      },
      dialogVisible:{ //重新設(shè)置一個(gè)變量,接收父級傳遞的參數(shù),引用頁面需要使用語法糖,才能使用this.$emit('update:visible', false)對父組件值進(jìn)行更新
        get:function(){
          return this.visible
        },
        set :function(value){
          this.$emit('update:visible', false)
        }
      },
      rendered:{ //重新設(shè)置一個(gè)變量,接收父級傳遞的參數(shù)
        get:function(){
          return this.visible
        },
      }
    },
    mounted() {
    },
    methods: {
      // 全屏 切換
      IsFullscreen() {
        let dialogDom = document.querySelector(".skDialog");
        if (this.isfullscreen == true) {
          this.full = this.full === null ? false : !this.full
        } else {
          this.full = this.full === null ? true : !this.full
          dialogDom.style.top =`0px`;
          dialogDom.style.left =`auto`;
        }
        // 傳過來的全屏鉤子函數(shù)
        this.$emit('maxFun')
      },
      // 關(guān)閉
      closeSkDialog() {
        this.full = null
        this.$emit('update:visible', false)
        // 傳過來的關(guān)閉鉤子函數(shù)
        this.$emit('closeFun')
      }
    },
    watch:{
    },
    created() {
      this.full = this.isfullscreen
    },
  }
</script>

<style scoped="scoped">
  >>>.el-dialog__header {
    background-color: #f2f2f2;
    /* height: 48px; */
    padding: 10px 20px 10px;
  }

  .skDialog-header {
    display: flex;
    flex-direction: row;
    justify-content: space-between;
  }

  .skDialog .skDialog-icon i {
    display: inline-block;
    height: 28px;
    width: 28px;
    line-height: 24px;
    text-align: center;
    border-radius: 50%;
    cursor: pointer;
    font-size: 22px;
  }

  .skDialog .skDialog-icon i:hover {
    background-color: #ddd;
  }

  .skDialog .skDialog-icon i::before {
    font-size: 80%;
  }

  >>>.skDialog.dialogHeightFull.el-dialog {
    margin-bottom: 0;
    /*overflow-y: hidden;*/
  }

  .el-dialog__wrapper{
    /*overflow: hidden!important;*/
  }
  .resize{
    position: absolute;
    right: 0;
    bottom: 0;
    content: '';
    width: 10px;
    height: 10px;
    cursor: se-resize;
  }
</style>

拖動(dòng)及縮放操作js代碼:

/**
 @author: kzy;
 */
import Vue from 'vue'
Vue.directive("SkDialogDrag", {
  bind(el, binding, vnode, oldVnode) {
    const windowW = document.body.clientWidth;
    const windowH = document.body.clientHeight
    //設(shè)置彈框可拉伸最小寬高
    let minWidth = 400;
    let minHeight = 300;
    const dialogHeaderEl = el.querySelector(".el-dialog__header");
    //彈窗
    const dragDom = el.querySelector(".el-dialog");
    //頭部加上可拖動(dòng)cursor
    dialogHeaderEl.style.cursor = "move";

    // 獲取style屬性
    const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null);

    let moveDown = e => {
      // 鼠標(biāo)按下,計(jì)算當(dāng)前元素距離可視區(qū)的距離
      const disX = e.clientX - dialogHeaderEl.offsetLeft;
      const disY = e.clientY - dialogHeaderEl.offsetTop;

      // 獲取到的值帶px 正則匹配替換
      let styL, styT, styMT;
      // 注意在ie中 第一次獲取到的值為組件自帶50% 移動(dòng)之后賦值為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, "");
        styMT = +sty.marginTop.replace(/\px/g, "")
      }

      document.onmousemove = function (e) {
        const titleH = dialogHeaderEl.offsetHeight;

        // 通過事件委托,計(jì)算移動(dòng)的距離
        let l = e.clientX - disX;
        let t = e.clientY - disY;

        // 移動(dòng)邊界處理
        if (t < 0 && (t + styMT + styT) <= 0 || t < 0 && (styMT + styT) <= 0) {
          t = -(styMT + styT);
        } else if (t > 0 && t > (document.body.clientHeight - styMT - styT - titleH)) {
          t = document.body.clientHeight - styMT - styT - titleH;
        }

        // 移動(dòng)當(dāng)前元素
        dragDom.style.left = `${l + styL}px`;
        dragDom.style.top = `${t + styT}px`;

      };

      document.onmouseup = function (e) {
        document.onmousemove = null;
        document.onmouseup = null;
      };

    };

    dialogHeaderEl.onmousedown = moveDown;

    dragDom.onmousemove = function (e) {
      const dialogBODY = el.querySelector(".el-dialog__body");
      const resizeDom= el.querySelector(".resize");
      const titleH = dialogHeaderEl.offsetHeight;
      dragDom.onmousedown = e => {
        const clientX = e.clientX;
        const clientY = e.clientY;
        let elW = dragDom.clientWidth;
        let elH = dragDom.clientHeight;
        let EloffsetLeft = dragDom.offsetLeft;
        let EloffsetTop = dragDom.offsetTop;
        let ELscrollTop = el.scrollTop;
        let resizeW = resizeDom.clientWidth, resizeH = resizeDom.clientHeight;

        //判斷點(diǎn)擊的位置是不是為頭部
        if (
          clientX > EloffsetLeft &&
          clientX < EloffsetLeft + elW &&
          clientY > EloffsetTop &&
          clientY < EloffsetTop + 100
        ) {
          //如果是頭部
          e.preventDefault(); // 移動(dòng)時(shí)禁用默認(rèn)事件
        } else {
          document.onmousemove = function (e) {
            //鼠標(biāo)拖拽
            if (
              clientX > EloffsetLeft + elW - resizeW  &&
              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) {
                let targetTW = elW + (e.clientX - clientX) * 2
                targetTW > windowW ?
                  dragDom.style.width = windowW + "px" :
                  dragDom.style.width = targetTW + "px"
              }
            }
            //底部鼠標(biāo)拖拽位置
            if (
              ELscrollTop + clientY > EloffsetTop + elH - resizeH &&
              ELscrollTop + clientY < EloffsetTop + elH
            ) {
              //往上拖拽
              if (clientY > e.clientY) {
                if (dragDom.clientHeight < minHeight) {
                } else {
                  dragDom.style.height = elH - (clientY - e.clientY) * 1 + "px";
                  dialogBODY.style.height = elH - (clientY - e.clientY) * 1 - titleH + "px";
                }
              }
              //往下拖拽
              if (clientY <= e.clientY) {
                e.clientY >= windowH ?
                  dragDom.style.height = windowH - dragDom.offsetTop + "px" :
                  dragDom.style.height = elH + (e.clientY - clientY) * 1 + "px";
                dialogBODY.style.height = elH - (clientY - e.clientY) * 1 - titleH + "px";
              }
            }
          };
          //結(jié)束
          document.onmouseup = function (e) {
            document.onmousemove = null;
            document.onmouseup = null;
          };
        }
      };
    };
  }
});
export default Vue.directive('SkDialogDrag')

將skdialog.js注冊為指令:

目錄:

el–dialog如何放大縮小,element,ui,vue.js,前端

import SkDialogDrag from './dialog/skdialog'
const install = function(Vue) {
  Vue.directive('SkDialogDrag', SkDialogDrag)
}

指令使用:(v-指令名稱(SkDialogDrag))

el–dialog如何放大縮小,element,ui,vue.js,前端

效果圖:

el–dialog如何放大縮小,element,ui,vue.js,前端

注:吃水不忘挖井人,在?原作者wjqocean?的基礎(chǔ)之上改進(jìn)文章來源地址http://www.zghlxwxcb.cn/news/detail-767979.html

到了這里,關(guān)于基于element-ui el-dialog組件封裝,可縮放+可移動(dòng)的彈窗組件的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • element UI組件庫el-dialog內(nèi)程序刷新el-dialog內(nèi)組件方法

    1、牢牢記住,vue是基于JavaScript ES6的,所以只要刷新頁面里面data下的數(shù)據(jù),頁面會(huì)自動(dòng)刷新的。 所以這個(gè)數(shù)據(jù)是父頁面?zhèn)鹘oel-dialog的,要刷新父頁面的數(shù)據(jù),el-dialog頁面內(nèi)的組件就可以刷新了。 2、在頁面的組件處理后臺程序完成后,可以調(diào)用 that.$parent.$parent.【父頁面的方

    2024年02月13日
    瀏覽(24)
  • element-ui:多個(gè)el-dialog彈框切換會(huì)出現(xiàn)閃爍

    使用多個(gè)element-ui組件el-dialog彈框切換 打開A彈框,點(diǎn)擊關(guān)閉,緊接著打開B彈框 會(huì)出現(xiàn)一個(gè)明顯的閃爍 給第一個(gè)彈框關(guān)閉加一點(diǎn)延遲 參考 【ElementUI】dialog彈窗出現(xiàn)閃屏問題解決辦法

    2024年02月11日
    瀏覽(19)
  • element-ui中更換el-dialog彈窗中默認(rèn)的關(guān)閉按鈕

    element-ui中更換el-dialog彈窗中默認(rèn)的關(guān)閉按鈕

    在使用 element-ui 框架里的 el-dialog 組件時(shí),要修改彈窗里默認(rèn)的關(guān)閉圖標(biāo);如下圖所示:左邊是想要替換后的;右邊是組件默認(rèn)的關(guān)閉圖標(biāo); 通過檢查組件的元素;發(fā)現(xiàn)組件默認(rèn)的關(guān)閉是一個(gè)圖標(biāo);通過圖標(biāo)的形式展現(xiàn)的。 那就可以通過 CSS 隱藏當(dāng)前的圖標(biāo);然后在當(dāng)前圖標(biāo)

    2024年02月12日
    瀏覽(23)
  • element-ui框架的el-dialog彈出框被遮罩層擋住

    解決辦法 在el-dialog標(biāo)簽里添加 :modal-append-to-body=‘false’ 問題分析? 先來看看element-ui官網(wǎng)提供的屬性說明文檔 文檔解釋: 翻譯成大白話就是,若el-dialog彈出框設(shè)置了modal-append-to-body=\\\'true\\\'(默認(rèn))屬性,它的遮罩層就會(huì)被插入到body標(biāo)簽下(即與組件所在的最外層div同一層級),

    2024年02月16日
    瀏覽(31)
  • vue2.x 二次封裝element ui 中的el-dialog

    在做后臺管理系統(tǒng)的時(shí)候,dialog組件是我們使用頻率比較高的組件,但是有一些需求現(xiàn)有的組件是不滿足的。因此會(huì)需要我們做二次封裝。 組件本身的屬性我們保留,只需要根據(jù)需求添加,然后在使用的時(shí)候props去拿取使用就可以了。 本次遇到的問題是如何在父組件去控制

    2024年02月07日
    瀏覽(30)
  • element-ui el-dialog如何設(shè)置響應(yīng)式寬高且永遠(yuǎn)水平垂直居中

    ????????el-dialog是使平常使用element-ui比較常用的一個(gè)組件,想要靈活控制它達(dá)到想要的開發(fā)效果,就必須要熟悉它默認(rèn)一些屬性:默認(rèn) width:50% , 高度 為標(biāo)題和el-dialog__body,el-dialog__footer 內(nèi)容以及padding撐開 ,定位上 默認(rèn)水平居中,距離頂端15vh ????????原理是width采

    2024年02月11日
    瀏覽(23)
  • Vue中使用element-ui el-dialog彈窗最大化還原,拖拽,動(dòng)態(tài)改變大小

    Vue中使用element-ui el-dialog彈窗最大化還原,拖拽,動(dòng)態(tài)改變大小

    創(chuàng)建對應(yīng)的js文件 ??先在指定穩(wěn)定文件創(chuàng)建js文件,如src下創(chuàng)建diaLog.js文件,部分會(huì)提示紅色爆紅,可以不予理會(huì),可以根據(jù)需求修改,如:彈框可拉伸最小寬高。 ? 2. 在main.js的引用 ??同時(shí)為了防止沖突,需要關(guān)閉closeOnClickModal(彈窗默認(rèn)點(diǎn)擊遮罩改為不關(guān)閉),并添加標(biāo)簽

    2024年02月11日
    瀏覽(29)
  • [element-ui] v-click-outside與el-dialog同時(shí)存在,出現(xiàn)的Bug

    背景 : v-click-outside 點(diǎn)擊盒子aaa外部,盒子aaa隱藏 問題 :因?yàn)?el-dialog 綁在了body上,點(diǎn)擊 el-dialog 里的任意內(nèi)容,盒子aaa也隱藏了。 需求 :點(diǎn)擊 el-dialog 里的任意內(nèi)容,盒子aaa不隱藏 解決:給 el-dialog 加上 @click.native.stop 來阻止 el-dialog 內(nèi)部的點(diǎn)擊事件冒泡。

    2024年02月11日
    瀏覽(21)
  • element ui中父子組件共用一個(gè)el-dialog彈窗,切換組件頁面彈窗進(jìn)行關(guān)閉

    在Element UI中,如果多個(gè)父子組件共用一個(gè)el-dialog彈窗,并且需要在切換組件頁面時(shí)關(guān)閉彈窗,你可以考慮以下方法來實(shí)現(xiàn): 在Vuex中創(chuàng)建一個(gè)狀態(tài)來管理彈窗的顯示狀態(tài)(例如,showDialog)。 在父子組件中都可以訪問這個(gè)狀態(tài),以便共享。 當(dāng)需要打開或關(guān)閉彈窗時(shí),分發(fā)對應(yīng)

    2024年02月03日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包