解决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旋转——彩色扇子兼容firefox浏览器
Jun 04 HTML / CSS
css3 transform属性详解
Sep 30 HTML / CSS
使用CSS3的::selection改变选中文本颜色的方法
Sep 29 HTML / CSS
CSS3下的渐变文字效果实现示例
Mar 02 HTML / CSS
CSS3实现文字描边的2种方法(小结)
Feb 14 HTML / CSS
html5 标签
Jul 16 HTML / CSS
html5 svg 中元素点击事件添加方法
Jan 16 HTML / CSS
html5与css3小应用
Apr 03 HTML / CSS
使用jTopo给Html5 Canva中绘制的元素添加鼠标事件
May 15 HTML / CSS
利用HTML5 Canvas制作键盘及鼠标动画的实例分享
Mar 15 HTML / CSS
解析html5 canvas实现背景鼠标连线动态效果代码
Jun 17 HTML / CSS
使用layui实现左侧菜单栏及动态操作tab项的方法
Nov 10 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
虹吸式咖啡壶操作
2021/03/03 冲泡冲煮
PHP无限分类(树形类)
2013/09/28 PHP
php preg_replace替换实例讲解
2013/11/04 PHP
php压缩和解压缩字符串的方法
2015/03/14 PHP
php中实现字符串翻转的方法
2017/02/22 PHP
PHP从尾到头打印链表实例讲解
2018/09/27 PHP
jquery中实现简单的tabs插件功能的代码
2011/03/02 Javascript
基于jQuery的输入框在光标位置插入内容, 并选中
2011/10/29 Javascript
鼠标经过显示二级菜单js特效
2013/08/13 Javascript
浅谈JavaScript Math和Number对象
2015/01/26 Javascript
一道JS前端闭包面试题解析
2015/12/25 Javascript
javascript实现label标签跳出循环操作
2016/03/06 Javascript
神奇!js+CSS+DIV实现文字颜色渐变效果
2016/03/16 Javascript
Angular路由简单学习
2016/12/26 Javascript
jQuery实现可拖拽3D万花筒旋转特效
2017/01/03 Javascript
Node.js常用工具之util模块
2017/03/09 Javascript
微信小程序switch组件使用详解
2018/01/31 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
微信小程序中上传图片并进行压缩的实现代码
2018/08/28 Javascript
微信小程序实现收货地址左滑删除
2020/11/18 Javascript
JS获取当前时间的年月日时分秒及时间的格式化的方法
2019/12/18 Javascript
详解Vue3中对VDOM的改进
2020/04/23 Javascript
JS pushlet XMLAdapter适配器用法案例解析
2020/10/16 Javascript
Webpack的Loader和Plugin的区别
2020/11/09 Javascript
python操作CouchDB的方法
2014/10/08 Python
介绍Python的@property装饰器的用法
2015/04/28 Python
tensorflow实现简单逻辑回归
2018/09/07 Python
python实现淘宝购物系统
2019/10/25 Python
Bandier官网:奢侈、时尚前卫的健身服装首选目的地
2020/07/05 全球购物
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
法学求职信
2014/06/22 职场文书
党员群众路线个人整改措施思想汇报
2014/10/12 职场文书
小学教师2014年度工作总结
2014/12/03 职场文书
创业计划书之DIY自助厨房
2019/09/06 职场文书
对Keras自带Loss Function的深入研究
2021/05/25 Python
带你学习MySQL执行计划
2021/05/31 MySQL