place-self
: justify-self
和align-self
的属性简写
```CSS Code
初识grid
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>网格区域填充与隐式网格</title>
<style>
* :not(body) {
outline: 1px dashed red;
}
.container {
width: 600px;
font-size: 2rem;
`display`: grid;
/* 划分网格 */
`grid-template-columns`: repeat(3, 1fr);
`grid-template-rows`: repeat(3, 1fr);
}
.container > .item:first-of-type {
/* 用网格线命名来快速填充: grid-area */
/* 注意顺序是顺时针: 上左下右, 与传统的上右下左的逆时针是完全相反的, 也很记忆 */
/* 上:第一行线,左:第一列线,下:第二行线,右:第三列线 */
/* 简单记忆: 第一个项目占据网格中的1行1列到2行3列之间的区域空间 */
`grid-area`: 1/1/2/3;
background-color: lightgreen;
}
/* 新名称: 由浏览器自动根据项目数据创建的网格空间叫: 隐式网格,对应属性是grid-auto-rows/columns */
.container {
/* 行的方向是可扩展的, 所有行高是有效的 */
`grid-auto-rows`: 150px;
/* 列在沿水平扩展,空间是有限的,以显示网格的设置为准,这里设置不必设置,设置也是无效的 */
/* `grid-auto-columns`: 100px; */
/* 那么什么时候这个隐式的列宽会有效呢,在项目排列顺序发生变化时,即项目流动方向不再是默认的:先行后列,而先列后行,且在水平方向有剩余空间时 */
/* `grid-auto-flow`: column; */
}
</style>
</head>
<body>
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
</div>
</body>
</html>
布局实操
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>创建网格区域模板与项目填充</title>
<style>
* :not(body) {
outline: 1px dashed red;
}
.container {
width: 600px;
height: 300px;
font-size: 2rem;
display: grid;
/* 给每一个单元格命名 */
`grid-template-areas`:
'a b c'
'd e f'
'g h i';
}
.container > .item:first-of-type {
/* 项目命名: grid-area */
grid-area: a;
background-color: lightgreen;
}
/* 注意: 被命名的网格区域的位置, 与它在源码的书写无关 */
.container > .item:nth-of-type(2) {
/* 虽然它在html源码中是第二个子元素项目,但是在网格中却在第二行第二列 */
grid-area: e;
background-color: lightblue;
}
/* 单元格的合并: 相同名称的项目单元,会将所占空间进行合并,形成网络区域 */
.container > .item:nth-of-type(7) {
/* `grid-column-start`: 1; */
/* `grid-column-end`: -1; */
/* `grid-row-start`: 3; */
/* `grid-row-end`: 4; */
/* 以上项目填充与单元格合并操作可以简写 */
/* `grid-column`: 1 / span 3; */
/* 默认跨一行/列 */
/* `grid-row`: 3; */
/* 如果仍觉得代码太多,还可以用grid-area进一步简化 */
/* 将项目填充到从3行1列开始到3行4列为止的网格区域内 */
/* `grid-area` 3 / 1 / 3 / 4; */
/* 也可直接指定跨越的列数 */
grid-area: 3 / 1 / 3 / span 3;
background-color: lightgray;
}
/* 但现在咱们有了一种更直观的设置方式: 命名区域 */
/* 因为每一个单元格都有了一个名称, 只需要将需要合并的单元格, 起一个相同的名称即可 */
/* 第一步: 将需要合并的单元格的名称, 设置为相同名称*/
.container {
grid-template-areas: 'a b c'
'd e f'
'g g g';
}
/* 第二步: 为需要占据一个或多个单元格的项目进行命名 */
.container > .item:nth-of-type(7) {
`grid-area`: g;
background-color:wheat;
}
</style>
</head>
<body>
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Grid网格所有项目的整体对齐方式</title>
<style>
* :not(body) {
outline: 1px dashed red;
}
.container {
width: 600px;
height: 400px;
font-size: 2rem;
display: grid;
/* 划分网格 */
grid-template-columns: repeat(3, 100px);
grid-template-rows: repeat(3, 80px);
`grid-gap: 10px;`
/* 1. 设置所有项目在网格容器中的对齐方式*/
/* 水平方向 */
/* 默认start */
`justify-content`: start;
justify-content: end;
justify-content: center;
/* 垂直方向 */
/* 默认start */
`align-content`: start;
align-content: end;
align-content: center;
/* 简化 */
/* place-content: 垂直 水平 */
`place-content`: end end;
/* 2. 设置所有项目在单元格内的对齐对齐 */
/* 默认水平与垂直都是自动扩展/拉伸的 */
/* 水平方向 */
`justify-items`: stretch;
justify-items: start;
justify-items: end;
justify-items: center;
/* 垂直方向 */
`align-items`: stretch;
align-items: start;
align-items: end;
align-items: center;
/* 简化 */
/* place-content: 垂直 水平 */
`place-items`: end center;
}
.container > .item {
background-color: wheat;
}
</style>
</head>
<body>
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模拟Bootstrap/layUI等框架的12列栅格布局</title>
<style>
.container {
width: 1000px;
margin: auto;
}
.row {
display: grid;
/* 平均等比分成12份 */
'grid-template-columns': repeat(12, 1fr);
'grid-column-gap': 8px;
height: 50px;
margin-bottom: 10px;
background-color: #eeeeee;
}
.col-1 {
/*起始列编号省略,则为auto, 由容器根据剩余空间自动分配*/
/*grid-column-start: auto;*/
'grid-column-end': span 1;
}
.col-2 {
grid-column-end: span 2;
}
.col-3 {
grid-column-end: span 3;
}
.col-4 {
grid-column-end: span 4;
}
.col-5 {
grid-column-end: span 5;
}
.col-6 {
grid-column-end: span 6;
}
.col-7 {
grid-column-end: span 7;
}
.col-8 {
grid-column-end: span 8;
}
.col-9 {
grid-column-end: span 9;
}
.col-10 {
grid-column-end: span 10;
}
.col-11 {
grid-column-end: span 11;
}
.col-12 {
grid-column-end: span 12;
}
.item {
background-color: lightcyan;
outline: 1px dashed red;;
}
</style>
</head>
<body>
<div class="container">
<!-- 二等份 -->
<div class="row">
<span class="item col-6">6列</span>
<span class="item col-6">6列</span>
</div>
<!-- 三等份 -->
<div class="row">
<span class="item col-4">4列</span>
<span class="item col-4">4列</span>
<span class="item col-4">4列</span>
</div>
<!-- 三列 -->
<div class="row">
<span class="item col-2">2列</span>
<span class="item col-8">8列</span>
<span class="item col-2">2列</span>
</div>
<!-- 未占满 -->
<div class="row">
<span class="item col-3">3列</span>
<span class="item col-3">3列</span>
</div>
<!-- 12列 -->
<div class="row">
<div class="item col-1">1列</div>
<div class="item col-1">1列</div>
<div class="item col-1">1列</div>
<div class="item col-1">1列</div>
<div class="item col-1">1列</div>
<div class="item col-1">1列</div>
<div class="item col-1">1列</div>
<div class="item col-1">1列</div>
<div class="item col-1">1列</div>
<div class="item col-1">1列</div>
<div class="item col-1">1列</div>
<div class="item col-1">1列</div>
</div>
</div>
</body>
</html>
心得体会
Grid提供了类似table的布局技术,在处理复杂页面结合flex发挥更好的效果。