关于segmentfault:仿写eldialog弹出全屏对话框效果点击自己以外的地方隐藏对话框

39次阅读

共计 1728 个字符,预计需要花费 5 分钟才能阅读完成。

问题形容

饿了么 UI 提供的 el-dialog 能够用来定制大的场景,就是 el-dialog 外面能够放很多货色,比方能够放表单表格 el-table 或 el-form 等。然而有时候谷歌浏览器款式是正确的,到 IE 浏览器外面,款式就会局部不失效。所以,我感觉如果场景不小的话,齐全能够用本人写的弹出对话框,不必饿了么 UI 中的 el-dialog。当然,如果你的我的项目不必思考去兼容 IE 倒也无所谓(心愿 IE 早点被淘汰吧)。

最终成果如下

代码如下

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

正文完
 0