
本文旨在详细讲解如何在flexbox布局中实现一个经典三列布局,其中左右两侧列保持固定并占满整个视口高度,而中间内容区域则允许独立滚动。我们将深入探讨如何巧妙运用css的`position: sticky`属性结合视口单位`vh`,以构建一个兼具功能性和良好用户体验的布局方案,并提供完整的代码示例及注意事项。
布局挑战与需求分析
在现代Web开发中,实现复杂布局是常见需求。其中一种挑战是在一个弹性容器(Flex Container)中,需要将部分子元素固定在视口中,而其他子元素则可以随页面滚动。具体场景是构建一个三列布局:左右两列(A和C)需要始终保持在屏幕上,高度与视口一致,不随页面滚动而移动;而中间列(B)则包含大量内容,需要能够独立滚动。
传统的position: fixed或position: absolute在处理这种场景时存在局限性。fixed元素会脱离文档流,定位时需要精确的left、right值,这在外部元素宽度不确定或需要响应式布局时变得困难。absolute元素则相对于其最近的定位祖先,如果祖先元素本身滚动,absolute元素也会随之滚动,无法满足固定需求。此外,display: flex作为容器的布局方式也必须被保留。
核心解决方案:position: sticky与vh单位
解决上述挑战的关键在于结合使用CSS的position: sticky属性和视口高度单位vh。
position: sticky:
position: sticky是一种混合定位模式,它结合了position: relative和position: fixed的特性。元素在未达到指定滚动阈值时表现为relative,一旦滚动到阈值,则表现为fixed,固定在视口中。配合top: 0(或bottom、left、right),可以指定元素在何时开始“粘滞”。在本例中,top: 0意味着当元素滚动到距离视口顶部0像素时,它将固定在那里。重要前提:sticky元素必须在其可滚动的父容器内。如果父容器没有滚动条,或者其overflow属性设置为hidden、scroll或auto(且内容没有溢出),sticky效果可能不生效。在本例中,我们希望左右两列相对于body的滚动而固定,因此它们将“粘滞”在视口中。
100vh 单位:
vh(viewport height)是一个相对单位,1vh等于视口高度的1%。因此,height: 100vh意味着元素的高度将精确等于当前视口的高度。这确保了左右两列始终占满整个屏幕高度。
逐步实现
下面我们将通过具体的HTML结构和CSS样式来构建这个布局。
1. HTML 结构
我们采用一个简单的三列Flex容器结构:
Flex容器中固定两列 A
固定列B
可滚动内容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.
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
以上就是如何在Flex容器中固定两列,实现中间列滚动的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1597568.html赞 (0)打赏微信扫一扫
支付宝扫一扫
微信扫一扫
支付宝扫一扫