0

0

Flexbox布局实现固定头部、动态主内容与可滚动区域的100vh布局教程

聖光之護

聖光之護

发布时间:2025-11-10 11:32:27

|

205人浏览过

|

来源于php中文网

原创

flexbox布局实现固定头部、动态主内容与可滚动区域的100vh布局教程

本教程详细阐述如何利用Flexbox构建一个高度为视口100%(100vh)的布局,其中包含固定高度的头部、动态调整高度的主内容区域,以及主内容内部可独立滚动的子元素。核心在于通过巧妙运用`min-height: 0`属性解决Flex容器内子元素溢出导致整个页面滚动而非局部滚动的问题,确保布局的精确控制与用户体验。

在现代Web开发中,实现一个全屏高度(100vh)的布局是常见的需求。这种布局通常包含一个固定高度的页眉(header),以及一个占据剩余空间并可能包含可滚动内容的页脚(main content)。当主内容区域的子元素内容过多时,我们期望只有该子元素自身出现滚动条,而不是导致整个页面溢出滚动。本教程将深入探讨如何使用Flexbox精确实现这一布局模式。

布局需求分析

我们的目标布局需要满足以下条件:

  1. 根容器(Wrapper):高度为100vh,并作为Flex容器。
  2. 头部(Header):高度由其内容决定(或固定高度),不随Flex容器的剩余空间变化而伸缩。
  3. 主内容区域(Main Content):占据根容器中除头部之外的所有垂直空间。
  4. 主内容区域的子元素
    • 如果其内容高度超过主内容区域的可用高度,应在该子元素内部出现垂直滚动条。
    • 如果其内容高度未超过可用高度,则应填充可用空间。

Flexbox基础概念回顾

在深入解决方案之前,我们简要回顾几个关键的Flexbox属性:

  • display: flex:将元素定义为Flex容器。
  • flex-direction: column / row:定义Flex项目的排列方向。
  • flex-grow: 1:允许Flex项目根据可用空间进行伸缩,数值越大,占据空间比例越大。
  • flex-shrink: 0:防止Flex项目缩小。
  • overflow-y: scroll:当内容溢出时,在垂直方向显示滚动条。

常见问题:子元素溢出导致页面滚动

在没有正确配置的情况下,一个常见的布局问题是,当主内容区域内的子元素内容过多时,它会“推开”其父容器的边界,导致整个页面(body或html)出现滚动条,而不是期望的局部滚动。这通常发生在Flex容器的子元素设置了flex-grow: 1,但其内部的可滚动子元素却无法正确限制自身高度时。

例如,考虑以下结构:

在这个例子中,main元素是modal的子元素,并设置了flex-grow: 1以占据剩余空间。main内部的div.flex-grow.overflow-y-scroll也尝试占据其父级(main的W-1/3子元素)的剩余空间并启用滚动。然而,如果div.h-screen.bg-green-300的高度被设置为h-screen(100vh),它将尝试占据整个视口高度,这远超其父级div.flex-grow.overflow-y-scroll的可用高度,从而导致整个页面溢出。

问题核心在于,Flex容器的子元素在默认情况下,其最小尺寸(min-height或min-width)是根据其内容自动计算的。当一个Flex项目内部有非常大的内容时,即使它被设置为flex-grow: 1,其默认的min-height: auto或min-width: auto可能会阻止它缩小到内容所需的最小尺寸以下,从而导致溢出。

解决方案:min-height: 0

解决这个问题的关键在于为作为Flex项目的主内容区域(main元素)显式设置min-height: 0。

为什么min-height: 0有效?

当一个Flex容器的子元素被设置为flex-grow: 1时,它会尝试占据所有可用空间。然而,Flex项目的默认min-height(或min-width,取决于flex-direction)是auto。这意味着Flex项目不会缩小到其内容的固有尺寸以下。如果其内容(例如,一个非常高的子元素)导致其固有高度非常大,那么即使父容器尝试限制其高度,它也可能无法正确缩小,从而导致内容溢出父容器,进而溢出到整个页面。

通过将main元素(作为modal的Flex子项)的min-height设置为0,我们告诉浏览器,这个Flex项目可以缩小到0高度。这允许flex-grow: 1属性在计算可用空间时,能够正确地将main元素的高度限制在其父容器(modal)的剩余空间内。一旦main的高度被正确限制,其内部的可滚动子元素就能根据main的实际高度来计算自己的可用空间,从而激活其自身的overflow-y: scroll。

完整代码示例

下面是一个实现了固定头部、动态主内容和可滚动内部元素的Flexbox布局示例。

Header

标题1

这是一个非常长的内容块,旨在测试滚动功能。当父容器的可用空间不足以容纳所有内容时,此区域应该出现滚动条。

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

PPT.AI
PPT.AI

AI PPT制作工具

下载

...重复更多内容以确保溢出...

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

标题2

这是第二个内容块,内容较少,应该会填充整个可用空间,不会出现滚动条。

标题3

第三个内容块。内容同样很多,期待在这里看到独立的滚动条。

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

/* 基础Flexbox和TailwindCSS辅助类 */
.flex {
  display: flex;
}

.h-screen {
  height: 100vh; /* 视口高度 */
}

.h-36 {
  height: 9rem; /* 固定头部高度 */
}

.min-h-0 {
  min-height: 0px; /* 关键:允许Flex项目缩小到0,从而正确计算可用空间 */
}

.w-1\/3 {
  width: 33.333333%; /* 占据父容器宽度的1/3 */
}

.flex-shrink-0 {
  flex-shrink: 0; /* 防止元素缩小 */
}

.flex-grow {
  flex-grow: 1; /* 允许元素占据所有可用空间 */
}

.flex-row {
  flex-direction: row; /* Flex项目水平排列 */
}

.flex-col {
  flex-direction: column; /* Flex项目垂直排列 */
}

.overflow-y-scroll {
  overflow-y: scroll; /* 垂直方向内容溢出时显示滚动条 */
}

/* 颜色辅助类 */
.bg-red-500 {
  background-color: rgb(239 68 68);
}

.bg-blue-400 {
  background-color: rgb(96 165 250);
}

.bg-yellow-500 {
  background-color: rgb(234 179 8);
}

.bg-green-300 {
  background-color: rgb(134 239 172);
}

代码解析

  1. .flex.h-screen.flex-col (根容器):

    • display: flex;:使其成为Flex容器。
    • height: 100vh;:设置其高度为整个视口的高度。
    • flex-direction: column;:使其子元素(header和main)垂直堆叠。
  2. header.h-36.flex-shrink-0 (头部):

    • height: 9rem;:固定头部高度。
    • flex-shrink: 0;:防止头部在可用空间不足时缩小。
  3. main.flex.min-h-0.flex-grow.flex-row (主内容区域):

    • display: flex;:使其成为Flex容器,其内部的三个div.w-1/3将水平排列。
    • min-height: 0px;:这是解决问题的关键。 它允许main元素作为modal的Flex子项,在计算可用空间时能够正确缩小到0,从而使其flex-grow: 1属性能够有效地占据modal中除header外的所有剩余垂直空间。
    • flex-grow: 1;:使main占据modal中所有剩余的垂直空间。
    • flex-direction: row;:使其内部的三个内容块水平排列。
  4. div.flex.w-1/3.flex-col (主内容区域内的列):

    • display: flex;:使其成为Flex容器。
    • width: 33.333333%;:使其占据main容器宽度的1/3。
    • flex-direction: column;:使其内部的p标签和可滚动div垂直堆叠。
  5. p.flex-shrink-0 (列内的标题):

    • flex-shrink: 0;:确保标题高度固定,不被压缩。
  6. div.flex-grow.overflow-y-scroll (列内可滚动区域):

    • flex-grow: 1;:使其占据其父容器(div.w-1/3)中除p标签外的所有剩余垂直空间。
    • overflow-y: scroll;:当其内容溢出时,在此元素内部显示垂直滚动条。由于其父容器(main)的高度已经被正确限制,这个div现在能够正确计算其可用高度,并在此高度内管理其内容的滚动。

注意事项与最佳实践

  • min-height: 0 vs min-width: 0: 如果你的主Flex容器(如本例中的main)的flex-direction是row,并且其子元素可能导致水平溢出,那么你可能需要设置min-width: 0来解决类似的问题。
  • Flexbox与Grid: 虽然Flexbox非常适合一维布局(行或列),但对于更复杂的二维布局(行和列同时存在),CSS Grid可能是更强大和直观的选择。然而,对于这种固定头部、动态主内容的场景,Flexbox完全能够胜任。
  • 内容自适应: 确保你的内容(特别是图片、视频等)能够在其容器内自适应,避免它们自身的固有尺寸再次导致溢出。例如,为图片设置max-width: 100%; height: auto;。
  • 浏览器兼容性: min-height: 0在现代浏览器中具有良好的兼容性。

总结

通过在Flex容器的子元素(此处为main)上应用min-height: 0,我们成功地解决了Flex项目默认min-height: auto可能导致的溢出问题。这使得flex-grow: 1能够正确计算并分配可用空间,从而确保内部可滚动区域能够在其预期的边界内正常工作,避免了整个页面的意外滚动。掌握这一技巧对于构建响应式和高度可控的Flexbox布局至关重要。

相关专题

更多
css
css

css是层叠样式表,用来表现HTML或XML等文件样式的计算机语言,不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

500

2023.06.15

css居中
css居中

css居中:1、通过“margin: 0 auto; text-align: center”实现水平居中;2、通过“display:flex”实现水平居中;3、通过“display:table-cell”和“margin-left”实现居中。本专题为大家提供css居中的相关的文章、下载、课程内容,供大家免费下载体验。

261

2023.07.27

css如何插入图片
css如何插入图片

cssCSS是层叠样式表(Cascading Style Sheets)的缩写。它是一种用于描述网页或应用程序外观和样式的标记语言。CSS可以控制网页的字体、颜色、布局、大小、背景、边框等方面,使得网页的外观更加美观和易于阅读。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

731

2023.07.28

css超出显示...
css超出显示...

在CSS中,当文本内容超出容器的宽度或高度时,可以使用省略号来表示被隐藏的文本内容。本专题为大家提供css超出显示...的相关文章,相关教程,供大家免费体验。

534

2023.08.01

css字体颜色
css字体颜色

CSS中,字体颜色可以通过属性color来设置,用于控制文本的前景色,字体颜色在网页设计中起到很重要的作用,具有以下表现作用:1、提升可读性;2、强调重点信息;3、营造氛围和美感;4、用于呈现品牌标识或与品牌形象相符的风格。

748

2023.08.10

什么是css
什么是css

CSS是层叠样式表(Cascading Style Sheets)的缩写,是一种用于描述网页(或其他基于 XML 的文档)样式与布局的标记语言,CSS的作用和意义如下:1、分离样式和内容;2、页面加载速度优化;3、实现响应式设计;4、确保整个网站的风格和样式保持统一。

594

2023.08.10

css三角形怎么写
css三角形怎么写

CSS可以通过多种方式实现三角形形状,本专题为大家提供css三角形怎么写的相关教程,大家可以免费体验。

556

2023.08.21

css设置文字颜色
css设置文字颜色

CSS(层叠样式表)可以用于设置文字颜色,这样做有以下好处和优势:1、增加网页的可视化效果;2、突出显示某些重要的信息或关键字;3、增强品牌识别度;4、提高网页的可访问性;5、引起不同的情感共鸣。

387

2023.08.22

vlookup函数使用大全
vlookup函数使用大全

本专题整合了vlookup函数相关 教程,阅读专题下面的文章了解更多详细内容。

28

2025.12.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.7万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.7万人学习

CSS教程
CSS教程

共754课时 | 17.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号