每日一篇——23秋招CSS面经(2)
⭐flex
对于轴线:
- 设定主轴方向
- flex-direction:
- row(default)
- row-reverse
- column
- column-reverse
- flex-direction:
- 是否换行
- flex-wrap:
- nowrap(default)
- wrap
- wrap-reverse
- flex-wrap:
- 前两者可以合并
- flex-flow:
- row nowrap(default)
- flex-flow:
- 主轴对齐方式
- justify-content:
- flex-start(default) 左对齐
- flex-end 右对齐
- center
- space-between 两端对齐,中间间隔相同
- space-around 每个成员两侧的间隔相等
- justify-content:
- 成员在交叉轴(主轴外的另一个轴)的对齐方式,默认可以理解为y轴
- align-items:
- flex-start 交叉轴起点对齐
- flex-end 交叉轴终点对齐
- center
- baseline 文字基线对齐
- stretch(default) 若未设置高度,则默认占满整个交叉轴
- align-items:
- 多根轴线(多行)的对齐方式(多根主轴在交叉轴上的对齐方式)
- align-content:
- flex-start 与交叉轴起点对齐
- flex-end 与交叉轴终点对齐
- center
- space-between 交叉轴两端对齐,中间平均分布
- space-around 每根轴线两侧间隔都相同
- stretch(default) 占满整个交叉轴
- align-content:
对于其中的每一项:
- order 值为数字,为排序的权重
- flex-grow 值为数字,意为成员的放大比例,默认为0,若都设为1,则会放大等分剩余空间(忽略其原本宽度,全部等分)
- flex-shrink 值为数字,意为成员的缩小比例,默认为1,若空间不足,则会缩小相同比例,若设为0,则不缩小,若都不缩小,则会超出
- flex-basis 值为长度,意为在未分配剩余空间时,成员占据的主轴空间大小,默认为auto,即为成员的本来大小
- flex 为flex-grow flex-shrink flex-basis的简写,默认为0 1 auto ,后两者可选,我们常用这个属性,其实本质大多数用的都是flex-grow
- align-self 单个成员的交叉轴对齐方式
- auto(default) 继承自父元素 如果没有父元素,则默认为stretch
- flex-start
- flex-end
- center
- baseline
- stretch
⭐清除浮动
-
父元素固定宽高
- 缺点:子元素宽高不确定时无法使用
-
添加新元素,并设clear:both
- 缺点:不利于维护
-
使用伪元素
- 缺点:兼容性不好
-
触发父元素BFC
- 有些属性会影响其他样式,例如overflow:hidden,容易剪裁内容
⭐Grid布局
①定义grid布局:
- display: grid/inline-grid
②设置行与列的布局
- grid-template-rows / grid-template-columns
- 基本使用:grid-template-rows(grid-template-columns): 100px 100px 200px,设置三行(列),高度(宽度)分别为100 100 200px
- repeat():grid-template-rows(grid-template-columns): repeat(3, 100px),设置三行(列),高度(宽度)均为100px
- auto-fill:grid-template-rows(grid-template-columns): repeat(auto-fill, 100px),不定有几行/几列,能装多少装多少,当可用空间不足以容纳更多的列时,会创建空的隐式网格项来填充空白区域
- auto-fit:尽量将每一列放入网格容器中,使得不留下空白的空间,当可用空间不足以容纳更多的列时,会自动调整已有的网格项的大小,以填充剩余空白区域
- fr:占比,与flex-grow类似,grid-template-rows(grid-template-columns): 100px 1fr 2fr,除去100px,剩下按1:2划分
- minmax():grid-template-rows(grid-template-columns): 1fr 1fr minmax(100px, 2fr),表示第三行(列)最少为100px,最大不能超过前两行(列)的两倍
- auto:自动调整,grid-template-rows(grid-template-columns): 100px auto 100px,实现自由适配的三栏布局
- row-gap / columns-gap / gap:行间距列间距以及二合一写法
③划分区域自定义放置元素
-
grid-template-areas:划分区域
-
grid-template-columns: 120px 120px 120px; grid-template-rows: repeat(3, 300px); grid-template-areas: ". header header" "sidebar content content" "sidebar . .";定义三行三列,通过grid-template-areas来划分区块,并为其命名, . 表示空
-
-
grid-area:放置元素
-
.sidebar { grid-area: sidebar; } .content { grid-area: content; } .header { grid-area: header; }规定哪个类的内容放在哪个区块中
-
④划分区域自动填充元素
- grid-auto-flow
- row 默认值,按行进行依次填充
- column,按列进行依次填充
- 附加值dense,是否紧凑填充,可以自动在后方找到合适大小的块填充到前面的单元格中,防止按序填充时出现元素过大填充不满的现象
⑤自由安排元素位置
- grid-column-start、grid-column-end、grid-row-start、grid-row-end:分别对应网格的上边框位置、下边框位置、左边框位置、右边框位置,通过这四个元素将内容定位到网格中(左上方顶点为1,向右向下递增)
- span:声明项目跨度(占几个格子),在start中设置,end就可以不用设置
- 简写形式:grid-area: 2 / 1 / 4 / 3(其中,2表示起始行,1表示起始列,4表示结束行,3表示结束列)
⑥所有元素在单元格内的对齐方式
- justify-items / align-items:水平/垂直对齐方式
- start
- end
- center
- stretch(默认)
- place-items:水平和垂直的合并形式,写两个就是左水平右垂直,写一个就是两者共用
⑦单个元素在单元格内的对齐方式
- justify-self、align-self、place-self:与⑥中用法完全一致,只是针对单个元素使用
⑧单元格在容器内的对齐方式
- justify-content / align-content:水平/垂直对齐方式
- start(默认)
- end
- center
- stretch
- space-between
- space-around
- space-evenly
- place-content为上两者的合并形式
⑨多出来的东西怎么放?隐式网格
- grid-auto-columns / grid-auto-rows:定义隐式网格的单元格长宽
一些面试题
- 请解释什么是CSS Grid布局?
- Grid布局中有哪些主要的概念和术语?
- 请解释Grid容器和Grid项之间的区别是什么?
- 如何在父元素上应用Grid布局?
- 请解释Grid布局中的行和列是如何定义的?
- 如何指定Grid项在网格中的位置?
- Grid布局中的重叠和层叠是如何处理的?
- 如何控制Grid项的大小和对齐方式?
- 请解释Grid布局的自动布局机制。
- 如何媒体查询和响应式设计与Grid布局结合使用?