element-ui的el-dialog主体滚动的小技巧

发布时间 2023-07-05 15:32:36作者: 这样就好了

一. 场景

element-ui的el-dialog的主体内容变多的时候,应该需要滚动条,所以解决方式:

  1. 局部/全局设置样式;
  2. el-dialog源码改造。

注意:看完了解思路,掌握max-height和overflow:auto的联合使用,el-scroll的使用即可

二. 方案一

  • 仅针对el-dialog__body的部分做处理,
  • max-height:可以让内容少于自己限制的高度的时候,自己撑开,200px是自己自定义的
  • scss代码是全局的
  • 用法:
<el-dialog class="global-dialog"></el-dialog>
.global-dialog {
  .el-dialog__body {
    max-height: calc(100vh - 300px));
    overflow: auto;
  }
}

三. 方案二

利用固定容器最大高度和flex布局限制el-dialog__body

  • 用法:
<el-dialog class="global-dialog"></el-dialog>
.global-dialog {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  .el-dialog {
    margin: 0!important;
    max-height: calc(100% - 80px);
    display: flex;
    flex-direction: column;
    justify-content: center;
  }
  .el-dialog__body {
    overflow: auto;
  }
}

优点:这种方案,可以始终保持弹窗居中

四. 方案三

  • 重新创建dialog,覆盖原来element-ui的el-dialog,Vue.component('elDialog', myDialog)
  • 新写的myDialog组件prop属性"isScroll"决定了是否开启滚动
<div v-if="rendered" class="el-dialog__body">
          <el-scrollbar v-if="isScroll" :style="{ 'height': 'calc(90vh - 150px)' }">
            <slot />
          </el-scrollbar>
          <template v-else>
            <slot />
          </template>
</div>
// 必要的
//隐藏底部原始滚动条
/deep/ .el-scrollbar__wrap {
  overflow-x: hidden !important;
}

五. 优化

  • 使用方案一或者方案二,同时把原始滚动条的样式改成element-ui的
// 滚动条的宽度
::-webkit-scrollbar {
  // opacity: 0;
  transition: opacity 340ms ease-out;
  width: 6px;
  cursor: pointer;
  background-color: yellow;
  // &:hover {
  //   opacity: 1;
   
  // }
}

// 滚动条的设置
::-webkit-scrollbar-thumb {
  display: block;
  width: 100%;
  background-color: rgba(144,147,153,.3);
  transition: .3s background-color;
  border-radius: 4px;
  &:hover {
    background-color: rgba(144,147,153,.5);
  }
}