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 推广

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

相关推荐
Apifox44 分钟前
Apifox 11 月更新|AI 生成测试用例能力持续升级、JSON Body 自动补全、支持为响应组件添加描述和 Header
前端·后端·测试
木易士心1 小时前
深入剖析:按下 F5 后,浏览器前端究竟发生了什么?
前端·javascript
在掘金801101 小时前
vue3中使用medium-zoom
前端·vue.js
xump1 小时前
如何在DevTools选中调试一个实时交互才能显示的元素样式
前端·javascript·css
折翅嘀皇虫1 小时前
fastdds.type_propagation 详解
java·服务器·前端
Front_Yue1 小时前
深入探究跨域请求及其解决方案
前端·javascript
wordbaby1 小时前
React Native 进阶实战:基于 Server-Driven UI 的动态表单架构设计
前端·react native·react.js
抱琴_1 小时前
【Vue3】我用 Vue 封装了个 ECharts Hooks,同事看了直接拿去复用
前端·vue.js
风止何安啊1 小时前
JS 里的 “变量租房记”:闭包是咋把变量 “扣” 下来的?
前端·javascript·node.js
Danny_FD1 小时前
用 ECharts markLine 标注节假日
前端·echarts