惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Secure Thoughts
雷峰网
雷峰网
罗磊的独立博客
T
The Blog of Author Tim Ferriss
阮一峰的网络日志
阮一峰的网络日志
量子位
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
云风的 BLOG
云风的 BLOG
人人都是产品经理
人人都是产品经理
GbyAI
GbyAI
Cisco Talos Blog
Cisco Talos Blog
Engineering at Meta
Engineering at Meta
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
A
About on SuperTechFans
D
Darknet – Hacking Tools, Hacker News & Cyber Security
The Cloudflare Blog
Know Your Adversary
Know Your Adversary
T
Threat Research - Cisco Blogs
Spread Privacy
Spread Privacy
D
DataBreaches.Net
T
The Exploit Database - CXSecurity.com
K
Kaspersky official blog
Cyberwarzone
Cyberwarzone
爱范儿
爱范儿
U
Unit 42
Security Latest
Security Latest
M
MIT News - Artificial intelligence
月光博客
月光博客
Scott Helme
Scott Helme
G
Google Developers Blog
有赞技术团队
有赞技术团队
T
Tor Project blog
宝玉的分享
宝玉的分享
Y
Y Combinator Blog
博客园 - Franky
H
Hackread – Cybersecurity News, Data Breaches, AI and More
aimingoo的专栏
aimingoo的专栏
The GitHub Blog
The GitHub Blog
V
V2EX
B
Blog
Apple Machine Learning Research
Apple Machine Learning Research
S
Securelist
博客园 - 三生石上(FineUI控件)
Blog — PlanetScale
Blog — PlanetScale
TaoSecurity Blog
TaoSecurity Blog
Stack Overflow Blog
Stack Overflow Blog
P
Proofpoint News Feed
腾讯CDC
D
Docker
Google Online Security Blog
Google Online Security Blog

张鑫旭-鑫空间-鑫生活

1分钟速度了解text-align match-parent声明 « 张鑫旭-鑫空间-鑫生活 光标的形状也能设置了,就是CSS caret-shape属性 « 张鑫旭-鑫空间-鑫生活 pretext与文字四面环绕效果的实现 « 张鑫旭-鑫空间-鑫生活 JSON.rawJSON方法的作用是什么? « 张鑫旭-鑫空间-鑫生活 如何使用CSS判断鼠标从哪个方向进入元素? « 张鑫旭-鑫空间-鑫生活 借助mediabunny纯JS实现视频水印、剪裁、合成等功能 « 张鑫旭-鑫空间-鑫生活 务必谨慎使用JS WeakRef弱引用 « 张鑫旭-鑫空间-鑫生活 CSS六边形头像的实现与蜂巢布局 « 张鑫旭-鑫空间-鑫生活 CSS corner-shape与背景底纹技术 « 张鑫旭-鑫空间-鑫生活 浅学WebTransport API:下一代Web双向通信技术 « 张鑫旭-鑫空间-鑫生活 HTML dialog元素新支持了closedBy属性 « 张鑫旭-鑫空间-鑫生活 HTML interestfor属性与悬停popover交互效果 « 张鑫旭-鑫空间-鑫生活 CSS3模拟window7炫酷界面效果展示 « 张鑫旭-鑫空间-鑫生活 图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活 纯js无图片无外链CSS图片幻灯片播放插件 « 张鑫旭-鑫空间-鑫生活 CSS border三角、圆角图形生成技术简介 « 张鑫旭-鑫空间-鑫生活 CSS “渐进增强”在web制作中常见应用举例 « 张鑫旭-鑫空间-鑫生活 让IE6/IE7/IE8浏览器支持CSS3属性 « 张鑫旭-鑫空间-鑫生活 jQuery – 高亮动态显示页面HTML代码插件 « 张鑫旭-鑫空间-鑫生活 翻译 – 逐渐消失的Flash网站 « 张鑫旭-鑫空间-鑫生活 CSS reset的重新审视 – 避免样式重置 « 张鑫旭-鑫空间-鑫生活 新浪微博插入话题后部分文字选中的js实现 « 张鑫旭-鑫空间-鑫生活 JavaScript实现http地址自动检测并添加URL链接 « 张鑫旭-鑫空间-鑫生活 CSS实现兼容性的渐变背景(gradient)效果 « 张鑫旭-鑫空间-鑫生活 CSS content内容生成技术以及应用 « 张鑫旭-鑫空间-鑫生活 CSS gradient渐变之webkit核心浏览器下的使用 « 张鑫旭-鑫空间-鑫生活 CSS渐变之CSS3 gradient在Firefox3.6下的使用 « 张鑫旭-鑫空间-鑫生活 区分IE8/IE7/IE6及其他浏览器-CSS “\9″hack « 张鑫旭-鑫空间-鑫生活 CSS实现跨浏览器兼容性的盒阴影效果 « 张鑫旭-鑫空间-鑫生活 CSS3&HTML5各浏览器支持情况一览表 « 张鑫旭-鑫空间-鑫生活 翻译 – CSS Sprites:实用技术还是生厌之物? « 张鑫旭-鑫空间-鑫生活 纯CSS实现易拉罐3D滚动效果 « 张鑫旭-鑫空间-鑫生活 纯CSS实现侧边栏/分栏高度自动相等 « 张鑫旭-鑫空间-鑫生活 CSS+JavaScript实现页面不同布局的切换 « 张鑫旭-鑫空间-鑫生活 JavaScript实现最简单的拖拽效果 « 张鑫旭-鑫空间-鑫生活 自己写的无图片版jQuery zxxbox弹出框插件 « 张鑫旭-鑫空间-鑫生活 中国古代道家思想与网页重构的思考 « 张鑫旭-鑫空间-鑫生活 让所有浏览器支持HTML5 video视频标签 « 张鑫旭-鑫空间-鑫生活 纯CSS实现各类气球泡泡对话框效果 « 张鑫旭-鑫空间-鑫生活 JS HEX十六进制与RGB, HSL颜色的相互转换 « 张鑫旭-鑫空间-鑫生活 CSS实现兼容性的渐变、高光等文字效果 « 张鑫旭-鑫空间-鑫生活 去除冗余 – 精简您的CSS样式代码 « 张鑫旭-鑫空间-鑫生活 对overflow与zoom”清除浮动”的一些认识 « 张鑫旭-鑫空间-鑫生活 jQuery Pagination Ajax分页插件中文详解 « 张鑫旭-鑫空间-鑫生活 absolute绝对定位的非绝对定位用法 « 张鑫旭-鑫空间-鑫生活 网页布局思想浅议-淘宝新版首页为实例 « 张鑫旭-鑫空间-鑫生活 回流与重绘:CSS性能让JavaScript变慢? « 张鑫旭-鑫空间-鑫生活 CSS float浮动的深入研究、详解及拓展(二) « 张鑫旭-鑫空间-鑫生活 CSS float浮动的深入研究、详解及拓展(一) « 张鑫旭-鑫空间-鑫生活 60个极富创造性的震撼的电影海报设计 « 张鑫旭-鑫空间-鑫生活 jQuery Lightbox(balupton版)图片展示插件讲解 « 张鑫旭-鑫空间-鑫生活 博客内嵌flash音乐播放器代码、下载与使用 « 张鑫旭-鑫空间-鑫生活 CSS3 animate实现图片墙3D翻转效果 « 张鑫旭-鑫空间-鑫生活 图片旋转效果的一些研究、jQuery插件及实例 « 张鑫旭-鑫空间-鑫生活 CSS3 border-image详解、应用及jQuery插件 « 张鑫旭-鑫空间-鑫生活 jQuery-两款不同原理的圆角插件讲解 « 张鑫旭-鑫空间-鑫生活 页面可用性之outline轮廓外框的一些研究 « 张鑫旭-鑫空间-鑫生活 CSS3 transition实现超酷图片墙动画效果 « 张鑫旭-鑫空间-鑫生活 HTML CSS列表元素ul,ol,dl的研究与应用 « 张鑫旭-鑫空间-鑫生活 jQuery图片文本滚动切换插件jCarousel中文翻译与详解 « 张鑫旭-鑫空间-鑫生活 酷酷的jQuery鼠标悬停图片放大切换显示效果 « 张鑫旭-鑫空间-鑫生活 IE6下z-index犯癫不起作用bug的初步研究 « 张鑫旭-鑫空间-鑫生活 checkbox复选框的一些深入研究与理解 « 张鑫旭-鑫空间-鑫生活 jQuery之使用slideToggle实现垂直下拉菜单 « 张鑫旭-鑫空间-鑫生活 jQuery-innerfade内部列表自动淡入淡出插件 « 张鑫旭-鑫空间-鑫生活 jQuery-火焰灯效果导航菜单 « 张鑫旭-鑫空间-鑫生活 IE下css bug集合-翻译自haslayout.net « 张鑫旭-鑫空间-鑫生活 翻译-IE7/8@font-face嵌入字体与文字平滑 « 张鑫旭-鑫空间-鑫生活 jQuery-马化腾产品设计与用户体验的一些技术实现 « 张鑫旭-鑫空间-鑫生活 像素的世界及其在web开发制作中的应用 « 张鑫旭-鑫空间-鑫生活 css行高line-height的一些深入理解及应用 « 张鑫旭-鑫空间-鑫生活 CSS实现圆角六色渐变自适应按钮详解 « 张鑫旭-鑫空间-鑫生活 我熟知的三种三栏网页宽度自适应布局方法 « 张鑫旭-鑫空间-鑫生活 jQuery照片图像剪裁插件Jcrop中文翻译详解 « 张鑫旭-鑫空间-鑫生活 Ajax Upload多文件上传插件翻译及中文演示 « 张鑫旭-鑫空间-鑫生活 告别图片—使用字符实现兼容性的圆角尖角效果beta版 « 张鑫旭-鑫空间-鑫生活 大小不固定的图片、多行文字的水平垂直居中 « 张鑫旭-鑫空间-鑫生活 jQuery boxy弹出层对话框插件中文演示及讲解 « 张鑫旭-鑫空间-鑫生活 JavaScript实现新浪微博文字放大显示动画效果 « 张鑫旭-鑫空间-鑫生活 翻译:让网络更快一些——最小化浏览器中的回流(reflow) « 张鑫旭-鑫空间-鑫生活 jQuery之addClasas与removeClass使用实例 « 张鑫旭-鑫空间-鑫生活 关于Google圆角高光高宽自适应按钮及其拓展 « 张鑫旭-鑫空间-鑫生活 JavaScript实现图片幻灯片滚动播放动画效果 « 张鑫旭-鑫空间-鑫生活 jQuery-鼠标经过显示大图并跟随鼠标效果插件 « 张鑫旭-鑫空间-鑫生活 关于gif图片(或png8)杂边锯齿的问题 « 张鑫旭-鑫空间-鑫生活 对html与body的一些研究与理解 « 张鑫旭-鑫空间-鑫生活 鲜为人知的一个解决兼容性问题的利器——小数 « 张鑫旭-鑫空间-鑫生活 搜狐白社会似iphone短信对话框效果的优化 « 张鑫旭-鑫空间-鑫生活 关于文字内容溢出用点点点(…)省略号表示 « 张鑫旭-鑫空间-鑫生活 jquery之append与insertBefore使用实例 « 张鑫旭-鑫空间-鑫生活 jQuery之图片关联伸缩效果 « 张鑫旭-鑫空间-鑫生活 jquery之图片左右切换动画效果 « 张鑫旭-鑫空间-鑫生活 jQuery之replace字符串替换实现不同尺寸图片切换 « 张鑫旭-鑫空间-鑫生活 jQuery-实现图片的放大镜显示效果 « 张鑫旭-鑫空间-鑫生活 jQuery-单击文字或图片内容放大显示效果插件 « 张鑫旭-鑫空间-鑫生活 reflection.js-实现图片投影倒影效果js插件 « 张鑫旭-鑫空间-鑫生活 jQuery-很酷的弹出层效果js插件 « 张鑫旭-鑫空间-鑫生活 复选框单选框与文字对齐问题的研究与解决 « 张鑫旭-鑫空间-鑫生活 css margin的相关属性,问题及应用 « 张鑫旭-鑫空间-鑫生活 IE6下png背景不透明问题的综合拓展 « 张鑫旭-鑫空间-鑫生活
Oh My God,CSS flex-basis原来有这么多细节 « 张鑫旭-鑫空间-鑫生活
张鑫旭,zhangxinxu · 2019-12-31 · via 张鑫旭-鑫空间-鑫生活

by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=9154
本文欢迎分享与聚合,全文转载就不必了,尊重版权,圈子就这么大,若急用可以联系授权。

//zxx: 为了演示方便,避免无谓的干扰,本文所有的尺寸均指水平尺寸,对应CSS均是宽度相关,例如width/min-width/max-width

以前的我对flex-basis不屑一顾,以为就是个浮于表面的CSS属性。

最近深入研究后才发现,自己那是朱砂当红土,珍珠当泥丸,钻石当玻璃,檀木当柴火——完全不识货!

在Flex布局中,一个Flex子项的宽度是由元素自身尺寸,flex-basis设置的基础尺寸,以及外部填充(flex-grow)或收缩(flex-shrink)规则3者共同决定的。

本文只要讨论前两者对尺寸的表现影响,如果您对第3者对尺寸影响有兴趣,则可以参考“CSS flex属性深入理解”这篇文章。

直接进入正题。

更新于2020-05-17
当初写这篇文章的时候是边研究边写的,现在再看看,描述和结论没问题,但是描述的逻辑比较混乱,实际上在Flex布局中,一个flex子项的最终尺寸是基础尺寸、弹性增长或收缩、最大最小尺寸限制共同作用的结果。

其中:

  • 基础尺寸由CSS flex-basis属性,width等属性以及box-sizing盒模型共同决定;
  • 弹性增长指的是flex-grow属性,弹性收缩指的是flex-shrink属性;
  • 最大最小尺寸限制指的是min-width/max-width等CSS属性,以及min-content最小内容尺寸。

最终尺寸计算的优先级是:

最大最小尺寸限制 > 弹性增长或收缩 > 基础尺寸

大家记住上面的尺寸应用规则,然后再看下面的研究细节,逻辑上会清晰很多。

更新于2021-02-07
随着近期Firefox改变了渲染策略(不再和IE一致),和Chrome/Safari浏览器保持了一致,我又重新审视了对flex-basis的理解,发现上面的理解某些细节还是有些问题。

例如,width属性应该归属于最小尺寸,不属于基础尺寸。

相关细节我会专门开一篇文章进行介绍。

一、flex-basis与盒模型

flex-basis的尺寸是作用在content-box上的,这个和width属性是一样的。

例如:

.flex-basis {
    padding: 1em;
    border: 1em solid deepskyblue;
    color: deepskyblue;
    flex-basis: 100px;
}

.width {
    padding: 1em;
    border: 1em solid deepskyblue;
    color: deepskyblue;
    width: 100px;
}

在外部尺寸够大,内容尺寸够小的情况下,两者的表现是一样的。

如下图示意:

flex-basic和width默认盒模型效果对比截图

我们可以通过设置box-sizing属性改变元素的盒模型,例如。

.flex-basis {
    padding: 1em;
    border: 1em solid deepskyblue;
    color: deepskyblue;
    flex-basis: 100px;
    box-sizing: border-box;
    word-break: break-all;
}

此时就可以看到内容展示宽度变小了,外部尺寸表现为100px

box-sizing:border-box效果

更新于2020-05-16
现在又跑了一遍demo页面,Chrome和Firefox浏览器都不是100px的宽度了,不是上面截图的效果,难道Chrome浏览器改了策略了?仔细一测试,发现原来是后面的那个的demo页面中flex-basic那两列没有设置word-break:break-all导致的。

但是,在IE11浏览器下,box-sizing:border-box是没有任何效果的。

IE11 box-sizing无效

这个细节知识点还是有点用的,在开发内部系统的PC项目上,例如阅文内部系统,兼容Chrome和Firefox是没问题的,但顶不住老板用IE浏览器,因此,需要兼容到window 7 Edge,也就是IE 11,这个时候,就要避免改变Flex子项的box-sizing属性值,当然,移动端项目可以不用想那么多。


您可以狠狠地点击这里:flex-basic与盒模型样式表现demo

二、深入理解flex-basis和width的关系

大家一定要搞清楚这样一个事实,在Flex布局中,子项设置width是没有直接效果的。

此时一定会有人反驳,我明明设置了width:100px就有效果啊!

对是有效果,但并不是width直接生效的,而是flex-basis的作用。

深入理解flex-basis:auto

flex-basis的默认值是auto,表示自动,也就是完全根据子列表项自身尺寸渲染。

自身尺寸渲染优先级如下:

min-width > || max-width > width > Content Size

同时,在Flex布局中,flex-basis优先级是比width高的(可以理解为覆盖)。

所以,flex-basiswidth同时设置了具体的数值,则width属性值直接被打入冷宫,在样式表现上完全被忽略。

例如:

<by-zhangxinxu>
    <item-basis-width>项目1</item-basis-width>
    <item-basis-width>项目2</item-basis-width>
    <item-basis-width>项目3</item-basis-width>
    <item-basis-width>项目4</item-basis-width>
</by-zhangxinxu>

CSS如下:

by-zhangxinxu {
    display: flex;
}
item-basis-width {
    padding: 1em;
    border: 1px solid deepskyblue;
    color: deepskyblue;
    box-sizing: border-box;
    width: 200px;
    flex-basis: 100px;
}

结果width:200px完全是一个盒饭角色,所谓盒饭角色,就是明明参与了这部电视剧,也吃了剧组的盒饭,但是观众完全就没有意识到他的存在。这里的width属性就是这种性质,代码中确实出现过,但是样式渲染却完全体现不出来。

如下图所示,宽度表现为100px

width属性被无视


回到主线这里,实际上,flex-basis值是auto的时候,width属性值也是被打入冷宫的,只是,这个时候,由于后宫放权,所以,冷宫也是有影响力的。什么意思呢?

flex-basis:auto的含义是,子项的基本尺寸根据其自身的尺寸决定。而这个自身尺寸与下面这几个方面有关:

  • box-sizing盒模型(这个已经介绍过了);
  • width/min-width/max-width等CSS属性设置;
  • content内容(min-content最小宽度);

所以下面两段Flex布局中的CSS就不难理解了:

item-width {
    width: 100px;
}

最终尺寸 = 自身尺寸 mix basis尺寸。

此时,自身尺寸为100px,basis尺寸按照自身尺寸来算(因为此时属性值是auto),因此最终尺寸是100px

item-basis {
    flex-basis: 100px;
}

最终尺寸 = 自身尺寸 mix basis尺寸。

此时,自身尺寸为content内容最小宽度,basis尺寸100px,因此最终尺寸是:如果content内容最小宽度不超过100px,则最终尺寸是100px,否则就是内容最小宽度。

记住上面的解释,我们再看下面几个例子,就会豁然开朗了。

案例1:相同表现

一个元素最小宽度超过100像素场景并不多,因此大部分场景下,flex-basiswidth表现是一致的。

例如下面这个对比案例:

<h4>1. flex-basis:100px</h4>
<by-zhangxinxu>
    <item-basis>项目1</item-basis>
    <item-basis>项目2</item-basis>
    <item-basis>项目3</item-basis>
    <item-basis>项目4</item-basis>
</by-zhangxinxu>
<h4>2. width:100px</h4>
<by-zhangxinxu>
    <item-width>项目1</item-width>
    <item-width>项目2</item-width>
    <item-width>项目3</item-width>
    <item-width>项目4</item-width>
</by-zhangxinxu>

一个设置width:100px,一个设置flex-basis:100px

item-width {
    width: 100px;
}
item-basis {
    flex-basis: 100px;
}

默认都是100px的展示,例如我的PC电脑显示器下:

100px效果示意

由于默认flex-shrink属性值是1,因此,容器宽度不足时候的弹性收缩效果也是一样的,如下GIF示意:

宽度表现一样的

眼见为实,您可以狠狠地点击这里:flex-basic与width的异同演示demo

案例2:不同表现

什么时候width:100pxflex-basis:100px表现不一样呢?就是最小内容宽度较大的时候,例如出现连续英文单词demo_by_zhangxinxu。

还是上面那个demo页面,点击任意某个子项,会改变元素里面的文字内容为demo_by_zhangxinxu。

此时就可以看到两者的差异了,如下图所示:

flex-basis和width的差异

因为此时content内容最小宽度超过了100px,于是flex-basis:100px按照了最小内容宽度显示了;但是width:100px把元素的尺寸限制得死死的,字符直接溢出容器之外。

要想两者表现一致,可以使用word-break:break-all使单词断开。

其实,本文一开始的“flex-basic与盒模型样式表现”这个demo就已经展现了flex-basiswidth属性的区别了。例如第4项设置的flex-basis值是100px,同时box-sizingborder-box,但是最终表现出来的尺寸却不是100px,却是个更大的宽度值,如下图所示:

尺寸不是100px

主要是因为这一项里面的内容,'basis:100px'会当做一个独立的单词,并作为此时flex-basis默认就有的最小宽度,这个宽度值等同于min-content的计算尺寸。

我们可以对比一下隔壁width:100px的效果,可以看到文字内容'width:100px'直接溢出到了容器之外。

width:100px飞出示意

更深入的案例:最小内容宽度、width和flex-basis同时满足

根据上面的分析(不考虑容器尺寸不足或溢出),我们可以得到结论:

  • width:100px + flex-basis:auto = 元素自身100px
  • content + flex-basis:100px = max(content, flex-basis) = 大于等于100px

再加上flex-basis优先级是比width高的结论,我们就可以得到:

  • content + width:100px + flex-basis:100px = content + flex-basis:100px = max(content, flex-basis) = 大于等于100px

事实究竟是不是这样呢?我们看一个实际的例子。

CSS和HTML代码分别如下,还是使用我最爱的深天空蓝:

by-zhangxinxu {
    display: flex;    
}
item-zxx {
    padding: 1em;
    border: 1em solid deepskyblue;
    color: deepskyblue;
    box-sizing: border-box;
}
item-zxx:nth-child(1) {
    width: 100px;    
}
item-zxx:nth-child(2) {
    flex-basis:100px;
}
item-zxx:nth-child(3) {
    width: 100px;
    flex-basis: 100px;
}
<by-zhangxinxu>
    <item-zxx>我仅设置了width:100px,没有设置了flex-basis:100px。</item-zxx>
    <item-zxx>我没有设置width:100px,但是设置了flex-basis:100px。</item-zxx>
    <item-zxx>我设置了width:100px,同时设置了flex-basis:100px</item-zxx>
</by-zhangxinxu>

如果flex-basis优先级是比width高,则第3个子项的width:100px应该是忽略的,也就是项目2和项目3的渲染表现是一样的。

我们把上面的代码在各个浏览器下跑一下,结果发现出现了尴尬的事情:

在Chrome浏览器下,项目3和项目1表现是一样的,也就是width:100px依然起到了一些作用。

Chrome浏览器下1和3一样

但是,在Firefox浏览器以及IE Edge浏览器下都是符合预期的项目3和项目2表现一样。

Firefox浏览器截图 Edge下效果 2,3一致

如果想亲自确认一下,您可以狠狠的点击这里:flex-basic与width关系深入研究demo

下面问题来了,到底哪个正确哪个错误呢?

按照历史的经验,大概率Chrome浏览器会在N年之后的什么时候修改这个表现,和Firefox等浏览器一致。

至于谁对谁错啊,这个是没有定论的,规范中估计没有对这个细节进行特别详细的描述。

那给我们的启示是什么东西呢?那很简单,flex-basis数值属性值和width数值属性值不要同时使用,就不会遇到浏览器发现差异的问题。说的更极端一点,在Flex布局中,除非万不得已,否则没有使用width属性的理由,请使用flex-basis代替。

三、flex-basis还支持关键字属性值

以前以为flex-basis只支持数值,最近才发现,flex-basis还支持一大波关键字属性值,包括:

/* 根据flex子项的内容自动调整大小 */
flex-basis: content;

/* 内部尺寸关键字 */
flex-basis: fill;
flex-basis: max-content;
flex-basis: min-content;
flex-basis: fit-content;

但是我要提前先泼一波冷水,目前,在Chrome浏览器下,上面任何一个关键字属性值都不支持。这是很罕见的场景。

其中,flex-basis:content是Edge 12以及Firefox浏览器支持:

content关键字兼容性

max-content/min-content关键字目前仅Firefox浏览器支持。

min-content/max-content兼容性

fillfit-content还没有任何浏览器支持。


由于最重要的Chrome浏览器不支持,因此上面几个关键字案例就不demo演示了,直接文字描述下他们的作用吧。

content
尺寸根据内容决定,跟我自己测试,表现和max-content接近。
max-content
最大内容宽度。
min-content
最小内容宽度。
fill
不详
fit-content
不详

四、flex-basis与min-width/max-width

很多前端在Flex布局的时候会使用min-width或者max-width限制列表上的最大尺寸和最小尺寸。

实际上很多时候都是没有必要的,活用flex-basis属性和flex属性,可以实现类似的效果。

例如我希望一个列表中的每一项最小宽度是100像素,尽可能填满整个容器,请问该如何实现?

无需使用min-width属性,可以试试下面的CSS代码:

.container {
    display: flex;
    flex-wrap: wrap;
}
.item {
    flex-basis: 100px;
    flex-grow: 1;
}

您可以狠狠地点击这里:flex-basic代替min/max-width效果实现demo

实现效果如下GIF示意:

子项模拟最小宽度效果

如果希望换行的列表也是等宽的,则需要复制N多空标签即可。

五、最后小结一下

本文内容最后的总结一下:

  • flex-basis默认作用在content box上,IE11会忽略box-sizing;
  • width只是flex-basis为auto时候间接生效,其余时候使用优先级更高的flex-basis属性值;
  • flex子项元素尺寸还与元素内容自身尺寸有关,即使设置了flex-basis属性值;
  • flex-basis数值属性值和width数值属性值不要同时使用;
  • flex-basis还支持很多关键字属性,只不过目前兼容性不太好;
  • flex-basis使用得当可以实现类似min-width/max-width的效果。

关于Flex子项最终的尺寸也总结一下:是盒模型,元素自身尺寸特性,以及flex属性共同作用的结果。

想要彻底搞清楚啊,需要掌握一个体系的知识点,不是一件简单的事情。

本来想好好解释一下,一想到茫茫多啰里八嗦的东西,就算了,盒模型可以参考《CSS世界》,“元素自身尺寸特性”本文有提及,可以参考下,而要想了解flex属性三剑客的含义和作用可以参考文章以及上一篇文章“CSS flex属性深入理解”,总之,要学习和了解的东西很多。


行文匆忙,表达可能有些乱,有一些错误也在所难免,欢迎指正!

文中很多理解都属于个人理解,不一定准确,如果有不同意见,非常欢迎交流。

最后,感谢您阅读到这里,如果觉得文章写得还不错,欢迎转发或分享哦~

本文为原创文章,欢迎分享,勿全文转载,如果实在喜欢,可收藏,永不过期,且会及时更新知识点及修正错误,阅读体验也更好。
本文地址:https://www.zhangxinxu.com/wordpress/?p=9154

(本篇完)