解决flex布局中子项目尺寸不受flex-shrink限制


Posted in HTML / CSS onMay 11, 2022

预期是写一个如下所示的布局内容:

解决flex布局中子项目尺寸不受flex-shrink限制

即有一个固定高度的外部容器,顶部的header已知高度,在header占据了固定高度后,剩下的都分给body部分。因此采用flex布局,header设置flex-shrink为0,不自动收缩,body则flex-shrink为1,使其高度压缩为剩余高度。这个操作看起来挺符合直觉的。
然后在上述的body中有个content-wrapper内容块,设置height: 100%以及overflow: auto来让他高度占满父容器并且内容过多时生成滚动条。

demo代码如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>测试pre标签</title>
        <style>
            * {
                padding: 0;
                margin: 0;
            }
            html, body {
                height: 100%;
            }

            .container {
                width: 800px;
                height: 500px;
                display: flex;
                flex-direction: column;
            }
            .header {
                height: 100px;
                background-color: rgb(226, 110, 110);
                flex-shrink: 0;
            }
            .body {
                flex-shrink: 1;
                background-color: rgb(146, 146, 223);
            }

            .content-wrapper {
                height: 100%;
                overflow: auto;
            }
        </style>
    </head>
<body>

    <div class="container">
        <div class="header">Header</div>
        <div class="body">
            <div class="content-wrapper">
                <div style="height: 1000px">很多很多的内容</div>
            </div>
        </div>
    </div>

</body>
</html>

但最终效果确实如此:

解决flex布局中子项目尺寸不受flex-shrink限制

很明显body的高度并没有被限制,实际的高度是子元素的内容高度。

So why? 用搜索引擎搜了许久没找到理想的答案,这种问题确实也很难以表述。我现在真正想知道的是:为什么我给flex布局中的子项目设置了flex-shrink: 1,但它却没按我预期的表现呢。网络上相关的资料都仅仅告知如使用的,对于我想知道的,最适合的资料应该是翻flex这块的实现标准。

依据https://www.w3.org/TR/css-flexbox-1/一节中的描述,首先是这么句话:

Note: The auto keyword, representing an automatic minimum size, is the new initial value of the min-width and min-height properties.

可知弹性项目的min-widthmin-height的默认值是auto,并不同于其他布局中的情况(默认为0)。

再往下来看:

To provide a more reasonable default minimum size for flex items, the used value of a main axis automatic minimum size on a flex item that is not a scroll container is a content-based minimum size; for scroll containers the automatic minimum size is zero, as usual.

这段话描述了在主轴方向上,上述的auto值应该如何计算弹性项目的宽/高度(我的例子中是flex-direction: column,因此主轴为垂直方向,关注点是min-height)。由上可知,对于弹性项目如果其是非滚动容器,min-height值为内容高度;反之则是0。

综上,demo中的问题,修改方法之一就是,将div.body变为滚动容器,即设置overflowscrollauto或者hidden(没错hidden属性也是,因为hidden只是隐藏溢出的内容不提供滚动条,但仍然可以通过js控制里边的内容来达到滚动效果,所以该情况也是滚动容器)。另一种方式是我们可以直接覆盖min-height的默认值,即显示设置min-height: 0 也能达到目的。

到此这篇关于flex布局中子项目尺寸不受flex-shrink限制的问题解决的文章就介绍到这了!

 

Tags in this post...

HTML / CSS 相关文章推荐
CSS3 clip-path 用法介绍详解
Mar 01 HTML / CSS
CSS3教程:边框属性border的极致应用
Apr 02 HTML / CSS
25个CSS3动画按钮和菜单教程分享
Oct 03 HTML / CSS
纯CSS3实现鼠标悬停提示气泡效果
Feb 28 HTML / CSS
CSS3+JavaScript实现炫酷呼吸效果的示例代码
Jun 15 HTML / CSS
详解使用HTML5的classList属性操作CSS类
Oct 13 HTML / CSS
web页面录屏实现
Feb 12 HTML / CSS
整理的15个非常有用的 HTML5 开发教程和速查手册
Oct 18 HTML / CSS
html5的canvas实现3d雪花飘舞效果
Dec 27 HTML / CSS
谈一谈HTML5本地存储技术
Mar 02 HTML / CSS
HTML5语义化元素你真的用对了吗
Aug 22 HTML / CSS
CSS 实现角标效果的完整代码
Jun 28 HTML / CSS
css3 选择器
May 11 #HTML / CSS
六个好看实用的 HTML + CSS 后台登录入口页面
HTML CSS 一个标签实现带动画的抖音LOGO
常用的文件对应的MIME类型汇总
Apr 26 #HTML / CSS
通过feDisplacementMap和feImage实现水波特效
什么是css原子化,有什么用?
Apr 24 #HTML / CSS
css3 文字断裂效果
You might like
php使用websocket示例详解
2014/03/12 PHP
PHP编程中尝试程序并发的几种方式总结
2016/03/21 PHP
PHP数据库处理封装类实例
2016/12/24 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
2018/05/28 PHP
js模拟实现Array的sort方法
2007/12/11 Javascript
JavaScript Cookie 直接浏览网站分网址
2009/12/08 Javascript
取选中的radio的值
2010/01/11 Javascript
13个绚丽的Jquery 界面设计网站推荐
2010/09/28 Javascript
js运动框架_包括图片的淡入淡出效果
2013/05/11 Javascript
Jquery attr(&quot;checked&quot;) 返回checked或undefined 获取选中失效
2013/10/10 Javascript
Js表格万条数据瞬间加载实现代码
2014/02/20 Javascript
javascript定义变量时带var与不带var的区别分析
2015/01/12 Javascript
深入理解JavaScript系列(49):Function模式(上篇)
2015/03/04 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
js+CSS实现模拟华丽的select控件下拉菜单效果
2015/09/01 Javascript
js动态生成Html元素实现Post操作(createElement)
2015/09/14 Javascript
bootstrap网格系统使用方法解析
2017/01/13 Javascript
javascript 删除数组元素和清空数组的简单方法
2017/02/24 Javascript
React Native第三方平台分享的实例(Android,IOS双平台)
2017/08/04 Javascript
VUE2.0中Jsonp的使用方法
2018/05/22 Javascript
详解Vue中组件传值的多重实现方式
2019/08/16 Javascript
JS Web Flex弹性盒子模型代码实例
2020/03/10 Javascript
vue滑动吸顶及锚点定位的示例代码
2020/05/10 Javascript
[01:00:17]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第二场 1月25日
2021/03/11 DOTA
设置python3为默认python的方法
2018/10/31 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
2018/12/06 Python
pyqt实现.ui文件批量转换为对应.py文件脚本
2019/06/19 Python
python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
2019/07/03 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
2019/09/26 Python
Tensorflow训练MNIST手写数字识别模型
2020/02/13 Python
介绍一下EJB的体系结构
2012/08/01 面试题
高中三年学习生活的自我评价
2013/10/10 职场文书
求职信模板怎么做
2014/01/26 职场文书
学校交通安全责任书
2014/08/25 职场文书
居安思危观后感
2015/06/11 职场文书
对PyTorch中inplace字段的全面理解
2021/05/22 Python