CSS Flex & Grid Layout
弹性盒子布局(Flex Box Layout)
弹性盒子是一种基于父容器的布局机制,它通过 display: flex
来激活,激活后容器中的子元素可以在水平或垂直方向上膨胀以填充额外的空间,或收缩以适应更小的空间
弹性盒子布局的基本概念:
Flex Container(弹性容器, 伸缩容器):display
的值设置为 flex
或 inline-flex
的元素为弹性容器
Flex Item(弹性项目, 伸缩项目):
弹性容器( Flex Container ) 的每个子元素称为弹性项目
main axis(主轴):
所有弹性项目( Flex Item )沿其一侧排列的轴称为主轴
cross axis(交叉轴):
垂直于主轴的轴称为交叉轴
样例 HTML:
1 | <div class="container"> |
弹性容器属性
flex-direction(主轴方向)
flex-direction
用来设置弹性容器中子元素沿主轴的排列方向
CSS 基础样式(基于样例 HTML):
1 | .container { |
row
:设置主轴为水平方向
1 | .container { |
row-reverse
:与 row 的排列方向相反
1 | .container { |
column
:设置主轴为垂直方向
1 | .container { |
column-reverse
:与 column 的排列方向相反
1 | .container { |
容器内子元素的排列方向:
justify-content(主轴对齐方式)
justify-content
用于控制主轴上弹性项目的对齐方式
CSS 基础样式(基于样例 HTML):
1 | .container { |
center
:弹性项目向第一行的中间位置对齐
1 | .container { |
flex-start
:伸缩项目向第一行的开始位置对齐
1 | .container { |
flex-end
:伸缩项目向第一行的结束位置对齐
1 | .container { |
space-between
:伸缩项目会平均分布在一行中
1 | .container { |
space-around
:伸缩项目会平均分布在一行中,两端保留一半的空间
1 | .container { |
align-items(交叉轴对齐方式)
align-items
用于设置弹性项目在交叉轴(cross axis)上的对齐方式
CSS 基础样式(基于样例 HTML):
1 | .container { |
stretch
:默认值,伸缩项目拉伸填充整个伸缩容器
1 | .container { |
center
:伸缩项目向侧轴的中间位置对齐
1 | .container { |
flex-start
:伸缩项目向侧轴的起点位置对齐
1 | .container { |
flex-end
:伸缩项目向侧轴的终点位置对齐
1 | .container { |
flex-wrap(单行/多行显示)
flex-wrap
用于控制当弹性项目在主轴方向上超出容器空间时,是否换行
CSS 基础样式(基于样例 HTML):
1 | .container { |
nowrap
:设置伸缩项目单行显示。这种方式可能导致溢出伸缩容器
可见,容器宽度 900px,容器内一共 9 个子元素,每个 120px,他们紧紧的排列在一起
1 | .container { |
wrap
:设置伸缩项目多行显示
当多行显示时,第一行放不下的元素会被放到下一行(第二行),因为设置了主轴对齐方式为 space-between
,所以多出来的两个元素分别到了两端
1 | .container { |
wrap-reverse
:与 wrap 相反
当多行显示时,第一行放不下的元素会被放到上一行(第二行),因为设置了主轴对齐方式为 space-between
,所以多出来的两个元素分别到了两端
1 | .container { |
align-content(交叉轴多行对齐方式)
align-content
用于控制多行弹性项目在交叉轴(cross axis)方向上的对齐方式
CSS 基础样式(基于样例 HTML):
1 | .container { |
stretch
:默认值,各行将会伸展以占用额外的空间
1 | .container { |
center
:各行向伸缩容器的中间位置对齐
1 | .container { |
flex-start
:各行向伸缩容器的起点位置对齐
1 | .container { |
flex-end
:各行向伸缩容器的终点位置对齐
1 | .container { |
space-between
:各行会平均分布在一行中。第一项与起始点齐平,最后一项与终止点齐平
1 | .container { |
space-around
:各行会平均分布在一行中,两端保留一半的空间
1 | .container { |
flex-flow
flex-flow 属性适用于伸缩容器元素,该属性是 flex-direction
和 flex-wrap
的简写。
其语法:flex-flow: <'flex-direction'> || <'flex-wrap'>
,示例:flex-flow: row wrap
弹性项目属性
flex-grow(伸展比例)
flex-grow
属性用来控制弹性项目在主轴上的放大比例 (剩余空间按比例分配)。默认为 0,即如果容器存在剩余空间,也不放大
其属性的取值为数字
flex-shrink(收缩比例)
flex-shrink
属性定义了弹性项目的在主轴上的缩小比例,默认为 1,即如果空间不足,该项目将缩小
- 如果所有弹性项目的 flex-shrink 属性都为 1 (默认),当空间不足时,都将等比例缩小
- 如果一个弹性项目的 flex-shrink 属性为 0,其他项目都为 1,则空间不足时,前者不缩小
- 负值对该属性无效
flex-basis(初始大小)
flex-basis
属性定义了在还没计算 flex-grow
或 flex-shrink
之前,弹性项目的主轴大小( 初始大小 )是多少,默认值 auto,根据内容推算初始大小
大部分情况下 flex-basis
属性和 width
或 height
表现一致,如果两者同时使用 flex-basis
优先级会高一些
例:
1 | .item { |
order(顺序)
order
属性用于设置弹性项目在布局时的顺序。默认为 0,值越大越靠后
1 | <style> |
网格布局(Grid Layout)
Grid Layout 是一种允许你以网格(rows 和 columns)来对网页内容进行布局的模块,相比 Flex Box 布局,网格布局可以在行和列两个维度上同时进行布局( 二维布局 )
它可以非常轻松地把页面分割成主要区域,还可以在小部件内定义更复杂的布局
网格布局与弹性盒子布局有一些相同的概念:
Grid Container(网格容器):display
的值设置为 grid
或 inline-grid
的元素为网格容器
Grid Item(网格项目):
网格容器( Grid Container )的直接子元素为网格项目
样例 HTML:
1 | <div class="container"> |
网格容器属性
grid-template-columns & grid-template-rows(列宽与行高)
grid-template-columns
& grid-template-rows
用于定义列的宽度和行的高度
1 | .container { |
grid-template
的其它值:
repeat
函数用于重复一个值或模式,其接受两个参数:
- 重复的次数
- 重复的值或模式
1 | .container { |
定义六列,第一列和第四列的宽度为 40px
,第二列和第五列为 60px
,第三列和第六列为 80px
1 | .container{ |
该函数用于产生一个长度范围,其接受两个参数:
- 最小值
- 最大值
grid-template-columns: 1fr 1fr minmax(100px, 1fr);
表示第三列宽度最小为 100 像素,最大为 1 个单位
当单元格大小固定,但容器大小不确定时,希望每一行或每一列都尽可能的容纳多个单元格,此时则可以使用关键字 auto-fill
或 auto-fit
关键词
1 | .container { |
1 | .container { |
fr
是 Grid 中用于表示空间分配比例的单位,例如 grid-template-columns: 1fr 2fr;
则表示前者为宽度为 1 个单位,则后者为前者的两倍:2 个单位
fr
单位也可以与绝对单位相配合:grid-template-columns: 150px 1fr 2fr;
,此时则表示:第一列为 200px,剩余宽度分配成 1:2 的比例并分配给第二列和第三列
1 | .container { |
auto
关键字表示由浏览器分配剩余可用长度。例如:grid-template-columns: 100px auto 100px;
表示第一列与第三列宽度为 100 像素,第二列则占用全部剩余宽度
row-gap & column-gap(间距)
row-gap
属性设置行与行的间隔(行间距)column-gap
属性设置列与列的间隔(列间距)
1 | .container { |
gap
属性是 column-gap
和 row-gap
的合并简写形式,语法如下
gap: <grid-row-gap> <grid-column-gap>;
grid-template-areas & grid-area(区域)
网格布局允许指定 “区域”(area),一个区域由单个或多个单元格组成
grid-template-areas
属性用于定义区域,grid-area
属性(网格项目属性)指定项目放在哪一个区域
1 | <html> |
justify-items & align-items(单元格对齐方式)
justify-items
:控制 每个格子里的内容 在 水平方向 的对齐方式align-items
:控制 每个格子里的内容 在 垂直方向 的对齐方式
justify-items
和 align-items
属性的取值和写法完全一样:
1 | .container { |
start
:对齐单元格的起始边缘end
:对齐单元格的结束边缘center
:单元格内部居中stretch
:拉伸,占满单元格的整个宽度(默认值)
例如:justify-items: start;
属性表示该单元格内容左对齐
简写属性 place-items
:
place-items: <align-items> <justify-items>;
justify-content & align-content(网格整体对齐方式)
justify-content
:水平方向上对齐整个 grid 容器align-content
:垂直方向上对齐整个 grid 容器
Tips:它们只在 网格总尺寸小于容器尺寸时起作用
1 | .container { |
靠容器起始边对齐
靠容器末端对齐
容器内部居中
项目大小没有指定时,拉伸占据整个网格容器
每个项目两侧的间隔相等。所以,项目之间的间隔比项目与容器边框的间隔大一倍
首尾贴边,中间均分空间
项目与项目的间隔相等,项目与容器边框之间也是同样长度的间隔
简写属性 place-content
:
place-content: <align-content> <justify-content>;