• Welcome to Journal web site.

我是 PHP 程序员

- 开发无止境 -

Next
Prev

第7章 0324-flex与grid布局原理与常用属性

Data: 2016-08-18 09:17:31Form: JournalClick: 41

image.png

答:用chrome或者firefox试一下

5.  老师哪个css属性去哪个网站看呀?

答:https://developer.mozilla.org/zh-CN/docs/Web/CSS


# 教学内容

## 1. Flex 布局
> 一维布局方式,单行元素
### 1.1 必知术语
| 序号 | 术语 | 描述 |
| ---- | -------- | ----------------------------------------------------------- |
| 1 | 弹性容器 | 拥有 display:flex/inline-flex 属性,使用 flex 弹性布局的区块 |
| 2 | 弹性项目 | 弹性容器的"子元素" |
| 3 | 主轴 | 弹性项目排列时参考的轴线,有水平和垂直二种 |
| 4 | 交叉轴 | 与主轴垂直的布局参考线 |
### 1.2 flex 容器属性
| 序号 | 属性 | 描述 |
| ---- | --------------- | ------------------------------ |
| 1 | `display` | 元素显示类型(内部和外部) |
| 2 | `flex-flow` | 主轴方向与项目是否允许换行 |
| 3 | `place-content` | 容器剩余空间在项目之间进行分配 |
| 4 | `place-items` | 项目在交叉轴上的对齐方式 |
常用属性值演示:
(1) `display`
| 序号 | 属性 | 描述 |
| ---- | ------------- | ----------------------- |
| 1 | `flex` | 外部块级,内部子元素弹性 |
| 2 | `inline-flex` | 外部行内,内部子元素弹性 |
> 默认外部为块级, 即`display: block-flex`与`display:flex`同义
> 外部内联: 指元素宽度自动收缩到内容宽度,多个该元素会同行显示
(2) `flex-flow`
> 容器换行方式
> `flex-flow`,是 `flex-direction`,`flex-wrap`属性的简化
| 序号 | 属性 | 描述 |
| ---- | --------------- | ---------------------- |
| 1 | `row nowrap` | 主轴水平, 不换行(默认) |
| 2 | `row wrap` | 主轴水平, 允许换行 |
| 3 | `column nowrap` | 主轴垂直, 不换行 |
| 4 | `column wrap` | 主轴垂直,允许换行 |
(3) `place-content`
> 大容器内元素水平对齐排布方式
> 以最常见的从左到右水平排列为例,即起始线从左侧开始
| 序号 | 属性 | 描述 |
| ---- | --------------- | ---------------------------------------- |
| 1 | `start` | `左对齐`: 空间在所有项目的右侧(默认值) |
| 2 | `end` | `右对齐`: 空间在所有项目的左侧 |
| 3 | `center` | `水平居中`: 空间在所有项目二端平均分配 |
| 4 | `space-between` | `二端对齐`: 空间在除二端元素之外平均分配 |
| 5 | `space-around` | `分散对齐`: 空间每个项目二侧平均分配 |
| 6 | `space-evenly` | `平均对齐`: 空间在每个项目之间平均分配 |
(4) `place-items`
> 大容器内元素垂直对齐排布方式
> 以最常见的从上到下垂直排列为例,即起始线从顶部开始
| 序号 | 属性 | 描述 |
| ---- | --------- | -------------------------------------- |
| 1 | `stretch` | `拉伸`: 默认值, 自动拉伸成`等高列` |
| 2 | `start` | `顶对齐`: 项目从交叉轴`起始线`开始排列 |
| 3 | `end` | `底对齐`: 项目从交叉轴`终止线`开始排列 |
| 4 | `center` | `居中对齐`: 项目在交叉轴中居中显示 |
### 1.3 flex 项目属性
| 序号 | 属性 | 描述 |
| ---- | ------------ | ---------------------------- |
| 1 | `place-self` | 交叉轴上对齐某个项目 |
| 2 | `flex` | 项目在主轴中的绽放因子与宽度 |
| 3 | `order` | 项目在主轴上的顺序 |
(1) `place-self`
> 大容器内元素垂直对齐方式
> 在块方向和内联方向上对齐单个项目,flex 特指交叉轴
> 是`align-self`,`justify-self`合并简写
| 序号 | 属性 | 描述 |
| ---- | --------- | -------------------------------------- |
| 1 | `stretch` | `拉伸`: 默认值, 自动拉伸成`等高列` |
| 2 | `start` | `顶对齐`: 项目从交叉轴`起始线`开始排列 |
| 3 | `end` | `底对齐`: 项目从交叉轴`终止线`开始排列 |
| 4 | `center` | `居中对齐`: 项目在交叉轴中居中显示 |
(2) `flex`
> 大容器内元素宽度缩放数值
> 设置项目在主轴上的缩放因子与计算宽度
> `flex: flex-grow flex-shrink flex-basis`
2.1 单值语法
| 序号 | 属性 | 描述 |
| ---- | ------------ | -------------------------------------- |
| 1 | `flex: 1` | 等价`flex: 1 1 auto`, 自动在主轴上收缩 |
| 2 | `flex: 10em` | `flex-basis:10em`,项目宽度,覆盖`width` |
2.2 双值语法
> 大容器内多元素宽度缩放比例
| 序号 | 属性 | 描述 |
| ---- | -------------- | ------------------------------------------ |
| 1 | `flex: 1 2` | 等价`flex: 1 2 auto`,主轴按 1:2 分配给项目 |
| 2 | `flex: 1 10em` | `flex: 1 1 10em`,项目宽度,覆盖`width` |
2.3: 三值语法
| 序号 | 属性 | 描述 |
| ---- | ---------------- | ------------------------------ |
| 1 | `flex: 0 1 auto` | 默认值, 不放大,可缩小,宽度自动 |
| 2 | `flex: auto` | `flex: 1 1 auto`,全响应式 |
| 3 | `flex: none` | `flex: 0 0 auto`,非响应式 |
(3) `order`
> 大容器内元素排列顺序,即指定元素按照指定数值位置显示
> 规则
| 序号 | 属性 | 描述 |
| ---- | ----------- | ------------------------------ |
| 1 | `order 0` | 默认值, 显示顺序与源码顺序一致 |
| 2 | `order: 2` | 显示在`<2`的右侧 |
| 3 | `order: -2` | 允许负数 |
> 了解更多: <https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox>
---
## 2. Grid 布局
> 二维布局方式,多行元素
### 2.1 必知术语
| 序号 | 术语 | 描述 |
| ---- | -------- | -------------------------------------------------------- |
| 1 | 网格容器 | 拥有 display: grid/inline-grid 属性,使用 grid 布局的区块 |
| 2 | 网格项目 | 网格容器的"子元素" |
| 3 | 单元格 | 每个项目所在的空间, 在容器布局单元,对用户不可见 |
| 4 | 网格区域 | 由一个或多个单元格构成, 可容纳一个或外个项目 |
### 2.2 Grid 容器属性
| 序号 | 属性 | 描述 |
| ---- | ------------------------------ | ---------------------------- |
| 1 | `display` | 元素显示类型(内部和外部) |
| 2 | `grid-template-rows / columns` | 设置显式网格 |
| 3 | `grid-auto-rows / columns` | 设置隐式网格行高/列宽 |
| 4 | `grid-auto-flow` | 设置项目在容器中排列方向 |
| 5 | `gap` | 设置轨道间隙 |
| 6 | `place-content` | 容器空间在项目中的分配方式 |
| 7 | `place-items` | 单元格空间在项目中的分配方式 |
常用属性值演示:
(1) `display`
| 序号 | 属性 | 描述 |
| ---- | ------------- | ---------------------------- |
| 1 | `grid` | 外部块级,内部子元素 网格布局 |
| 2 | `inline-flex` | 外部行内,内部子元素网格布局 |
(2) `grid-template-rows / columns`: 显式网格
| 序号 | 属性值 | 描述 |
| ---- | ------------------------------------- | -------------------------------------- |
| 1 | `auto` | 默认值,单列多行,按源码顺序垂直排列 |
| 2 | `50px 60px 100px` | 指定行/列的固定宽度 |
| 3 | `1fr 2fr 1fr` | `fr`比例, 行/列按比例占据全部空间 |
| 4 | `10% auto minmax(3em, 10em)` | 支持相对/绝对单位和最大小最小值 |
| 5 | `repeat(3, 1fr)` | `1fr 1fr 1fr`简写 |
| 6 | `repeat(2, 20em 1fr)` | `20em 1fr 20em 1fr`简写 |
| 7 | `repeat(2, 20em 1fr)` | `20em 1fr 20em 1fr`简写 |
| 8 | `repeat(auto-fit, minmax(50px,1fr))` | 最小 50px,空间足够会发尽量充满 |
| 9 | `repeat(auto-fill, minmax(50px,1fr))` | 最小 50px,空间足够也不会放大 |
| 10 | `fit-content(200px)` | 等价于`minmax(auto,max-content/200px)` |
难点分析:
```css
/* auto-fit: 容器自动收容到内容宽度,没有剩余空间 */
grid-template-columns: repeat(auto-fit, 100px);
/* 容器不会自动收缩,如果内容不足会产生剩余空间 */
grid-template-columns: repeat(auto-fill, 100px);
/* 经常与minmax()配合使用,实现响应式布局 */
/* 项目最小100px,空间足够会自动伸展到全部可用空间 */
grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
/* 项目最小100px,但不会自动伸展,哪怕空间足够 */
grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
/* 所以, auto-fill 与 minmax配合意义不大, 不如直接使用单值 */
```
(3) `grid-auto-rows / columns`: 隐式网格
> 该属性描述了在网格容器之外的项目应该占据的`行高/列宽`
> 究竟是`行高`还是`列宽`,由`grid-auto-flow`属性决定
| 序号 | 属性值 | 描述 |
| ---- | --------------------------- | ---------------------------------- |
| 1 | `auto` | 默认值,单列多行,按源码顺序垂直排列 |
| 2 | `100px / 1fr` | 指定行/列的固定宽度 |
| 3 | `min-content / min-content` | `fr`比例, 行/列按比例占据全部空间 |
| 4 | `minmax(100px,1fr` | 支持相对/绝对单位和最大小最小值 |
(4) `grid-auto-flow`: 排列方向
> 该属性描述了在网格容器之外的项目应该占据的`行高/列宽`
> 究竟是`行高`还是`列宽`,由`grid-auto-flow`属性决定
| 序号 | 属性值 | 描述 |
| ---- | -------------- | --------------------------------------- |
| 1 | `row` | 默认值,水平/行方向排列,空间不足换行显示 |
| 2 | `column` | 垂直/列方向排列,空间不足换列显示 |
| 3 | `row dense` | 行方向排列,尽量紧凑排列不浪费空间 |
| 4 | `column dense` | 列方向排列, 尽量紧凑排列不浪费空间 |
(5) `gap`: 轨道间隙
> 与`margin`不一样,该间隙仅存在于轨道之间
> `gap: row-gap column-gap`简写
| 序号 | 属性值 | 描述 |
| ---- | --------------- | -------------------------- |
| 1 | `gap: 0` | 默认值, 间隙 |
| 2 | `gap: 10px 5px` | 行轨间隙 10px,列轨间隙 5px |
| 3 | `gap: 1em` | 行与列间隙相等,都是 1em |
(6) `place-content`
> 所有项目在"容器"中的对齐方式, 即剩余空间在项目之间的分配方式
> 属性生效前提: 容器中存在剩余空间
> `place-content: 块/垂直方向 内联/水平方向`
| 序号 | 属性 | 描述 |
| ---- | --------------- | ---------------------------------------- |
| 1 | `start start` | `左对齐`: 空间在所有项目的右侧(默认值) |
| 2 | `end end` | `右对齐`: 空间在所有项目的左侧 |
| 3 | `center center` | `水平居中`: 空间在所有项目二端平均分配 |
| 4 | `center` | 二值相同,可只写一个 |
| 5 | `start end` | 垂直向上, 水平居右 |
| 6 | `space-between` | `二端对齐`: 空间在除二端元素之外平均分配 |
| 7 | `space-around` | `分散对齐`: 空间每个项目二侧平均分配 |
| 8 | `space-evenly` | `平均对齐`: 空间在每个项目之间平均分配 |
(7) `place-items`
> 所有项目在"单元格"中的对齐方式, 即剩余空间在单元格之间的分配方式
> 属性生效前提: "单元格"中存在剩余空间,即项目设置了`width/height`
> 语法:`place-items:垂直方向 水平方向`
| 序号 | 属性 | 描述 |
| ---- | --------------- | -------------------------------------- |
| 1 | `start start` | `左对齐`: 空间在所有项目的右侧(默认值) |
| 2 | `end end` | `右对齐`: 空间在所有项目的左侧 |
| 3 | `center center` | `水平居中`: 空间在所有项目二端平均分配 |
| 4 | `center` | 二值相同,可只写一个 |
| 5 | `start end` | 垂直向上, 水平居右 |
### 2.3 Grid 项目属性
(1) `grid-row / column`
> 语法:`grid-row/column: 行或列起始线 / 行或列终止线或跨越的行或列数量`
| 序号 | 属性 | 描述 |
| ---- | ----------------- | ----------------------------------------------- |
| 1 | `auto` | 默认占据一个单元格,可不写 |
| 2 | `1 / 3` | 起始编号`1`, 终止编号`3` |
| 3 | `2 / span 3` | 起始编号`2`, 跨越`2`列或列空间 |
| 4 | `span 2` | 省去第 1 个参数,从当前位置开始,占据二个单元空间 |
| 5 | `span 2 / span 2` | 垂直占 2 格,水平占 2 格,即 4 个单元格组成的区域 |
(2) `grid-area`
> 语法:`grid-area: 行起始 / 列起始 / 行结束 / 列结束`
> 与`grid-row/column`相比,`grid-arwa`是二维的
| 序号 | 属性 | 描述 |
| ---- | ------------------------- | ----------------------------------------------- |
| 1 | `auto` | 默认值, 由浏览器根据项目数量自动分配 |
| 2 | `3 / 1 / 5 / 3` | 创建一个由`3 / 1 / 5 / 3`四个编号构成的空间 |
| 3 | `1 / 1 / span 3 / span 2` | 从 1 行 1 列开始,占据 3 行 2 列 |
| 4 | `span 2 / span 2` | 垂直占 2 格,水平占 2 格,即 4 个单元格组成的区域 |
| 5 | `span 3` | 跨 3 行,其它默认 |
(2) `place-self`
> 语法:`place-self: 垂直方向 水平方向`
> 设置某个项目,在单元格中的对齐方式
| 序号 | 属性 | 描述 |
| ---- | ------------------------- | ------------------------------------ |
| 1 | `auto` | 默认值, 由浏览器根据项目数量自动分配 |
| 2 | `start end` | 垂直居上,水平居右 |
| 3 | `1 / 1 / span 3 / span 2` | 从 1 行 1 列开始,占据 3 行 2 列 |
| 4 | `center center` | 垂直,水平均居中 |
| 5 | `center` | 二值相同,可只写一个 |
> 了解更多: <https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Grid_Layout>
Name:
<提交>