赞
踩
目录
6. 使用 grid-template-areas 属性放置元素
网格是由一系列水平(row 行)及垂直的线构(column 列)成的一种布局模式, 也就是说网格布局主要是操控行和列,面试呢常常会问到如何使一个盒子水平垂直居中是css中的一种布局方式,网格布局就是答案之一。
- <!DOCTYPE html>
- <html lang="en">
-
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Document</title>
- <style>
- .box {
- width: 100px;
- height: 100px;
- background: skyblue;
- }
-
- body {
- display: grid;
- justify-content: center;
- align-items: center;
- height: 100vh;
- margin: 0;
- }
-
- .box {
- grid-area: box;
- }
- </style>
- </head>
-
- <body>
- <div class="box"></div>
- </body>
-
- </html>

设置元素的 display 值为 grid 或者 inline-grid,仅设置display为grid,而不控制行和列是没有任何效果的。其子元素依旧按照从上至下的默认布局进行排列。
- ............
- <head>
- .............
- <style>
- .container {
- display: grid;
- }
- .item {
- background-color: orange;
- word-break: break-all;
- }
- </style>
- </head>
- <body>
- <div class="container">
- <div class="item">aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</div>
- <div class="item">bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb</div>
- <div class="item">ccccccccccccccccccccccccccccccccccccccccccccccc</div>
- <div class="item">dddddddddddddddddddddddddddddddddddddddddd</div>
- <div class="item">eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee</div>
- <div class="item">fffffffffffffffffffffffffffffffffffffffff</div>
- <div class="item">gggggggggggggggggggggggggggggggggggggg</div>
- <div class="item">hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh</div>
- <div class="item">iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii</div>
- </body>
- ..............

通过设置 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份,每个子元素占据一份
- .container {
- display: grid;
- /* 设置网格的列宽 */
- grid-template-columns: 100px 200px 100px;
- grid-template-columns: repeat(3, 200px);
- grid-template-columns: 1fr 1fr 1fr;
- }
通过设置 grid-template-row,基本同上
不同行宽:grid-template-row: 100px 200px 100px
相同行宽:grid-template-row: repeat(3, 200px)
自适应列宽:grid-template-row: 1fr 1fr 1fr;由于我们没给父盒子加高度,所以父盒子的高度是由其子元素撑开的,故1fr即子元素累计高度的1/3,需要注意的是在没有设置子元素高度的时候,每个子元素的高度以最高的(内容最多的)那个子元素为准
- .container {
- display: grid;
- grid-template-columns: 1fr 1fr 1fr;
- /* 设置网格的行宽 */
- grid-template-rows: 100px 200px 100px;
- grid-template-rows: repeat(3, 100px);
- grid-template-rows: 1fr 1fr 1fr;
- }
grid-gap: 20px(垂直方向) 10px(水平方向); 用于设置每个网格之间的间隙,是 grid-column-gap, grid-row-gap的简写形式
- .container {
- display: grid;
- /* 设置网格的列宽 */
- grid-template-columns: repeat(3, 150px);
- grid-template-rows: 1fr 1fr 1fr;
- grid-gap: 20px 10px;
- }
单单控制行和列往往是满足不了需求的。我们可以通过线号手动设置某个子元素的位置。
- grid-column: grid-column-start/ grid-column-end;
- grid-row: grid-column-end/ grid-row-end;
- <!DOCTYPE html>
- <html lang="en">
-
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Document</title>
- <style>
- .container {
- display: grid;
- grid-template-columns: repeat(3, 150px);
- grid-template-rows: 1fr 1fr 1fr 1fr 1fr;
- grid-gap: 20px 10px;
- }
-
- .item {
- background-color: orange;
- word-break: break-all;
- }
-
- .start {
- grid-column: 1/4;
- grid-row: 1/2;
- }
-
- .end {
- grid-column: 1/4;
- grid-row: 4/5;
- }
- </style>
- </head>
-
- <body>
- <div class="container">
- <div class="item start">我是header</div>
- <div class="item">bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb</div>
- <div class="item">ccccccccccccccccccccccccccccccccccccccccccccccc</div>
- <div class="item">dddddddddddddddddddddddddddddddddddddddddd</div>
- <div class="item">eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee</div>
- <div class="item">fffffffffffffffffffffffffffffffffffffffff</div>
- <div class="item">gggggggggggggggggggggggggggggggggggggg</div>
- <div class="item end">我是footer</div>
- </div>
-
- </body>
-
- </html>

grid-template-areas 属性用于设置区域
给将要放置在区域内的元素设置 grid-area: areaname
- <!DOCTYPE html>
- <html lang="en">
-
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Document</title>
- <style>
- #page {
- display: grid;
- grid-template-columns: 150px 1fr; 设置网格为两列,第一列150px,第二列自适应
- grid-template-rows: 100px 500px 100px; 设置网格为三行,第一行150px,第二列500px,...
- grid-template-areas: "header header"
- // 给这三行两列设置区域,第一行第一列是header,第一行第二列是header
- "nav main"
- // 第二行第一列是nav,第二行第二列是main
- "footer footer";
- // 第三行第一列是footer,第三行第二列是footer
- grid-gap: 20px 10px;
- }
-
- #page>header {
- grid-area: header;
- background-color: #8ca0ff;
- }
-
- #page>nav {
- grid-area: nav;
- background-color: #ffa08c;
- }
-
- #page>main {
- grid-area: main;
- background-color: #ffff64;
- }
-
- #page>footer {
- grid-area: footer;
- background-color: #8cffa0;
- }
- </style>
- </head>
-
- <body>
- <section id="page">
- <header>Header</header>
- <nav>Navigation</nav>
- <main>Main area</main>
- <footer>Footer</footer>
- </section>
-
- </body>
-
- </html>

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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。