博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实现el-dialog的拖拽,全屏,缩小功能
阅读量:6616 次
发布时间:2019-06-25

本文共 5245 字,大约阅读时间需要 17 分钟。

基于el-dialog, 封装了一下。,实在懒得写,所以直接把代码 粘出来了

大概粘了一下效果。自己体会把。

 

 

 

组件使用

{
{title}}
{
{title}}

  

数据定义

data() {      return {        isfullscreen: false, // 全屏        isminimize: false, // 最小化        dialogVisible: false // 隐藏弹窗      }    },

 传递参数

props: {      width: {        type: String,        default: '50%'      },      title: {        type: String,        default: ''      },      isFooter: { // 是否显示脚部        type: Boolean,        default: true      }    },

  组件方法

methods: {      // 最小化      minimize() {        this.isminimize = !this.isminimize        if (this.isfullscreen) this.isfullscreen = !this.isfullscreen      },      // 关闭弹窗      closeDialog() {        this.dialogVisible = false      },      // 打开弹窗      openDialog() {        this.dialogVisible = true      },      // 全屏      IsFullscreen() {        this.isfullscreen = !this.isfullscreen        if (this.isfullscreen) this.$emit('isfullscreen')      }    },

  自定义指令

directives: {      dialogDrag: {        bind(el, binding, vnode, oldVnode) {          const dialogHeaderEl = el.querySelector('.el-dialog__header')          const dragDom = el.querySelector('.el-dialog')          dialogHeaderEl.style.cursor = 'move'          // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);          const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null)          // const fixedX =          // const fixedY =          dialogHeaderEl.onmousedown = (e) => {            // 判断当前是否为全屏状态            const path = event.path || (event.composedPath && event.composedPath())            const isFull = path.find(s => {              if (s.className === undefined) {                return false              } else {                return s.className.indexOf('is-fullscreen') > -1              }            })            if (isFull !== undefined) {              return            }            const isMinix = path.find(s => {              if (s.className === undefined) {                return false              } else {                return s.className.indexOf('isminimize') > -1              }            })            if (isMinix !== undefined) {              return            }            // 鼠标按下,计算当前元素距离可视区的距离            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', '')              styT = +sty.top.replace('px', '')            }            document.onmousemove = function(e) {              // 通过事件委托,计算移动的距离              const l = e.clientX - disX              const t = e.clientY - disY              // 移动当前元素              dragDom.style.left = `${l + styL}px`              dragDom.style.top = `${t + styT}px`              // const dom = e.path.find(s => s.querySelector('.el-dialog')).children[0]              //              // if (dom.offsetTop < 0) {              //   dragDom.style.top = `0px`              // }              // if (dom.offsetLeft < 0) {              //   dragDom.style.left = `0px`              // }            // 将此时的位置传出去            // binding.value({x:e.pageX,y:e.pageY})            }            document.onmouseup = function(e) {              const dragDom = el.querySelector('.el-dialog')              const offsetLeft = dragDom.offsetLeft              const offsetTop = dragDom.offsetTop              const left = Number(dragDom.style.left.replace('px', ''))              const top = Number(dragDom.style.top.replace('px', ''))              const windowWidth = window.innerWidth              const windowHeight = window.innerHeight - 50              const offsetRight = offsetLeft + dragDom.offsetWidth - windowWidth              const offsetBottom = offsetTop + dragDom.offsetHeight - windowHeight              if (offsetLeft < 0) {                dragDom.style.left = (left - offsetLeft) + 'px'              }              if (offsetTop < 0) {                dragDom.style.top = (top - offsetTop) + 'px'              }              if (offsetRight > 0) {                dragDom.style.left = (left - offsetRight) + 'px'              }              if (offsetBottom > 0) {                dragDom.style.top = (top - offsetBottom) + 'px'              }              document.onmousemove = null              document.onmouseup = null            }          }        }      }    },

  监听 (打开关闭后 还原状态)

watch: {      dialogVisible(val) {        if (val) {          const el = this.$refs.xhzqDialog.$el.querySelector('.el-dialog')          el.style.left = 0          el.style.top = 0        }      }    }

  样式

  

转载于:https://www.cnblogs.com/yasoPeng/p/10837449.html

你可能感兴趣的文章
原创文章
查看>>
理解JavaScript私有作用域
查看>>
BZOJ 1012: [JSOI2008]最大数maxnumber【线段树单点更新求最值,单调队列,多解】
查看>>
Drupal 7模板(主题钩子)的建议
查看>>
nginx配置文件中location说明
查看>>
连载-第1章绪论 1.1嵌入式系统概述
查看>>
UltraVNC
查看>>
详解synchronized
查看>>
Spring Cloud第二篇 创建一个Eureka Server
查看>>
初探数据双向绑定
查看>>
Webpack4 不深不浅的实践教程
查看>>
nginx1.9+做TCP代理(端口转发)
查看>>
HTML元素的默认CSS设置介绍
查看>>
CSS-图片不变形设置
查看>>
Git异常:fatal: could not create work tree dir 'XXX': No such file or directory
查看>>
GNU make manual 翻译(八十二)
查看>>
python批量下载图片的三种方法
查看>>
/bin/bash^M: bad interpreter: 没有那个文件或目录
查看>>
iOS - OC NSData 数据
查看>>
Java web 开发填坑记 1 -如何正确的下载 eclipse
查看>>