样式优化:内容区域与头部布局调整
概述
管理后台布局优化的最后一个环节:调整内容区域的内边距与外边界,使主体内容与侧边栏、头部在视觉上分离。核心挑战是确保标签页(TagsView)在头部固定模式下不被内容滚动覆盖。
问题分析
当前问题
- 内容区域与侧边栏、头部平齐,缺乏层次感
- 切换头部固定模式时,标签页被遮挡或跟随内容滚动
- 内容区域需要独立的背景色和内边距
布局层级关系
┌────────────────────────────────────────────┐
│ Header(固定/非固定) │
├──────┬─────────────────────────────────────┤
│ │ TagsView(标签页) │ ← 需固定
│ Side │─────────────────────────────────────│
│ bar │ │
│ │ Content Area(内容区域) │ ← 需滚动
│ │ padding + 独立背景色 │
│ │ │
└──────┴─────────────────────────────────────┘
text
解决方案
布局结构调整
<!-- layouts/default.vue -->
<template>
<div class="app-layout">
<!-- 头部区域(固定定位) -->
<header class="app-header" :class="{ fixed: headerFixed }">
<AppLogo />
<AppHeader />
</header>
<!-- 标签页区域(跟随头部固定) -->
<div v-if="showTags" class="app-tags" :class="{ fixed: headerFixed }">
<TagsView />
</div>
<!-- 主体内容区域 -->
<div class="app-main">
<Sidebar />
<div class="app-content">
<RouterView v-slot="{ Component }">
<Transition name="fade" mode="out-in">
<component :is="Component" />
</Transition>
</RouterView>
</div>
</div>
</div>
</template>
vue
CSS 样式调整
// 头部固定模式
.app-header.fixed {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
}
// 标签页跟随头部固定
.app-tags.fixed {
position: fixed;
top: 50px; // header 高度
left: 0;
right: 0;
z-index: 99;
}
// 主体内容区域
.app-main {
display: flex;
padding-top: 0; // 非固定模式
&.has-fixed-header {
padding-top: 50px; // header 高度
}
&.has-fixed-header.has-tags {
padding-top: 100px; // header + tags 高度
}
}
// 内容区域(独立滚动)
.app-content {
flex: 1;
padding: 16px;
background-color: var(--el-bg-color-page);
overflow-y: auto;
height: calc(100vh - var(--header-height));
}
scss
关键计算
// 动态计算内容区域的 padding-top
const contentPaddingTop = computed(() => {
let top = 0
if (headerFixed.value) top += 50 // header 高度
if (showTags.value) top += 40 // tags 高度
return `${top}px`
})
typescript
样式效果
// 内容区域优化
.app-content {
// 内边距
padding: 16px;
// 独立背景色(灰色,与头部白色区分)
background-color: #f5f7fa;
// 独立滚动容器
overflow-y: auto;
}
scss
布局模式对比
| 模式 | Header | TagsView | 内容滚动 |
|---|---|---|---|
| 默认 | 静态 | 隐藏 | 页面整体滚动 |
| 固定头部 | Fixed | 隐藏 | 内容区独立滚动 |
| 固定头部+标签 | Fixed | Fixed | 内容区独立滚动 |
实践要点
- 标签页需要独立于内容区域的滚动容器,不能随内容一起滚动
- 内容区域加上
padding和灰色背景后,与头部的白色形成视觉层次 - 头部固定模式切换时,动态调整内容区域的
padding-top值 - 使用 CSS 变量(
--header-height)统一管理高度值,便于全局调整 - 测试时需验证:头部固定/非固定、标签页显示/隐藏四种组合状态
↑