当前位置:   article > 正文

前端 CSS 经典:grid 栅格布局_前端栅格布局

前端栅格布局

前言:Grid 布局是将容器划分成"行"和"列",产生单元格,然后将"项目"分配给划分好的单元格,因为有行和列,可以看作是二维布局。

一 术语

1. 容器

采用网格布局的区域,也就是外层盒子。

2. 项目

容器包裹的一级子元素,不包含二级及其以下的子元素。当容器使用了 grid 布局,项目的 float,display 等设置都将失效。

3. 单元格

通过容器设置行列属性,切割出来的单元格。单元格不等于项目,打个比方,容器相当于一个房子,单元格相当于在房子里划分出的一个个房间,项目相当于房间里的家具等东西。

二 容器属性

demo 默认样式,未设置 grid 属性。

  1. <template>
  2. <div class="container">
  3. <span v-for="i in 10" :class="`item${i}`">{{ i }}</span>
  4. </div>
  5. </template>
  6. <style lang="scss" scoped>
  7. .container {
  8. background: green;
  9. span {
  10. border: 1px solid;
  11. }
  12. }
  13. </style>

1. display

设置网格布局

1.1 display: grid

项目宽度填充整行

  1. .container {
  2. background: green;
  3. display: grid;
  4. span {
  5. border: 1px solid;
  6. }
  7. }

1.2 display: inline-grid

项目宽度根据内容撑宽。

  1. .container {
  2. background: green;
  3. display: inline-grid;
  4. span {
  5. border: 1px solid;
  6. }
  7. }

2. grid-template-columns

划分容器列和列宽,可以单独或混合使用:绝对值 px,百分比 %,比例 fr,关键字 auto,函数 minmax,函数 repeat,函数 fit-content

2.1 绝对值 px

例:设置 3 列,每列宽 300px

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: 300px 300px 300px;
  5. span {
  6. border: 1px solid;
  7. }
  8. }

2.2 百分比 %

例:设置 3 列,每列宽 33.33 %

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: 33.33% 33.33% 33.33%;
  5. span {
  6. border: 1px solid;
  7. }
  8. }

2.3 比例 fr

总宽度除以总的 fr,得到每份 fr 所占宽度,然后分给设置的列宽,例:设置 3 列,第 2 列是第 1 列的 1 倍,第 3 列是第 1 列的 3 倍

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: 1fr 2fr 3fr;
  5. span {
  6. border: 1px solid;
  7. }
  8. }

2.4 关键字 auto

宽度自适应,例:设置 3 列,第 1 列 100px,第 3 列 100px,第 2 列宽度自适应

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: 100px auto 100px;
  5. span {
  6. border: 1px solid;
  7. }
  8. }

2.5 函数 minmax

minmax(min, max),用于产生一个长度范围,例:设置 3 列,第 2 列 自适应宽度在 100px 到 300px 之间,第 1 列和第 3 列宽度为 300px。

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: 300px minmax(100px, 300px) 300px;
  5. span {
  6. border: 1px solid;
  7. }
  8. }

2.6 函数 repeat

repeat(n, content),n 代表重复次数,可以是数字代表几次,可以 auto-fill 自动填充满,content 代表重复内容。例:设置 3 列,每列 1fr。

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(3, 100px);
  5. span {
  6. border: 1px solid;
  7. }
  8. }

例:设置每列 100px,每行自动填充最多的 100px 列

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(auto-fill, 100px);
  5. span {
  6. border: 1px solid;
  7. }
  8. }

2.7 函数 fit-content

fit-content(length),当内容小于 length,以内容为准,如果大于 length 以 leng 为长度,例:设置 3 列,每列最大宽度 200px,当小于 200px,以内容撑开宽度。

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(3, fit-content(200px));
  5. span {
  6. border: 1px solid;
  7. }
  8. }

3. grid-template-rows

划分容器行和行高,属性同 grid-template-columns 一致,比例 fr 略有不同。如果不设置项目高度,1fr 代表的高度就是项目高度,如果设置有项目设置了高度,那就以该项目的高度除以该项目所分的 fr 算出 1fr 的大小。例:设置列宽 200px,自动铺满列,不设置项目高度,第 1 行 1fr,第 2 行 2fr,第 3 行 3fr。

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(auto-fill, 200px);
  5. grid-template-rows: 1fr 2fr 3fr;
  6. span {
  7. border: 1px solid;
  8. }
  9. }

例:设置列宽 200px,自动铺满列,设置项目 item5 高度 200 px,第 1 行 2fr,第 2 行 2fr,第 3 行 3fr。

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(auto-fill, 200px);
  5. grid-template-rows: 1fr 2fr 3fr;
  6. span {
  7. border: 1px solid;
  8. }
  9. .item5 {
  10. height: 200px;
  11. }
  12. }

4. grid-template-areas

区域命名,区域命名形成区域一定要是矩形区域,无论是 L,凹,凸都是无效属性值。可以配合 grid-template-rows、grid-template-columns 使用。例:设置 3 列每列 100px,3 行每行 100px,通过区域命名实现如图布局。

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(3, 100px);
  5. grid-template-rows: repeat(3, 100px);
  6. grid-template-areas:
  7. "left top top"
  8. "left middle right"
  9. "bottom bottom right";
  10. span {
  11. border: 1px solid;
  12. }
  13. .item1 {
  14. grid-area: left;
  15. }
  16. .item2 {
  17. grid-area: top;
  18. }
  19. .item3 {
  20. grid-area: middle;
  21. }
  22. .item4 {
  23. grid-area: right;
  24. }
  25. .item5 {
  26. grid-area: bottom;
  27. }
  28. }

5. grid-template

是 grid-template-columns、grid-template-rows 这 2 个属性的合并简写形式。

  1. grid-template-columns: repeat(3, 100px);
  2. grid-template-rows: repeat(3, 100px);
  3. // 简写
  4. grid-template: repeat(3, 100px) / repeat(3, 100px);

6. column-gap

列间距,支持数值和百分比。例:设置列间距为 20px。

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(auto-fill, 200px);
  5. column-gap: 20px;
  6. span {
  7. border: 1px solid;
  8. }
  9. }

7. row-gap

行间距,支持数值和百分比。例:设置行间距 10px。

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(auto-fill, 200px);
  5. row-gap: 10px;
  6. span {
  7. border: 1px solid;
  8. }
  9. }

8. grid-gap

行间距和列间距简写,grid-gap: 行间距,列间距,如果第二个值省略,默认两个值相等。例:设置行间距,列间距都为 20px。

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(auto-fill, 200px);
  5. grid-gap: 20px;
  6. span {
  7. border: 1px solid;
  8. }
  9. }

9. grid-auto-flow

定义栅格元素的排列规则:row、column、row dense、column dense。

9.1 row

默认水平顺序排列

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(auto-fill, 200px);
  5. grid-template-rows: repeat(3, 200px);
  6. grid-auto-flow: column;
  7. span {
  8. border: 1px solid;
  9. }
  10. }

9.2 column

垂直顺序排序

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(auto-fill, 200px);
  5. grid-template-rows: repeat(3, 200px);
  6. grid-auto-flow: column;
  7. span {
  8. border: 1px solid;
  9. }
  10. }

10. justify-items

单元格内容水平位置设置:stretch、start、end、center

10.1 stretch

默认单元格内容水平填充单元格

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(auto-fill, 200px);
  5. grid-template-rows: repeat(3, 200px);
  6. justify-items: stretch;
  7. span {
  8. border: 1px solid;
  9. }
  10. }

10.2 start

单元格内容水平靠右

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(auto-fill, 200px);
  5. grid-template-rows: repeat(3, 200px);
  6. justify-items: start;
  7. span {
  8. border: 1px solid;
  9. }
  10. }

10.3 end

单元格内容水平靠左

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(auto-fill, 200px);
  5. grid-template-rows: repeat(3, 200px);
  6. justify-items: end;
  7. span {
  8. border: 1px solid;
  9. }
  10. }

10.4 center

单元格内容水平居中

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(auto-fill, 200px);
  5. grid-template-rows: repeat(3, 200px);
  6. justify-items: center;
  7. span {
  8. border: 1px solid;
  9. }
  10. }

11. align-items

单元格内容垂直位置:stretch、start、end、center

11.1 stretch

单元格内容垂直填充

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(auto-fill, 200px);
  5. grid-template-rows: repeat(3, 200px);
  6. align-items: stretch;
  7. span {
  8. border: 1px solid;
  9. }
  10. }

11.2 start

单元格内容垂直靠上

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(auto-fill, 200px);
  5. grid-template-rows: repeat(3, 200px);
  6. align-items: start;
  7. span {
  8. border: 1px solid;
  9. }
  10. }

11.3 end

单元格内容垂直靠下

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(auto-fill, 200px);
  5. grid-template-rows: repeat(3, 200px);
  6. align-items: end;
  7. span {
  8. border: 1px solid;
  9. }
  10. }

11.4 center

单元格内容垂直居中

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(auto-fill, 200px);
  5. grid-template-rows: repeat(3, 200px);
  6. align-items: center;
  7. span {
  8. border: 1px solid;
  9. }
  10. }

12. place-items

是 align-items 属性和 justify-items 属性的合并简写形式。如果省略第二个值,则浏览器认为与第一个值相等。例:设置单元格内容垂直和水平居中

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(auto-fill, 200px);
  5. grid-template-rows: repeat(3, 200px);
  6. place-items: center;
  7. span {
  8. border: 1px solid;
  9. }
  10. }

13. justify-content

容器内容水平位置:start、end、center、stretch、space-around、space-between、space-evenly

13.1 start

默认容器内容水平靠左

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(auto-fill, 200px);
  5. grid-template-rows: repeat(3, 200px);
  6. justify-content: start;
  7. span {
  8. border: 1px solid;
  9. }
  10. }

13.2 end

例:设置容器内容水平靠右

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(auto-fill, 200px);
  5. grid-template-rows: repeat(3, 200px);
  6. justify-content: end;
  7. span {
  8. border: 1px solid;
  9. }
  10. }

13.3 center

例:设置容器内容水平居中

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(auto-fill, 200px);
  5. grid-template-rows: repeat(3, 200px);
  6. justify-content: center;
  7. span {
  8. border: 1px solid;
  9. }
  10. }

13.4 space-around

例:设置容器内容水平平均分布,项目间距是项目距离容器边框的两倍

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(auto-fill, 200px);
  5. grid-template-rows: repeat(3, 200px);
  6. justify-content: space-around;
  7. span {
  8. border: 1px solid;
  9. }
  10. }

13.5 space-between

例:设置容器内容水平平均分布,靠近容器边框项目紧贴容器,其余水平项目平均间距

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(auto-fill, 200px);
  5. grid-template-rows: repeat(3, 200px);
  6. justify-content: space-between;
  7. span {
  8. border: 1px solid;
  9. }
  10. }

13.6 space-evenly

例:设置容器内容水平平均分布,项目间距和项目距离容器边框间距相等

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(auto-fill, 200px);
  5. grid-template-rows: repeat(3, 200px);
  6. justify-content: space-evenly;
  7. span {
  8. border: 1px solid;
  9. }
  10. }

14. align-content

容器内容垂直位置:start、end、center、stretch、space-around、space-between、space-evenly,同 justify-content 属性一致。一般需要给容器设置固定高度。align-content 属性才有效。例:设置容器内容垂直居中

  1. .container {
  2. height: 500px;
  3. background: green;
  4. display: grid;
  5. grid-template-columns: repeat(auto-fill, 200px);
  6. grid-template-rows: repeat(3, 100px);
  7. align-content: center;
  8. span {
  9. border: 1px solid;
  10. }
  11. }

15. place-content

是 align-content 属性和 justify-content 属性的合并简写形式。如果省略第二个值,浏览器就会假定第二个值等于第一个值。例:设置容器内容水平居中,垂直居中。

  1. .container {
  2. height: 500px;
  3. background: green;
  4. display: grid;
  5. grid-template-columns: repeat(auto-fill, 200px);
  6. grid-template-rows: repeat(3, 100px);
  7. place-content: center;
  8. span {
  9. border: 1px solid;
  10. }
  11. }

三 项目属性

1. grid-column-start、grid-column-end、grid-column、grid-row-start、grid-row-end、grid-row、grid-area

grid-column-start: number; 左边框垂直网格线

grid-column-end: number; 右边框垂直网格线

grid-column: grid-column-start / grid-column-end; 左、右边框垂直网格线简写

grid-row-start: number; 上边框垂直网格线

grid-row-end: number; 下边框垂直网格线

grid-row: grid-column-start / grid-column-end; 左、右边框垂直网格线简写

grid-area: grid-row-start / grid-column-start / grid-row-end / grid-column-end; 上、左、下、右边框垂直网格线简写

number 值默认从 1 开始依次递增。

例:设置一个 3 列每列宽 200px,3 行每行高 200px,让内容为 1 的项目居中。

  1. .container {
  2. background: green;
  3. display: grid;
  4. grid-template-columns: repeat(3, 200px);
  5. grid-template-rows: repeat(3, 200px);
  6. span {
  7. border: 1px solid;
  8. }
  9. .item1 {
  10. grid-column-start: 2;
  11. grid-column-end: 3;
  12. grid-row-start: 2;
  13. grid-row-end: 3;
  14. background: red;
  15. }
  16. }
  17. // grid-columngrid-row 简写
  18. .container {
  19. background: green;
  20. display: grid;
  21. grid-template-columns: repeat(3, 200px);
  22. grid-template-rows: repeat(3, 200px);
  23. span {
  24. border: 1px solid;
  25. }
  26. .item1 {
  27. grid-column: 2 / 3;
  28. grid-row: 2 / 3;
  29. background: red;
  30. }
  31. }
  32. // grid-area 简写
  33. .container {
  34. background: green;
  35. display: grid;
  36. grid-template-columns: repeat(3, 200px);
  37. grid-template-rows: repeat(3, 200px);
  38. span {
  39. border: 1px solid;
  40. }
  41. .item1 {
  42. grid-area: 2 / 2 / 3 / 3;
  43. background: red;
  44. }
  45. }

2. justify-self

单元格内容的水平位置,同 justify-items 但只作用于单个项目。赋值:start、end、center、stretch。

3. align-self

单元格内容的垂直位置,同 align-items 但只作用于单个项目。赋值:start、end、center、stretch。

4. place-self

justify-self 和 align-self 简写,同 place-items 但只作用于单个项目。只有一个值时,第二个值默认与第一个值相同。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/738005
推荐阅读
相关标签
  

闽ICP备14008679号