解决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 相关文章推荐
IE兼容css3圆角的实现代码
Jul 21 HTML / CSS
详解CSS3新增的背景属性
Dec 25 HTML / CSS
html5中去掉input type date默认样式的方法
Sep 06 HTML / CSS
HTML5 Canvas 起步(2) - 路径
May 12 HTML / CSS
html5 canvas 使用示例
Oct 22 HTML / CSS
HTML5实现经典坦克大战坦克乱走还能发出一个子弹
Sep 02 HTML / CSS
HTML5移动端手机网站开发流程
Apr 25 HTML / CSS
使用phonegap查找联系人的实现方法
Mar 31 HTML / CSS
canvas环形倒计时组件的示例代码
Jun 14 HTML / CSS
css3实现背景图片半透明内容不透明的方法示例
Apr 13 HTML / CSS
CSS实现隐藏搜索框功能(动画正反向序列)
Jul 21 HTML / CSS
HTML CSS 一个标签实现带动画的抖音LOGO
Apr 26 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
印尼林东PWN黄金曼特宁咖啡豆:怎么冲世界上最醇厚的咖啡冲煮教程
2021/03/03 冲泡冲煮
一个PHP操作Access类(PHP+ODBC+Access)
2007/01/02 PHP
php字符串截取中文截取2,单字节截取模式
2007/12/10 PHP
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
2013/07/18 PHP
PHP常用的排序和查找算法
2015/08/06 PHP
适用于初学者的简易PHP文件上传类
2015/10/29 PHP
详解PHP数组赋值方法
2015/11/07 PHP
详谈PHP程序Laravel 5框架的优化技巧
2016/07/18 PHP
thinkphp验证码的实现(form、ajax实现验证)
2016/07/28 PHP
PHP实现四种基础排序算法的运行时间比较(推荐)
2016/08/11 PHP
php array_merge_recursive 数组合并
2016/10/26 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
PHP var关键字相关原理及使用实例解析
2020/07/11 PHP
几个比较经典常用的jQuery小技巧
2010/03/01 Javascript
jQuery操作Select选择的Text和Value(获取/设置/添加/删除)
2013/03/06 Javascript
js获取当前日期代码适用于网页头部
2013/06/27 Javascript
jQuery 如何先创建、再修改、后添加DOM元素
2014/05/20 Javascript
10分钟学会写Jquery插件实例教程
2014/09/06 Javascript
JSON格式的键盘编码对照表
2015/01/29 Javascript
javascript父子页面通讯实例详解
2015/07/17 Javascript
jQuery+jsp下拉框联动获取本地数据的方法(附源码)
2015/12/03 Javascript
微信小程序 绘图之饼图实现
2016/10/24 Javascript
详解ES6中的let命令
2020/04/05 Javascript
Vue监听一个数组id是否与另一个数组id相同的方法
2018/09/26 Javascript
Vue中UI组件库之Vuex与虚拟服务器初识
2019/05/07 Javascript
jQuery实现手风琴效果(蒙版)
2020/01/11 jQuery
原生js生成图片验证码
2020/10/11 Javascript
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
CSS3 media queries + jQuery实现响应式导航
2016/09/30 HTML / CSS
CSS3实现复选框动画特效示例代码
2016/09/27 HTML / CSS
高中毕业自我鉴定范文
2013/10/02 职场文书
教师对学生的评语
2014/04/28 职场文书
派出所班子党的群众路线对照检查材料思想汇报
2014/10/01 职场文书
怎样写好工作计划
2019/04/10 职场文书
修辞手法有哪些?
2019/08/29 职场文书
Python批量解压&压缩文件夹的示例代码
2022/04/04 Python