PHP8.1.21版本已发布
vue8.1.21版本已发布
jquery8.1.21版本已发布

博客列表 > 210329 CSS 媒体查询 grid布局

210329 CSS 媒体查询 grid布局

xyphpblog
xyphpblog 原创
2021年04月02日 08:57:42 507浏览

1. 媒体查询原理

设置最小临界宽度以及不同的样式以实现页面样式根据宽度变化

CSS

  1. <style>
  2. body {
  3. background-color: burlywood;
  4. }
  5. @media screen and (min-width: 400px) {
  6. body {
  7. background-color: cadetblue;
  8. font-size: 20px;
  9. }
  10. }
  11. @media screen and (min-width: 600px) {
  12. body {
  13. background-color: darkblue;
  14. font-size: 30px;
  15. }
  16. }
  17. </style>

宽度 <400px时,

400px< 宽度 <600px时,

宽度 >600px时,


2. grid布局

  • 网格容器:网格布局的容器
  • 网格项目:容器的子元素
  • 网格单元(grid cell):单个网格
  • 网格区域(grid area):多个网格组成的区域
  • 网格轨道(grid tracks):行轨道,列轨道
  • 轨道间隙(gutters):行的间隙,列的间隙

设置容器 display: grid
会把项目转为块元素(flex是转为行内)

  1. /* 1. grid 容器 */
  2. .container {
  3. /* 转为网格容器 */
  4. display: grid;
  5. grid-template-columns: auto auto auto;
  6. border: 1px solid #000;
  7. padding: 0.5rem;
  8. }
  9. .container>.item {
  10. border: 1px solid;
  11. background-color: lightsteelblue;
  12. padding: 0.5rem;
  13. }

默认

设置为grid布局,3列, 宽度自适应

设置行数,行高

  1. /* 1. grid 容器 */
  2. .container {
  3. /* 转为网格容器 */
  4. display: grid;
  5. /* 3 columns */
  6. grid-template-columns: auto auto auto;
  7. /* 2 rows */
  8. grid-template-rows: 5em 5em;
  9. border: 1px solid #000;
  10. padding: 0.5rem;
  11. }

设置网格间隙

  1. .container {
  2. border: 1px solid #000;
  3. padding: 0.5rem;
  4. /* 转为网格容器 */
  5. display: grid;
  6. /* 轨道列宽 3 columns */
  7. grid-template-columns: auto auto auto;
  8. /* 轨道行高 2 rows */
  9. grid-template-rows: 5em 5em;
  10. /* 轨道间隙 水平 垂直*/
  11. gap: 0.5em;
  12. }

2.1 grid布局单位:fr

(可与其他单位共同使用,总-固定值)

  1. .container {
  2. border: 1px solid #000;
  3. padding: 0.5rem;
  4. /* 转为网格容器 */
  5. display: grid;
  6. /* 轨道列宽 3 columns */
  7. /* grid-template-columns: auto auto auto; */
  8. grid-template-columns: 1fr 2fr 1fr;
  9. /* 轨道行高 2 rows */
  10. grid-template-rows: 5em 5em;
  11. /* 轨道间隙 水平 垂直*/
  12. gap: 0.5em;
  13. }

2.2 grid常用函数

注:repeat与()间不能有空格

1. repeat()

repeat(列数,宽度)
repeat(3, 10em)
repeat(3, 10em 2em)

  1. /* grid-template-columns: 10em 10em 10em; */
  2. grid-template-columns: repeat(3, 10em);

  1. grid-template-columns: repeat(3, 10em 2em);

2. minmax()

minmax(最小宽度,最大宽度)

设置前minmax前

  1. grid-template-columns: 1fr 2fr 1fr;

设置minmax(30em, 2fr)后

  1. grid-template-columns: 1fr minmax(30em, 2fr) 1fr;

2.3 grid 隐式轨道

项目数量 > 行*列

属性

grid-auto-flow: row;(默认)
默认行优先,即项目先水平排列,空间不够再换行
grid-auto-flow: column
列优先,即项目先垂直排列

例:
容器有9个item

  1. <div class="container">
  2. <div class="item">item1</div>
  3. <div class="item">item2</div>
  4. <div class="item">item3</div>
  5. <div class="item">item4</div>
  6. <div class="item">item5</div>
  7. <div class="item">item6</div>
  8. <div class="item">item7</div>
  9. <div class="item">item8</div>
  10. <div class="item">item9</div>
  11. </div>

设置grid 布局

  1. .container {
  2. display: grid;
  3. border: 1px solid;
  4. padding: 0.5em;
  5. grid-template-columns: repeat(3, 1fr);
  6. grid-template-rows: 5em 5em;
  7. }
  8. .container>.item {
  9. background-color: lightsteelblue;
  10. border: 1px solid;
  11. padding: 0.5em;
  12. }

效果 (item7,8,9在隐式轨道上)

设置grid-auto-flow: column;

属性

grid-auto-rows
设置隐式轨道行的高度

设置grid-auto-rows:5em 后,高度与前面的item相同

  1. .container {
  2. display: grid;
  3. border: 1px solid;
  4. padding: 0.5em;
  5. grid-template-columns: repeat(3, 1fr);
  6. grid-template-rows: 5em 5em;
  7. /* grid-auto-flow: column; */
  8. grid-auto-rows: 5em;
  9. }

grid-auto-columns
设置隐式轨道列的宽度

设置grid-auto-columns:1fr 后,宽度与前面的item相同

  1. .container {
  2. display: grid;
  3. border: 1px solid;
  4. padding: 0.5em;
  5. grid-template-columns: repeat(3, 1fr);
  6. grid-template-rows: 5em 5em;
  7. grid-auto-flow: column;
  8. grid-auto-columns: 1fr;
  9. }

2.4 grid area 控制项目位置

grid-area: 行起始编号/列起始编号/行结束编号/列结束编号

将下图中item5变色并放到item9的位置

  1. .container>.item:nth-of-type(5) {
  2. background-color: yellow;
  3. grid-area: 2/2/3/3;
  4. grid-area: 3/3/4/4;
  5. }

  • 当只操作一个单元格时,可以写作以下方式,效果相同
  1. .container>.item:nth-of-type(5) {
  2. background-color: yellow;
  3. /* grid-area: 2/2/3/3; */
  4. grid-area: 2/2;
  5. /* grid-area: 3/3/4/4; */
  6. grid-area: 3/3;
  7. }

  • 当使一个单元格跨越占据多个单元格时,不能省略起始行和列
  1. .container>.item:nth-of-type(5) {
  2. background-color: yellow;
  3. /* grid-area: 2/2/3/3; */
  4. grid-area: 2/2;
  5. /* grid-area: 3/3/4/4; */
  6. grid-area: 3/3;
  7. grid-area: 2/2/4/4;
  8. }

也可用:
span 跨越行数
(span 1 可用auto代替)

  1. .container>.item:nth-of-type(5) {
  2. background-color: yellow;
  3. /* grid-area: 2/2/3/3; */
  4. grid-area: 2/2;
  5. /* grid-area: 3/3/4/4; */
  6. grid-area: 3/3;
  7. /* grid-area: 2/2/4/4; */
  8. grid-area: 2/2/span 2/span 2;
  9. /* 简写: */
  10. /* grid-area: span 2/span 2; */
  11. }

2.5 grid项目对齐方式

前提:设置了宽高,每个项目在其单元格中有剩余空间

  • 设置所有项目在单元格中的对齐

place-items: 垂直对齐方式 水平对齐方式;
(默认值place-items:stretch; 不设置宽高有效)

  1. .container {
  2. /* place-items: 垂直对齐方式 水平对齐方式; */
  3. place-items: start center;
  4. }

  • 设置某一个项目在单元格中对齐

place-self: 垂直对齐方式 水平对齐方式;

  1. .container>.item:nth-of-type(6) {
  2. place-self: end center;
  3. }

  • 设置所有项目作为整体在容器中对齐
    (容器有剩余空间)

place-content: 垂直对齐方式 水平对齐方式;

  1. .container {
  2. display: grid;
  3. background-color: lightyellow;
  4. height: 25em;
  5. border: 1px solid;
  6. padding: 0.5em;
  7. grid-template-columns: repeat(3, 10em);
  8. grid-template-rows: 5em 5em;
  9. gap: 0.5em;
  10. grid-auto-rows: 5em;
  11. /* grid-auto-flow: column; */
  12. /* grid-auto-columns: 1fr; */
  13. place-content: end center;
  14. }

place-content: space-between space-between

  1. .container {
  2. place-content: space-between space-between;
  3. }

2.6 命名式网格布局

在容器中写出命名的布局:

  1. body {
  2. height: 20em;
  3. display: grid;
  4. /* grid-template-rows: 15em 1fr 15em; */
  5. grid-template-rows: 15em minmax(50vw, auto) 15em;
  6. grid-template-columns: 3em minmax(50vh, auto) 3em;
  7. gap: 0.5em;
  8. grid-template-areas:
  9. "h h h"
  10. "l m r"
  11. "f f f";
  12. }
  13. header {
  14. grid-area: h;
  15. }
  16. footer {
  17. grid-area: f;
  18. }
  19. main {
  20. grid-area: m;
  21. }
  22. aside.left {
  23. grid-area: l;
  24. }
  25. aside.right {
  26. grid-area: r;
  27. }

2.7 bootstrap/layui栅格布局原理

以一行为起点,将其平分为12份,控制每个项目所占的列数(份)实现

例:

HTML

  1. <body>
  2. <div class="container">
  3. <!-- 先定义行 -->
  4. <!-- 1 -->
  5. <div class="row">
  6. <span class="item col-12">col12</span>
  7. </div>
  8. <!-- 2 -->
  9. <div class="row">
  10. <span class="item col-6">col6</span>
  11. <span class="item col-6">col6</span>
  12. </div>
  13. <!-- 3 -->
  14. <div class="row">
  15. <span class="item col-4">col6</span>
  16. <span class="item col-4">col6</span>
  17. <span class="item col-4">col6</span>
  18. </div>
  19. <!-- 2:10 -->
  20. <div class="row">
  21. <span class="item col-2">col6</span>
  22. <span class="item col-10">col6</span>
  23. </div>
  24. </div>
  25. </body>

CSS

  1. * {
  2. margin: 0;
  3. padding: 0;
  4. box-sizing: border-box;
  5. }
  6. body {
  7. width: 100vw;
  8. height: 100vh;
  9. display: grid;
  10. place-content: center;
  11. }
  12. .container {
  13. min-width: 80vw;
  14. display: grid;
  15. gap: 0.5em;
  16. }
  17. .container > .row {
  18. display: grid;
  19. grid-template-columns: repeat(12, 1fr);
  20. min-height: 3em;
  21. gap: 0.5em;
  22. }
  23. .container > .row > .item {
  24. padding: 1em;
  25. border: 1px solid;
  26. }
  27. .col-12 {
  28. grid-area: auto / span 12;
  29. }
  30. .col-11 {
  31. grid-area: auto / span 11;
  32. }
  33. .col-10 {
  34. grid-area: auto / span 10;
  35. }
  36. .col-9 {
  37. grid-area: auto / span 9;
  38. }
  39. .col-8 {
  40. grid-area: auto / span 8;
  41. }
  42. .col-7 {
  43. grid-area: auto / span 7;
  44. }
  45. .col-6 {
  46. grid-area: auto / span 6;
  47. }
  48. .col-5 {
  49. grid-area: auto / span 5;
  50. }
  51. .col-4 {
  52. grid-area: auto / span 4;
  53. }
  54. .col-3 {
  55. grid-area: auto / span 3;
  56. }
  57. .col-2 {
  58. grid-area: auto / span 2;
  59. }
  60. .col-1 {
  61. grid-area: auto / span 1;
  62. }
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议