解决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的transition属性实现滑动效果
Aug 05 HTML / CSS
详解CSS3选择器:nth-child和:nth-of-type之间的差异
Sep 18 HTML / CSS
详解css3中 text-fill-color属性
Jul 08 HTML / CSS
HTML5 progress和meter控件_动力节点Java学院整理
Jul 06 HTML / CSS
使用phonegap检测网络状态的方法
Mar 30 HTML / CSS
详解rem 适配布局
Oct 31 HTML / CSS
Html5页面在微信端的分享的实现方法
Aug 30 HTML / CSS
为你的html5网页添加音效示例
Apr 03 HTML / CSS
HTML5几个设计和修改的页面范例分享
Sep 29 HTML / CSS
canvas简易绘图的实现(海绵宝宝篇)
Jul 04 HTML / CSS
html5 http的轮询和Websocket原理
Oct 19 HTML / CSS
五分钟学会HTML5的WebSocket协议
Nov 22 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 Google的translate API代码
2008/12/10 PHP
php 应用程序安全防范技术研究
2009/09/25 PHP
php 求质素(素数) 的实现代码
2011/04/12 PHP
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
jquery滚动组件(vticker.js)实现页面动态数据的滚动效果
2013/07/03 Javascript
jQuery实现批量判断表单中文本框非空的方法(2种方法)
2015/12/09 Javascript
对Js OOP编程 创建对象的一些全面理解
2016/07/26 Javascript
JavaScript中利用构造器函数模拟类的方法
2017/02/16 Javascript
nodejs 终端打印进度条实例代码
2017/04/22 NodeJs
win系统下nodejs环境安装配置
2017/05/04 NodeJs
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
vue实现todolist基本功能以及数据存储功能实例详解
2019/04/11 Javascript
javascript实现蒙版与禁止页面滚动
2020/01/11 Javascript
Python3学习笔记之列表方法示例详解
2017/10/06 Python
Python 实现使用dict 创建二维数据、DataFrame
2018/04/13 Python
对numpy中轴与维度的理解
2018/04/18 Python
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
2019/06/19 Python
Python json模块与jsonpath模块区别详解
2020/03/05 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
2020/04/10 Python
使用Python实现批量ping操作方法
2020/05/06 Python
keras打印loss对权重的导数方式
2020/06/10 Python
python查询MySQL将数据写入Excel
2020/10/29 Python
纯CSS3制作页面切换效果的实例代码
2019/05/30 HTML / CSS
HTML5表格_动力节点Java学院整理
2017/07/11 HTML / CSS
html5中的input新属性range使用记录
2014/09/05 HTML / CSS
加大码胸罩、内裤和服装:Just My Size
2019/03/21 全球购物
群众路线剖析材料
2014/02/02 职场文书
护理专业自荐信范文
2014/02/26 职场文书
公司经营目标责任书
2015/01/29 职场文书
《鲸》教学反思
2016/02/23 职场文书
SQL Server 数据库实验课第五周——常用查询条件
2021/04/05 SQL Server
关于ObjectUtils.isEmpty() 和 null 的区别
2022/02/28 Java/Android
搭建Yolov5服务器
2022/04/30 Servers