• 网格(grid)布局


    目录

    概述

    使用网格布局水平垂直居中盒子

    基本使用

    1. 定义一个网格

     2. 操控列

     3. 操控行

    4. 网格间隙

     5. 基于线号放置元素

     6. 使用 grid-template-areas 属性放置元素

     7. 控制元素如何排列

    总结


    概述

    网格是由一系列水平(row 行)及垂直的线构(column 列)成的一种布局模式,  也就是说网格布局主要是操控行和列,面试呢常常会问到如何使一个盒子水平垂直居中是css中的一种布局方式,网格布局就是答案之一。

    使用网格布局水平垂直居中盒子

    1. 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>Documenttitle>
    8. <style>
    9. .box {
    10. width: 100px;
    11. height: 100px;
    12. background: skyblue;
    13. }
    14. body {
    15. display: grid;
    16. justify-content: center;
    17. align-items: center;
    18. height: 100vh;
    19. margin: 0;
    20. }
    21. .box {
    22. grid-area: box;
    23. }
    24. style>
    25. head>
    26. <body>
    27. <div class="box">div>
    28. body>
    29. html>

    基本使用

    1. 定义一个网格

    设置元素的 display 值为 grid 或者 inline-grid,仅设置display为grid,而不控制行和列是没有任何效果的。其子元素依旧按照从上至下的默认布局进行排列。

    1. ............
    2. <head>
    3. .............
    4. <style>
    5. .container {
    6. display: grid;
    7. }
    8. .item {
    9. background-color: orange;
    10. word-break: break-all;
    11. }
    12. style>
    13. head>
    14. <body>
    15. <div class="container">
    16. <div class="item">aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiv>
    17. <div class="item">bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbdiv>
    18. <div class="item">cccccccccccccccccccccccccccccccccccccccccccccccdiv>
    19. <div class="item">dddddddddddddddddddddddddddddddddddddddddddiv>
    20. <div class="item">eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeediv>
    21. <div class="item">fffffffffffffffffffffffffffffffffffffffffdiv>
    22. <div class="item">ggggggggggggggggggggggggggggggggggggggdiv>
    23. <div class="item">hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdiv>
    24. <div class="item">iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiidiv>
    25. body>
    26. ..............

     2. 操控列

    通过设置 grid-template-columns,大致分为三种形式

    • 不同列宽:grid-template-columns: 100px 200px 100px;  一个一个设置每一列的宽度,几个宽度即为几列

    • 相同列宽:grid-template-columns: repeat(3, 200px); 对于列宽相等的情况可以使用repeat函数,参数6为6列,200px为列宽

    • 自适应列宽:grid-template-columns: 1fr 1fr 1fr;  将父元素的空间瓜分为3份,每个子元素占据一份

     

     

    1. .container {
    2. display: grid;
    3. /* 设置网格的列宽 */
    4. grid-template-columns: 100px 200px 100px;
    5. grid-template-columns: repeat(3, 200px);
    6. grid-template-columns: 1fr 1fr 1fr;
    7. }

     3. 操控行

    通过设置 grid-template-row,基本同上

    • 不同行宽:grid-template-row: 100px 200px 100px

    • 相同行宽:grid-template-row: repeat(3, 200px)

    • 自适应列宽:grid-template-row: 1fr 1fr 1fr;由于我们没给父盒子加高度,所以父盒子的高度是由其子元素撑开的,故1fr即子元素累计高度的1/3,需要注意的是在没有设置子元素高度的时候,每个子元素的高度以最高的(内容最多的)那个子元素为准

     

     

    1. .container {
    2. display: grid;
    3. grid-template-columns: 1fr 1fr 1fr;
    4. /* 设置网格的行宽 */
    5. grid-template-rows: 100px 200px 100px;
    6. grid-template-rows: repeat(3, 100px);
    7. grid-template-rows: 1fr 1fr 1fr;
    8. }

    4. 网格间隙

    grid-gap: 20px(垂直方向) 10px(水平方向); 用于设置每个网格之间的间隙,是 grid-column-gap, grid-row-gap的简写形式

    1. .container {
    2. display: grid;
    3. /* 设置网格的列宽 */
    4. grid-template-columns: repeat(3, 150px);
    5. grid-template-rows: 1fr 1fr 1fr;
    6. grid-gap: 20px 10px;
    7. }

     5. 基于线号放置元素

    单单控制行和列往往是满足不了需求的。我们可以通过线号手动设置某个子元素的位置。

    • grid-column: grid-column-start/ grid-column-end;
    • grid-row: grid-column-end/ grid-row-end; 
    1. 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>Documenttitle>
    8. <style>
    9. .container {
    10. display: grid;
    11. grid-template-columns: repeat(3, 150px);
    12. grid-template-rows: 1fr 1fr 1fr 1fr 1fr;
    13. grid-gap: 20px 10px;
    14. }
    15. .item {
    16. background-color: orange;
    17. word-break: break-all;
    18. }
    19. .start {
    20. grid-column: 1/4;
    21. grid-row: 1/2;
    22. }
    23. .end {
    24. grid-column: 1/4;
    25. grid-row: 4/5;
    26. }
    27. style>
    28. head>
    29. <body>
    30. <div class="container">
    31. <div class="item start">我是headerdiv>
    32. <div class="item">bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbdiv>
    33. <div class="item">cccccccccccccccccccccccccccccccccccccccccccccccdiv>
    34. <div class="item">dddddddddddddddddddddddddddddddddddddddddddiv>
    35. <div class="item">eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeediv>
    36. <div class="item">fffffffffffffffffffffffffffffffffffffffffdiv>
    37. <div class="item">ggggggggggggggggggggggggggggggggggggggdiv>
    38. <div class="item end">我是footerdiv>
    39. div>
    40. body>
    41. html>

     6. 使用 grid-template-areas 属性放置元素

    grid-template-areas 属性用于设置区域

    给将要放置在区域内的元素设置 grid-area: areaname

    1. 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>Documenttitle>
    8. <style>
    9. #page {
    10. display: grid;
    11. grid-template-columns: 150px 1fr; 设置网格为两列,第一列150px,第二列自适应
    12. grid-template-rows: 100px 500px 100px; 设置网格为三行,第一行150px,第二列500px,...
    13. grid-template-areas: "header header"
    14. // 给这三行两列设置区域,第一行第一列是header,第一行第二列是header
    15. "nav main"
    16. // 第二行第一列是nav,第二行第二列是main
    17. "footer footer";
    18. // 第三行第一列是footer,第三行第二列是footer
    19. grid-gap: 20px 10px;
    20. }
    21. #page>header {
    22. grid-area: header;
    23. background-color: #8ca0ff;
    24. }
    25. #page>nav {
    26. grid-area: nav;
    27. background-color: #ffa08c;
    28. }
    29. #page>main {
    30. grid-area: main;
    31. background-color: #ffff64;
    32. }
    33. #page>footer {
    34. grid-area: footer;
    35. background-color: #8cffa0;
    36. }
    37. style>
    38. head>
    39. <body>
    40. <section id="page">
    41. <header>Headerheader>
    42. <nav>Navigationnav>
    43. <main>Main areamain>
    44. <footer>Footerfooter>
    45. section>
    46. body>
    47. html>

     

     7. 控制元素如何排列

    grid-auto-flow属性用于控制元素如何排列

    • row 逐行填充。

    • column 逐列填充

    • dense 填充空白

     

     

     可以看到 row 是从左至右逐行排列的,如果某个网格占据空间较大,可能会流白

    column 是从上至下逐列排的

    dense 可以填充留白的空间

    总结

    display: grid / inline-grid 开启网格布局

    grid-template-column 控制列

    grid-template-row 控制行

    grid-gap 控制间隙

    grid-column 控制元素占几列

    grid-row 控制元素占几行

    grid-template-area 设置网格区域 ,grid-area 设置元素占据哪个网格区域

    grid-auto-flow 设置网格如何排列

    详细信息查阅官网 网格布局 - CSS(层叠样式表) | MDN

     

  • 相关阅读:
    python和matplotlib可视化笔记
    AlphaFold2源码解析(7)--模型之Evoformer
    浅析STL三大组件,容器 算法 迭代器。
    字节跳动五面都过了,结果被刷了,问了hr原因竟说是...
    使用curl命令传输数据
    脐带间充质干细胞
    [java入门到精通] 11 泛型,数据结构,List,Set
    Spring中Bean的实例化详细流程
    编程中的零代码和低代码解决方案对比
    并发编程之生产者消费者模型
  • 原文地址:https://blog.csdn.net/m0_58239318/article/details/127305175