element plus el-scrollbar嵌套,自定义命中滚动条

1 场景

后台管理系统,经典布局,固定头部

布局为头部区域(淡蓝色),侧边栏区域(淡粉色),内容区域(淡绿色),其中内容区域上部(黑线以上)为面包屑区域,内容区域下部(黑线以下)为实际内容区域

需求:

  1. 根据配置,内容区域可以整体纵向滚动
  2. 根据配置,内容区域下部(黑线以下)可以滚动

2 代码

js 复制代码
<template>
  <div class="page-container">
    <header class="header"></header>
    <div class="main-container">
      <div class="aside-container">
        <!-- 侧边栏 -->
      </div>
      <el-scrollbar
        view-class="scrollbar-view"
        :class="['content-container', { fixed: fixedHeader }]"
      >
        <div class="content-container-mask">
          <div class="content-container__head">
            <!-- 面包屑 -->
          </div>
          <div
            class="content-container__content"
            :class="{ fixed: fixedHeader }"
          >
            <!-- 内容区域 -->
            <el-scrollbar><div class="content"></div></el-scrollbar>
          </div>
        </div>
      </el-scrollbar>
    </div>
  </div>
</template>

<script lang="ts" setup>
const fixedHeader = ref(true);
</script>
<style lang="scss" scoped>
.page-container {
  width: 100vw;
  height: 100vh;
  display: flex;
  flex-direction: column;
  .header {
    width: 100%;
    height: 60px;
    background-color: lightblue;
  }
  .main-container {
    height: calc(100% - 60px);
    flex: 1;
    display: flex;

    .aside-container {
      width: 250px;
      height: 100%;
      background-color: lightpink;
    }
    .content-container {
      flex: 1;
      display: flex;
      flex-direction: column;
      background-color: lightgreen;
      &.fixed {
        //用于固定头部时命中内层el-scrollbar
        :deep(.scrollbar-view) {
          height: 100%;
        }
      }
      .content-container-mask {
        width: 100%;
        height: 100%;
        display: flex;
        flex-direction: column;
        .content-container__head {
          width: 100%;
          padding: 0 20px;
          border-bottom: 1px solid rgba(0, 0, 0, 0.3);
          height: 40px;
        }
        .content-container__content {
          width: 100%;
          flex: 1;
          &.fixed {
            min-height: calc(100% - 60px);
          }
          .content {
            height: 2000px;
          }
        }
      }
    }
  }
}
</style>

3 效果

固定头部: 命中实际内容区域的滚动条

不固定头部: 命中整个内容区域的滚动条

4 解释

如图,重点是给外层的el-scrollbar添加view-class="scrollbar-view"属性,然后用.scrollbar-view筛选到外层el-scrollbar容器div元素,让其高度填充满父元素高度,同时给实际的内容区域给一个min-height

可以给fixedHeader赋值false对比看以下,外层的el-scrollbar容器高度超出父元素高度,出现整体滚动条

5 推广

这种方法对于滚动条嵌套的情况据可以适用,比图下图中的另一种经典布局

相关推荐
陈随易9 小时前
bm2,Node.js 与 Bun 项目部署新选择
前端·后端·程序员
福兮说10 小时前
canvas 旋转图片的六个坑:四角被裁、Math.ceil 多出 1px 黑边、JPG 角发黑、翻转方向反了
前端·javascript·图像处理·canvas
传人once11 小时前
多图片上传预览功能如何写
前端·css·html·jquery·html5
Eric.4612 小时前
Wan‑Animate+MiniMax-H3 本地部署 AI 漫剧流水线:8G 显存动作迁移与动态分镜工程实战
前端·人工智能·comfyui·ai漫剧
库拉镜像AI牛牛13 小时前
短剧内容自动化生产:知漫剧工作室落地教程
大数据·服务器·前端·人工智能·语音识别
律宏阔13 小时前
Flutter 列表图片内存优化:CachedNetworkImage 与 ClipRRect 的取舍
前端·flutter
行者全栈架构师13 小时前
【鸿蒙心迹】相册文搜图工程化落地:HarmonyOS 7.0 端侧 AI 检索全链路实战与 5 个踩坑解法
前端
律宏阔13 小时前
Dart 3 Record:解决 Future.wait 异构返回值的类型问题
前端·flutter
Seraphina3614 小时前
DVWA(XSS Reflected/Stored High,CSRF Low)
前端·xss·csrf
默_笙15 小时前
🍔 中间件不只是打日志:四个钩子、一次短路,和自带的工具
前端·javascript