现在,我希望这里面的内容在这个section内部溢出滚动,但section本身必须保持相同的高度。如果你运行这个emmet,就可以看到问题:
文章标题
一些内容
文章标题
一些内容
文章标题
一些内容
文章标题
一些内容
本教程详细探讨如何构建具有固定头部、侧边栏和动态可滚动内容区域的网页布局。文章将介绍两种核心解决方案:一是利用视口高度(`vh`)和弹性布局实现内部区域滚动,适用于需要特定区域独立滚动且其他区域高度固定的场景;二是采用`position: fixed`定位固定元素,并调整主内容区域以适应浏览器原生滚动,适用于更传统的长页面布局。通过代码示例和关键css属性解析,帮助开发者掌握创建响应式且用户体验友好的复杂布局技巧。
在现代网页设计中,固定头部(Header)和侧边栏(Sidebar)是常见的布局元素,它们能提供持久的导航和上下文信息。同时,内容区域(Content)需要灵活地容纳大量信息,并在必要时提供滚动功能。本教程旨在解决以下核心问题:
我们将通过两种主要的CSS布局策略来解决这些问题。
这种方案适用于需要将整个页面视为一个固定高度的容器(例如,100%视口高度),并在其中某个特定区域实现内部滚动,同时保持其他区域高度固定的场景。这对于实现类似“单页应用”或具有“吸附滚动”效果的页面非常有用。
全视口布局示例
HEADER
sidebar
现在,我希望这里面的内容在这个section内部溢出滚动,但section本身必须保持相同的高度。如果你运行这个emmet,就可以看到问题:
文章标题
一些内容
文章标题
一些内容
文章标题
一些内容
文章标题
一些内容
sidebar
* {
margin: 0;
box-sizing: border-box; /* 确保内边距和边框不增加元素总尺寸 */
}
header {
text-align: center;
background-color: red;
height: 100px; /* 固定头部高度 */
}
main {
height: calc(100vh - 100px); /* 关键:主内容区高度 = 视口高度 - 头部高度 */
display: flex; /* 使用Flexbox布局侧边栏和内容区 */
border: 2px solid red;
}
aside {
padding: 0 2em;
/* 侧边栏宽度可根据需要设定 */
}
section {
flex: 1; /* 关键:内容区占据剩余空间 */
overflow-y: scroll; /* 关键:内容溢出时在section内部垂直滚动 */
}
article {
background-color: lightblue;
border-top: 2px solid black;
padding-bottom: 40vh; /* 模拟大量内容,确保滚动条出现 */
}这种方法确保了头部和侧边栏始终可见,并且主内容区域的高度始终适配视口,内部内容则通过滚动条进行访问。
此方案更符合传统网页的滚动习惯,即整个页面(除固定元素外)通过浏览器原生的滚动条进行滚动。头部和侧边栏通过position: fixed属性保持固定。
固定元素与原生滚动布局示例
HEADER
sidebar
sidebar
现在,我希望这里面的内容在这个section内部溢出滚动,但section本身必须保持相同的高度。如果你运行这个emmet,就可以看到问题:
文章标题
一些内容
文章标题
一些内容
一些内容
一些内容
一些内容
一些内容
一些内容
一些内容
一些内容
一些内容
一些内容
一些内容
一些内容
一些内容
一些内容
一些内容
一些内容
一些内容
一些内容
一些内容
一些内容
一些内容
一些内容
一些内容
一些内容
一些内容
一些内容
一些内容
一些内容
文章标题
一些内容
文章标题
一些内容
* {
margin: 0;
box-sizing: border-box; /* 确保内边距和边框不增加元素总尺寸 */
}
header {
position: fixed; /* 关键:固定头部 */
top: 0;
left: 0;
width: 100%;
height: 100px; /* 固定头部高度 */
z-index: 999; /* 确保头部在最上层 */
text-align: center;
background-color: red;
}
aside {
position: fixed; /* 关键:固定侧边栏 */
top: 100px; /* 侧边栏从头部下方开始 */
width: 75px; /* 固定侧边栏宽度 */
height: calc(100vh - 100px); /* 侧边栏高度 = 视口高度 - 头部高度 */
z-index: 999; /* 确保侧边栏在最上层 */
overflow-y: auto; /* 如果侧边栏内容过多,自身可滚动 */
text-align: center;
background-color: grey;
}
.sidebar-left {
left: 0; /* 左侧边栏 */
}
.sidebar-right {
right: 0; /* 右侧边栏 */
}
main {
position: absolute; /* 关键:主内容区使用绝对定位,避免被固定元素遮挡 */
top: 100px; /* 主内容区从头部下方开始 */
left: 75px; /* 主内容区从左侧边栏右侧开始 */
width: calc(100% - 150px); /* 主内容区宽度 = 视口宽度 - 左右侧边栏宽度 */
min-height: calc(100% - 100px); /* 确保主内容区至少占据剩余视口高度 */
border: 2px solid red;
/* 实际内容会撑开main的高度,浏览器出现滚动条 */
}
article {
height: 350px; /* 关键:如果article内容也需要内部滚动,则需固定其高度 */
overflow-y: auto; /* 关键:article内部内容溢出时垂直滚动 */
background-color: lightblue;
border-top: 2px solid black;
}这种方法提供了更自然的滚动体验,用户习惯于使用浏览器的主滚动条来浏览长页面。
两种解决方案各有侧重:
全视口布局与内部区域滚动(方案一):
固定头部/侧边栏与浏览器原生滚动(方案二):

在实际开发中,应根据项目需求和用户体验目标来选择最合适的布局方案。理解vh、calc()、Flexbox、position: fixed和overflow等CSS属性是构建复杂且响应式布局的关键。始终记得使用box-sizing: border-box以简化盒模型计算。