解决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之边框多颜色Border-color属性使用示例
Oct 11 HTML / CSS
纯CSS实现菜单、导航栏的3D翻转动画效果
Apr 23 HTML / CSS
css3的过滤效果简单实例
Aug 03 HTML / CSS
css3类选择器之结合元素选择器和多类选择器用法
Mar 09 HTML / CSS
css3翻牌翻数字的示例代码
Feb 07 HTML / CSS
html5中如何将图片的绝对路径转换成文件对象
Jan 11 HTML / CSS
24个canvas基础知识小结
Dec 17 HTML / CSS
基于HTML5 的人脸识别活体认证的实现方法
Jun 22 HTML / CSS
html5清空画布方法(三种)
Oct 16 HTML / CSS
canvas如何绘制钟表的方法
Dec 13 HTML / CSS
CSS 制作波浪效果的思路
May 18 HTML / CSS
开发微信小程序之WXSS样式教程
Apr 18 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
windows下开发并编译PHP扩展的方法
2011/03/18 PHP
php calender(日历)二个版本代码示例(解决2038问题)
2013/12/24 PHP
php的array数组和使用实例简明教程(容易理解)
2014/03/20 PHP
javascript 流畅动画实现原理
2009/09/08 Javascript
Web 前端设计模式--Dom重构 提高显示性能
2010/10/22 Javascript
推荐25个超炫的jQuery网格插件
2014/11/28 Javascript
原生JS实现美图瀑布流布局赏析
2015/09/07 Javascript
jQuery实现仿QQ空间装扮预览图片的鼠标提示效果代码
2015/10/30 Javascript
Bootstrap中点击按钮后变灰并显示加载中实例代码
2016/09/23 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
2016/11/03 Javascript
bootstrapfileinput实现文件自动上传
2016/11/08 Javascript
微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例
2016/11/22 Javascript
js 性能优化之快速响应的用户界面
2017/02/15 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
2017/04/07 Javascript
浅谈webpack 自动刷新与解析
2018/04/09 Javascript
jquery-ui 进度条功能示例【测试可用】
2019/07/25 jQuery
JavaScript字符和ASCII实现互相转换
2020/06/03 Javascript
[48:48]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Dream TIME
2014/05/21 DOTA
[01:54]胎教DOTA2 准妈妈玩家现身中国区预选赛
2016/06/26 DOTA
[57:31]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第一场 2月1日
2021/03/11 DOTA
Python3基础之基本数据类型概述
2014/08/13 Python
Python学习笔记之解析json的方法分析
2017/04/21 Python
Python中的浮点数原理与运算分析
2017/10/12 Python
python实现简单五子棋游戏
2019/06/18 Python
Python 用matplotlib画以时间日期为x轴的图像
2019/08/06 Python
django model object序列化实例
2020/03/13 Python
Python文件名匹配与文件复制的实现
2020/12/11 Python
斯德哥尔摩通票:Stockholm Pass
2018/01/09 全球购物
汽车运用工程专业求职信
2014/06/18 职场文书
组工干部对照检查材料
2014/08/25 职场文书
国庆节标语大全
2014/10/08 职场文书
老干部工作汇报材料
2014/10/28 职场文书
Python实战之实现简易的学生选课系统
2021/05/25 Python
PHP中多字节字符串操作实例详解
2021/08/23 PHP
Pandas搭配lambda组合使用详解
2022/01/22 Python
SpringBoot+Redis实现布隆过滤器的示例代码
2022/03/17 Java/Android