引用:

  1. CSS 网格容器 | 菜鸟教程

notes
  1. 网格是一组相交的水平线和垂直线,它定义了网格的列和行。
  2. CSS 提供了一个基于网格的布局系统,带有行和列,可以让我们更轻松地设计网页,而无需使用浮动和定位。
  3. 网格布局由一个父元素及一个或多个子元素组成。
  4. 当一个 HTML 元素将 display 属性设置为 gridinline-grid 后,它就变成了一个网格容器,这个元素的所有直系子元素将成为网格元素。
  5. 我们通过 grid-template-columnsgrid-template-rows 属性来定义网格中的行和列。
  6. 这些属性定义了网格的轨道,一个网格轨道就是网格中任意两条线之间的空间。
  7. grid-template-columns 定义列数
  8. grid-template-rows 定义每一行的高度
  9. 轨道可以使用任何长度单位进行定义。
  10. 网格引入了 fr 单位来帮助我们创建灵活的网格轨道。一个 fr 单位代表网格容器中可用空间的一等份。
  11. 一个网格单元是在一个网格元素中最小的单位, 从概念上来讲其实它和表格的一个单元格很像。
  12. 一旦一个网格元素被定义在一个父级元素当中,那么他的子级元素将会排列在每个事先定义好的网格单元中。
  13. 网格元素可以向行或着列的方向扩展一个或多个单元,并且会创建一个网格区域。
  14. 网格区域的形状应该是一个矩形 - 也就是说你不可能创建出一个类似于”L”形的网格区域。
  15. 网格元素的垂直线方向称为列(Column)
  16. 网格元素的水平线方向称为行(Row)
  17. 网格间距(Gap)指的是两个网格单元之间的网格横向间距(Column Gap)或网格纵向间距(Row Gap)
  18. 调整间隙大小
    1. grid-column-gap
    2. grid-row-gap
    3. grid-gap
  19. 列与列,行与行之间的交接处就是网格线
  20. 使用网格线
    1. grid-column-start
    2. grid-column-end
    3. grid-row-start
    4. grid-row-end

demo 数字输入框

练习 grid 布局

image.png

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>test 数字输入框</title>
  6. <link rel="stylesheet" href="./index.css">
  7. </head>
  8. <body>
  9. <input type="text" id="numberInput">
  10. <div class="grid-container" id="grid">
  11. <div class="btn num1">1</div>
  12. <div class="btn num2">2</div>
  13. <div class="btn num3">3</div>
  14. <div class="btn clear">清空</div>
  15. <div class="btn num4">4</div>
  16. <div class="btn num5">5</div>
  17. <div class="btn num6">6</div>
  18. <div class="btn cancel">取消</div>
  19. <div class="btn num7">7</div>
  20. <div class="btn num8">8</div>
  21. <div class="btn num9">9</div>
  22. <div class="btn confirm">确定</div>
  23. <div class="btn num0">0</div>
  24. <div class="btn backspace">退格</div>
  25. </div>
  26. <script>
  27. const input = document.getElementById("numberInput");
  28. const grid = document.getElementById("grid");
  29. grid.addEventListener("click", function (e) {
  30. input.focus()
  31. const target = e.target;
  32. const currentVal = input.value;
  33. if (target.classList.contains("btn")) {
  34. if (target.classList.contains("num1") || target.classList.contains("num2") ||
  35. target.classList.contains("num3") || target.classList.contains("num4") ||
  36. target.classList.contains("num5") || target.classList.contains("num6") ||
  37. target.classList.contains("num7") || target.classList.contains("num8") ||
  38. target.classList.contains("num9") || target.classList.contains("num0")) {
  39. // 添加数字到输入框
  40. input.value = currentVal + target.textContent;
  41. } else if (target.classList.contains("clear")) {
  42. // 清空输入框
  43. input.value = "";
  44. } else if (target.classList.contains("backspace")) {
  45. // 删除最后一个字符
  46. input.value = currentVal.slice(0, -1);
  47. } else if (target.classList.contains("cancel")) {
  48. // 按需进行其他操作,例如关闭数字键盘
  49. } else if (target.classList.contains("confirm")) {
  50. // 按需进行其他操作,例如提交表单
  51. }
  52. }
  53. });
  54. </script>
  55. </body>
  56. </html>
  1. .grid-container {
  2. display: inline-grid;
  3. grid-template-columns: 100px 100px 100px 100px;
  4. grid-template-rows: 100px 100px 100px 100px;
  5. grid-gap: 10px;
  6. background-color: rgba(0, 0, 0, .2);
  7. padding: 10px;
  8. .btn {
  9. background-color: #eee;
  10. text-align: center;
  11. font-size: 30px;
  12. text-align: center;
  13. line-height: 100px;
  14. border-radius: 15px;
  15. cursor: pointer;
  16. }
  17. .confirm {
  18. grid-area: 3 / 4 / 5 / 4;
  19. line-height: 200px;
  20. }
  21. .confirm {
  22. color: #fff;
  23. background-color: #f40;
  24. }
  25. .cancel {
  26. color: #fff;
  27. background: gray;
  28. }
  29. .num0 {
  30. grid-area: 4 / 1 / 4 / 3;
  31. }
  32. }

image.png