流式(flow)布局
基础规则
按照先后位置从上而下布局
行内元素水平排列,知道当行被沾满,然后被换行
块级元素自动占据完整的新行
FC
视觉格式化模型
含义
独立的区域
固定的渲染规则
决定子元素如何定位
决定和其它元素的互相作用
分类
IFC
Inline Formatting Contexts
生成时机
在块级元素中,近包含内联级别元素时
规则
内部的盒子,在水平方向,一个接一个的放置
在水平方向上,盒子的padding、border、margin所占据的空间都会被考虑在内
垂直方向上,可能以不同的形式来对齐(vertical-align)
inline-box的高度由行高计算规则确定
当inline-box内的元素超过宽度时,会被分割成多个inline-box。
设置不被分割
work-breaking
white-space: nowrap | pre
BFC
Block Formatting Contexts
定义
块级盒子作用域,是独立的容器和布局环境
通俗解释
封闭的大箱子,无论内部如何变化,都不会影响到外部
生成时机
body(根)元素
display: inline-block | flex
overflow值不为visible
position: absolute | fixed
float值不为none
规则
FFC
Flex Formatting Contexts
创建
display: flex | inline-flex
GFC
GridLayout Formatting Contexts
创建
display: grid
更精细的渲染语义和控制
Box(盒模型)
CSS布局的对象和基本单位
Box类型
block-level Box
inline-level Box
inline-box
看不见、摸不着的边框
flex Container
grid container
基础概念
display
inline
block
Flex
属性
容器属性
align-items
相对主轴布局
常用值
center
align-content
适用于multi-line flex container
justify-content
相对交叉轴布局
常用值
center
flex-direction
flex-wrap
指定flex元素单行或多行显示
值
nowrap (默认值)
单行显示
nowrap: 禁止文字自动换行
wrap
多行显示
元素属性
align-self
flex-basic
和宽度的关系
flex-basis > width > 内容宽度
flex
全写
1. flex-grow
2. flex-shrink
3. flex-basis
基础值
initial
解释
根据自身宽高确定尺寸
自行伸长以吸收flex容器中额外的自由空间
等价
flex: 0 1 auto
auto
解释
也会缩短至自身最小尺寸以适应容器
等价
flex: 1 1 auto
none
解释
根据自身宽高来设置尺寸
完全非弹性
不会缩短、也不会伸长使用flex容器
等价
flex: 0 0 auto
positive-number
解释
在自由空间中的占比
等价
flex: <positive-number> 1 0
附加知识
auto的含义
自动占据剩余空间
参考文章
小科普:到底什么是 BFC、IFC、GFC 和 FFC
https://juejin.im/entry/5938daf7a0bb9f006b2295db
IFC、BFC、GFC 与 FFC 知多少
https://github.com/chokcoco/iCSS/issues/5
[翻译]Flex Basis与Width的区别
https://www.jianshu.com/p/17b1b445ecd4
普通流 normal flow
按照先后位置从上而下布局
行内元素水平排列,直到当行被沾满然后换行
块级元素则会被渲染为完整的新行
所有元素都是普通流定位
BFC
Block Formatting Context
定义
是区域:布局过程中生成块级盒子的区域,独立的容器和布局环境
有规则:浮动元素与其他元素的交互限定区域
通俗来讲
BFC是一个封闭的大箱子,内部无论如何变化,都不会影响到外部
创建
根元素 body
overflow 值不为 visible 的块元素
浮动元素 float不为none
绝对定位元素
position为absolute和fixed
行内块元素
inline-block
弹性元素
网格元素
规则
继承了普通流的定位规则
容器里的子元素不会影响到外面的元素
BFC的高度包含了内部的浮动元素
BFC区域不会与外部的浮动元素重叠
垂直方向的距离由margin决定。属于同一个BFC的两个相邻的Box的margin会发生重叠。
应用
外边距折叠(Margin collapsing)
有的译成外边距塌陷
规范
相邻盒子(可以是兄弟或祖先关系?)的外边距可以结合成一个单独的外边距
发生情况
属于同一个BFC的块级元素
在normal flow的布局中
也就是说绝对定位元素和浮动元素不会发生折叠
块级盒子
也就是说inline-block不会发生折叠
也就是说水平方向不会发生折叠
垂直方向相邻
解决
放在两BFC中
BFC可以包含浮动的元素
场景描述
一个block元素中,包含一个浮动元素,此时block元素会失去高度
解决
为block元素加入overflow:hidden属性,触发BFC
那么容器就回包裹着元素
阻止被浮动元素覆盖
两列布局