美文网首页
做一个可移动的弹窗(VUE)

做一个可移动的弹窗(VUE)

作者: 陈桑 | 来源:发表于2021-11-02 10:59 被阅读0次

前言:这里做一个可移动的弹窗,因为项目中使用到,且在写的时候发现很多坑。希望以后用到能够避免踩坑,特此记录。
示例:

可移动的弹窗示例

可移动的弹窗组件:

<template>
  <div class="dialogView">
    <div class="dialogBox" ref="dialogEl" :style="{marginLeft:ml,marginTop:mt}">
      <header class="dialogHeader" @mousedown="mouseDown">
        <el-button @click="closeDialog">关闭</el-button>
      </header>
      <slot></slot>
    </div>
  </div>
</template>

<script>
export default {
  name: "moveDialog",
  props: {},
  data() {
    return {
      ml:'20%',
      mt:'10%',
      dialogB: false,
    };
  },
  mouonted() {},
  methods: {
    closeDialog(){
      this.ml='20%';
      this.mt='10%';
      return this.$emit('close')
    },
    mouseDown(e){
      let windowH = window.innerHeight;//获取浏览器的可用高度
      // let windowW = window.innerWidth;//获取浏览器的可用宽度
      let el = this.$refs.dialogEl;//获取需要拖拽移动的容器
      var disX = e.clientX - el.offsetLeft;
      var disY = e.clientY - el.offsetTop;
      this.dialogB = true;
      document.onselectstart = function () {return false} // 使用js禁止用户选中网页上的内容(解决拖动会选中文字的问题,来源:https://blog.csdn.net/china_skag/article/details/41648647)
      document.onmousemove = (e) => {
        if (!this.dialogB) return false
        let left = e.clientX - disX
        let top = e.clientY - disY
        if (top < 0 || top > windowH - 40) return false;//当到达顶部或者底部时就不让继续拖动了
        this.ml = left + 'px'
        this.mt = top + 'px'
      }
      document.onmouseup = () => {
        if (!this.dialogB) return false
        this.dialogB = false
      }
    },
  },
};
</script>

<style scoped lang="scss">
.dialogView{
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  background-color: rgba(0,0,0,.5);
  .dialogBox{
    width: 60%;
    height: 50%;
    background-color: #ffffff;
    .dialogHeader{
      height: 40px;
      cursor: all-scroll;
      display: flex;
      flex-direction: row-reverse;
      box-shadow: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04)
    }
  }
}
</style>

这里我没有使用弹性布局使弹窗组件进行居中,因为在设置后会和距离冲突。应该可以加一个动态的类,在鼠标摁下事件触发时把该类去除。
使用组件:
引入:

import moveDialog from '@/components/moveDialog.vue'// 引入组件

注册为局部组件:

components: {
    moveDialog,//注册为局部组件
},

创建一个变量记录显示隐藏

data(){
      return{
          dialogShow:false,//创建一个记录弹窗显示隐藏的变量
      }
  },

在template内使用组件:

<div v-show = 'dialogShow'>
      <!-- 接收组件发射出来的关闭事件 -->
      <moveDialog @close = "closeDialog" >
        <h3>这里面可以放任何的东西,所谓弹窗的内容。</h3>
      </moveDialog>
    </div>

关闭弹窗:

  methods:{
      // 关闭弹窗(子组件发射出来的自定义事件)
      closeDialog(){
          this.dialogShow = false;
      },
  },

代码都加了注释,很容易看懂。为了以后方便使用,特别记录。

相关文章

  • 做一个可移动的弹窗(VUE)

    前言:这里做一个可移动的弹窗,因为项目中使用到,且在写的时候发现很多坑。希望以后用到能够避免踩坑,特此记录。示例:...

  • vue 弹窗可拖拽

    vue 弹窗可拖拽 通过自定义指令实现

  • Vue 实现可拖拽弹窗

    一、实现原理 1、获取鼠标在div中的位置2、设置 div 的 left 和 top 使其跟随鼠标位置移动,达到拖...

  • vue编写可推拽的弹窗

    1. 前言 早期在深圳工作的时候编写过一个可推拽的vue弹窗组件,实现的代码和写法有些简陋和不规范。最近回武汉工作...

  • Vue ,elment弹窗页面卡死问题

    问题:vue中设置弹窗页面,弹窗信息出来之后整个页面卡死,调试不报错 解决办法:在弹窗页面的el-dialog标签...

  • Mint-UI 快速开发移动客户端应用

    Mint UI提供基于vue.js 的移动端组件库,可快速开发移动客户端应用程序,移动端应用以网页访问的方...

  • UITapGestureRecognizer与didSelect

    需求要做一个这样的下拉弹窗 点击弹窗选中Cell 点击其他区域弹窗消失 贴代码 解决冲突代码 这个是UIGest...

  • vue3中vue.extend的替代方案

    在vue3中已经不再支持vue.extend,那用vue.extend实现的全局弹窗之类的功能那vue3的替代方案...

  • dialog弹窗的一些规范

    1.如果想要写一个弹窗,并且新增add.vue和编辑edit.vue想公用一个弹窗可以这样用。1.在父组件里面去声...

  • iOS 半透明弹窗

    移动弹窗基础知识浅析——IOS 弹窗体系主流 APP 上的半透明弹窗效果: GitHub 第三方框架 类似样式的第...

网友评论

      本文标题:做一个可移动的弹窗(VUE)

      本文链接:https://www.haomeiwen.com/subject/mhozaltx.html