欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

移动端页面布局技巧、Grid布局基础知识

程序员文章站 2022-06-02 18:49:18
...

实例演示 rem+vw 布局的原理与 rem 的设置技巧

  • DPR: 设备像素比
  • 布局视图: 为了保证内容全部显示,一般设置为980px
  • 视觉视图:
  • 移动设备的布局视图: 375px、width = device-width
    width: 页面的布局的宽度
    device-width: 视觉视图的宽度, 设备宽度
    width = 980px
    device-width: 375px

    width = device-width
    width = 375px

  • 当前的布局视图,就是当前移动设备浏览器的可视区宽度

    1. 布局视图 = 视觉视图 : width = device-width
  • initial-scale=1.0: 1:1 还原视觉视图的布局, 叫理想视图
    1. 理想视图 = 视觉视图 : initial-scale=1.0
  • 目前主流的移动端布局方案: rem + vw

  • 浏览器的默认字号: 16px, 1rem = 16px

  • 为了计算方便, 推荐将 1rem = 100px
  • 通常如设计稿宽度是 750px , DPR = 2, 则 device-width = 750px / DPR = 750 / 2 = 375px
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>rem+vw布局的原理与rem的设置技巧</title>
  8. </head>
  9. <body>
  10. <style>
  11. html {
  12. /* font-size: 100px; */
  13. font-size: calc(100vw / 3.75);
  14. }
  15. /* 因为 font-size是一个可以被继承的属性 */
  16. body {
  17. /* 把字号还原成浏览器默认的字号, 16px */
  18. /* font-size: 16px; */
  19. font-size: 0.16rem;
  20. }
  21. /* 到现在为止,
  22. 1rem = 100px html
  23. 1em = 16px body */
  24. </style>
  25. <div class="box">hello php.cn</div>
  26. <style>
  27. .box {
  28. /* 200px * 50px */
  29. width: 2rem;
  30. height: 0.5rem;
  31. border: 1px solid #000;
  32. background-color: lightgreen;
  33. box-sizing: border-box;
  34. }
  35. /* vw 是 当前屏幕宽度的 百分比 */
  36. /* 1vw = 1% */
  37. /* 当屏幕宽度小于320px的时候, 字号不要再小了,否则就看不清了 */
  38. @media screen and (max-width: 320px) {
  39. html {
  40. font-size: 85px;
  41. }
  42. }
  43. /* 当屏幕宽度大于640px的时候, 字号不要再放大了 */
  44. @media screen and (min-width: 640px) {
  45. html {
  46. font-size: 170px;
  47. }
  48. }
  49. </style>
  50. </body>
  51. </html>

Grid 布局相关属性

  • Grid 布局基本步骤:创建 Grid 容器 => 将 Grid 项目放到容器中相应食用油步 => 设置容器和项目属性

创建 Grid 容器(显式)

  • 隐式 Grid 容器,当显式不能放置所有项目时会自动创建
STT 属性 说明
1 display: grid; 声明容器为网格容器
2 grid-template-columns: 30rem 30rem 30rem 显示的划分列,生成指定数量的单元格来放置项目
3 grid-template-rows: 30rem 30rem 30rem 显示的划分行,与列组成单元格
4 grid-auto-columns: auto; 根据项目数量在容器中隐式生成行与列来放置项目,列宽自动
5 grid-auto-rows: 150px; 根据项目数量在容器中隐式生成行与列来放置项目,行高 150 PX
6 grid-auto-flows: column; 声明项目在网格中自动填充方案,列优先
7 grid-auto-flows: row; 声明项目在网格中自动填充方案,行优先

设置网格单元格数量尺寸单位

  • 使用repeat重复设置单元格时命名网格线会自动添加索引
  • repeat(3,[col-start] 100px [col-end]):只需设置命名前缀,编号会自动生成
  • grid-column-end: cil-end 3;: 前缀索引可以应用到自动生成的命名网格线
STT 单位
1 px: 固定宽度
1 rem: 根据根元素字号大小
2 %: 百分比
3 auto: 自动计算
4 fr: 比例
5 repeat('重复次数', '每次大小'): 重复生成
6 分组:
7 minmax: 区间
8 auto-fill: 自动填充

将项目填充到指定单元格

  • 默认从左上角开始,从左到右,从上到下依次从 1 开始编号
  • 如果从右下角开始,由下向上,由右向左依次从-1 开始编号
  • 开始线编号为当前项目默认编号时可省略
  • 根据网格线可以将项目放到网格线形成的封闭矩形区域中
  • 网格线编号支持语义化自定义
  1. grid-template-columns: [col1-s] 100px [col1-e col2-s] 100px;
  2. grid-template-rows: [row1-s] 100px [row1-e] 100px;
  3. grid-column-start: col2-s;
  4. grid-row-start: row1-s;
STT 示例 说明
1 grid-row-start: 1; 设置开始行线编号,默认即从 1 开始
1 grid-row-end: 3; 设置结束行线编号为 3
2 grid-column-start: 1; 设置开始列线编号,默认即从 1 开始
2 grid-column-end: 2; 设置开始列线编号为 2
3 grid-row: 1 / 3; 简写,开始行线编号 / 结束行线编号
4 grid-colum: 1 / 2; 简写,开始列线编号 / 结束列线编号
5 grid-row-start: 2 span 2 设置开始行线编号为 2 跨 2 行,== grid-row: 1 / 3;
6 grid-colum-start: 2 span 2 设置开始列线编号为 2 跨 2 列,== grid-colum: 1 / 3;
7 grid-row: 3 / span 2 设置开始行线编号为 3,然后跨 2 行
8 grid-colum: 2 / span 2 设置开始行线编号为 3,然后跨 2 列
9 grid-area: 1 1 3 2 网格区域行开始/列开始/行结束/列结束
9 grid-area: 3 / 1 / span 1 / span 3; 行 3 开始,列 1 开始,行跨 1,列跨 3

自定义命名网格区域: grid-template-areas

  • 可以每一个网格区域设置一个语义化的名称
  • 具有名称的网格区域称之为命名区域
  • 名称相同的网格区域会自动合并形成更大的区域空间
  • 项目设置的区域名称后会自动填充到容器中对应的命名区域
  1. .container {
  2. /* 创建网格区域 */
  3. display: grid;
  4. grid-template-columns: 30rem 30rem 30rem;
  5. grid-template-rows: 30rem 30rem 30rem;
  6. /* 设置命名网格区域相同名称的命名区域会合并 */
  7. grid-template-areas:
  8. "header header header"
  9. "left main rigth"
  10. "footer footer footer";
  11. }
  12. .item {
  13. grid-area: header;
  14. }

网格区域占位符

  • 当项目默认已填充到正确的区域中无需设置时,可以使用.作为占位符
  1. .container {
  2. /* 设置命名网格区域相同名称的命名区域会合并 */
  3. grid-template-areas:
  4. "header header header"
  5. ". . ."
  6. "footer footer footer";
  7. }
  8. .item {
  9. grid-area: header;
  10. }

命名网格区域线默认名称

  • 区域起始行列: 区域名称-start; 如: header-start、header-start, 表示区域起始行和起始列;
  • 区域结束行列: 区域名称-end; 如: header-end、header-end, 表示区域结束行和结束列;
  1. .item {
  2. grid-area: header-start / header-start / header-end / header-end;
  3. }

项目在”容器”中的对齐方式

  • 容器必须有剩余空间
STT 属性 说明
1 justify-content: start/end/center; 设置项目在容器水平方向的对齐方式:开始/结束/居中;默认开始
2 justify-content: space-between/space-around/space-evenly; 设置项目在容器水平方向的对齐方式:两端/分散/平均;
3 align-content: start/end/center; 设置项目在容器垂直方向的对齐方式:开始/结束/居中;默认开始
4 align-content: space-between/space-around/space-evenly; 设置项目在容器垂直方向的对齐方式:两端/分散/平均;
5 place-content: '水平方向' '垂直方向'; 简写

项目在所在的”单元格”中的对齐方式

  • 单元格必须有剩余空间
STT 属性 说明
justify-items: start/end/center; 设置所有项目在单元格/网格区域中,水平方向的对齐方式: 开始/结束/居中;默认开始
align-items: start/end/center; 设置所有项目在单元格/网格区域中,垂直方向的对齐方式: 开始/结束/居中;默认开始
place-items: '水平方向' '垂直方向'; 简写

设置某个项目在所在的”单元格”中的对齐方式

STT 属性 说明
justify-self: start/end/center; 设置某个项目在单元格/网格区域中,水平方向的对齐方式: 开始/结束/居中;默认开始
align-self: start/end/center; 设置某个项目在单元格/网格区域中,垂直方向的对齐方式: 开始/结束/居中;默认开始
place-self: ‘水平方向’ ‘垂直方向’;` 简写

设置容器行与列之间的间距

  • gap: 5px;设置行列间距,行与列间距相等可只写一个值;
  • gap: 行间距 列间距;
  • column-gap: 列间距;
  • row-gap: 行间距;
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>grid布局中相关属性</title>
  8. <style>
  9. * {
  10. margin: 0;
  11. padding: 0;
  12. outline: none;
  13. box-sizing: border-box;
  14. }
  15. .container {
  16. background-color: #f2f3bb;
  17. width: 40rem;
  18. height: 40rem;
  19. /* 创建网格容器 */
  20. display: grid;
  21. grid-template-columns: repeat(3, 10rem);
  22. grid-template-rows: repeat(3, 10rem);
  23. gap: 0.5rem;
  24. /* 设置所有项目在容器水平对方方式 */
  25. /* justify-content: start; */
  26. /* justify-content: end; */
  27. /* justify-content: center; */
  28. /* 设置所有项目在容器垂直对方方式 */
  29. /* align-content: start; */
  30. /* align-content: end; */
  31. /* align-content: center; */
  32. place-content: center center; /* 所有项目在容器对齐方式 */
  33. /* 设置所有项目在单元格/网格区域水平对方方式 */
  34. justify-items: start;
  35. justify-items: end;
  36. justify-items: center;
  37. /* 设置所有项目在单元格/网格区域垂直对方方式 */
  38. align-items: start;
  39. align-items: end;
  40. align-items: center;
  41. place-items: center center; /* 所有项目在单元格格/网格区域对齐方式 */
  42. }
  43. .item {
  44. width: 5rem;
  45. height: 5rem;
  46. background-color: #df93f7;
  47. }
  48. /* 设置单个项目在单元格/网格区域对齐方式 */
  49. .item.i2 {
  50. background-color: #93e8f7;
  51. /* 水平方向 */
  52. /* justify-self: start; */
  53. justify-self: end;
  54. /* justify-self: center; */
  55. /* 垂直方向 */
  56. /* align-self: start; */
  57. align-self: end;
  58. /* align-self: center; */
  59. place-self: end end;
  60. }
  61. </style>
  62. </head>
  63. <body>
  64. <!-- Grid容器 -->
  65. <div class="container">
  66. <div class="item i1">item1</div>
  67. <div class="item i2">item2</div>
  68. <div class="item i3">item3</div>
  69. <div class="item i4">item4</div>
  70. <div class="item i5">item5</div>
  71. <div class="item i6">item6</div>
  72. </div>
  73. </body>
  74. </html>

移动端页面布局技巧、Grid布局基础知识