仿写el-dialog弹出全屏对话框效果(点击自己以外的地方隐藏对话框)

992 阅读1分钟

问题描述

饿了么UI提供的el-dialog可以用来定制大的场景,就是el-dialog里面可以放很多东西,比如可以放表单表格el-table或el-form等。但是有时候谷歌浏览器样式是正确的,到IE浏览器里面,样式就会部分不生效。所以,我觉得如果场景不小的话,完全可以用自己写的弹出对话框,不用饿了么UI中的el-dialog。当然,如果你的项目不用考虑去兼容IE倒也无所谓(希望IE早点被淘汰吧)。

最终效果如下

效果动态图不明显,可以复制我贴出来的代码,运行一下,就比较直观了

代码如下

html

<template>
  <div id="app">
    <!-- 在点击按钮的回调中,去控制div的隐藏和显示 -->
    <el-button @click="showDialog">点击弹出对话框</el-button>
    <!-- 使用transition动画过渡一下,看起来不会太突兀 -->
    <transition name="fade">
      <!-- 外部的这个div,开启固定定位,设置宽高100%,这样的话,就是一个满屏幕的背景图了。
      给满屏的外部div绑定一个点击事件,这样点击的话,就可以控制满屏的消失与隐藏。但是如果只是这样写的话。
      就会导致点击内部的内容区div也会使得整体的隐藏。因为事件会冒泡,点击内部的div也相当于点击了外部的div。
      这种效果,显然不是我们想要的效果,所以我们需要阻止内部的div的冒泡事件 @click.stop 直接加上就行了,这种写法
      会比较方便一些,当然也可以使用传统写法,@click.stop="fn" 在fn的回调中直接return,结束这个事件,不做事情  -->
      <div class="dialog" v-if="isShowDialog" @click="outClick">
        <!-- <div class="content" @click.stop="fn">  fn(){ return }  // 传统写法 -->
        <div class="content" @click.stop>  <!-- 简便写法 -->
          欢迎光临我的博客哦...
          <i class="el-icon-close" @click="iconClick"></i> <!-- 内部当然也要有关掉的方式,所以加上一个点击关闭 -->
        </div>
      </div>
    </transition>
  </div>
</template>

js

<script>
export default {
  name: "app",
  data() {
    return {
      isShowDialog: false,
    };
  },
  methods: {
    showDialog() {
      this.isShowDialog = true;
    },
    outClick(){
      this.isShowDialog = false;
    },
    iconClick(){
      this.isShowDialog = false
    }
  },
};
</script>

css

<style lang="less" scoped>
#app {
  width: 100%;
  height: 100%;
  .dialog {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 0, 0, 0.5);
    z-index: 999;
    display: flex;
    justify-content: center;
    align-items: center;
    .content {
      width: 240px;
      height: 200px;
      display: flex;
      justify-content: center;
      align-items: center;
      background: #fff;
      border-radius: 8px;
      box-sizing: border-box;
      padding: 20px;
      position: relative;
      i {
        font-size: 20px;
        cursor: pointer;
        color: #baf;
        position: absolute;
        top: 8px;
        right: 8px;
      }
    }
  }
}
// 控制淡入淡出效果
.fade-enter-active,
.fade-leave-active {
  transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {
  opacity: 0;
}
</style>

随手记录一下