1、min-content、max-content、auto 空间计算
单列 auto
<body>
<div class="grid">
<div class="item">内容1</div>
<div class="item">内容2</div>
<div class="item">内容3</div>
<div class="item">内容4</div>
</div>
</body>
<style>
.grid {
display: grid;
/* 单列,两列,三列,四列 */
grid-template-columns: auto auto auto auto;
grid-template-columns: auto auto auto;
grid-template-columns: auto auto;
grid-template-columns: auto;
/* 左(自动分配剩余)右(内容最大或最小) */
grid-template-columns: auto max-content;
grid-template-columns: auto min-content;
/* 加间距,方便看列的边界 */
grid-column-gap: 5px;
grid-row-gap: 5px;
background-color: #bee1ff;
padding: 5px;
margin: 50px;
}
.item {
/* 加背景,直观区分列 */
border: 1px solid #000;
padding: 2px;
}
</style>
2、space-between
<div class="container">
<div class="item">用户123</div>
<div class="item">很多内容</div>
<div class="item">内容</div>
<div class="item">很多内容很多内容</div>
</div>
<style>
.container {
display: grid;
gap: 10px;
/* 两个等宽的列 */
grid-template-columns: auto auto;
justify-content: space-between;
background-color: rgb(141, 221, 255);
}
.item {
border: 1px solid;
}
</style>
3、auto-fit、minmax 填满剩余空间
单列布局,当容器宽度不足时自动调整为单列
四列布局:充分利用可用空间的自适应布局
<main>
<div></div>
<div></div>
<div></div>
<div></div>
</main>
<style>
main {
display: grid;
grid-gap: 5px;
/* 1、minmax 定义尺寸范围 */
/* 2、
auto-fill 在宽度足够的条件下预留了空白
auto-fit 在宽度足够的条件下充分利用空间
*/
grid-template-columns: repeat(auto-fit, minmax(600px, 1fr));
border: 3px dashed;
}
div {
background-color: deepskyblue;
height: 100px;
}
</style>
4、grid 命名格子
使用grid-template-areas,通过命名区域实现复杂的网格布局
<div class="container">
<div class="item putao">葡萄</div>
<div class="item longxia">龙虾</div>
<div class="item yangyu">养鱼</div>
<div class="item xigua">西瓜</div>
</div>
<style>
.container {
height: 400px;
display: grid;
/* grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(4, 1fr);
grid-template-areas:
"葡萄 葡萄 葡萄"
"龙虾 养鱼 养鱼"
"龙虾 养鱼 养鱼"
"西瓜 西瓜 西瓜"
; */
/* 简写 */
grid: "葡萄 葡萄 葡萄" 1fr "龙虾 养鱼 养鱼" 1fr "龙虾 养鱼 养鱼" 1fr "西瓜 西瓜 西瓜" 1fr / 1fr 1fr 1fr;
}
.putao {
grid-area: 葡萄;
background-color: greenyellow;
}
.longxia {
grid-area: 龙虾;
background-color: plum;
}
.yangyu {
grid-area: 养鱼;
background-color: slategray;
}
.xigua {
grid-area: 西瓜;
background-color: crimson;
}
.container .item {
display: flex;
align-items: center;
justify-content: center;
}
</style>
5、隐形网格
隐式网格: 超出显式网格范围的项目自动创建新行
<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>
<style>
.container {
display: grid;
grid: 1fr 1fr/1fr 1fr;
grid-auto-rows: 100px;
}
.item:nth-of-type(1) {
background-color: rgb(239, 255, 170);
}
.item:nth-of-type(2) {
background-color: rgb(182, 184, 255);
}
.item:nth-of-type(3) {
background-color: rgb(255, 195, 253);
}
.item:nth-of-type(4) {
background-color: rgb(210, 255, 179);
}
.item:nth-of-type(5) {
background-color: rgb(185, 185, 185);
}
</style>
6、隐式网格2
隐式网格的列布局: grid-auto-columns设置隐式列的宽度
<div class="container2">
<div class="item-a">a</div>
<div class="item-b">b</div>
</div>
<style>
.container2 {
display: grid;
grid-template: 1fr 1fr/1fr 1fr;
/* 额外列(第 3 列 +)宽度固定 60px; */
grid-auto-columns: 60px;
border: 1px solid #000;
}
.item-b {
/* 让 item-b 占第 3 列(第 3-4 根列线之间) */
grid-column: 3/4;
background-color: aqua;
}
</style>
7、grid-auto-flow 流向
默认row 流向: 左到右、从上到下排列
column流向: 上到下、从左到右排列
<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>
<style>
.container{
display: grid;
line-height: 40px;
background-color: skyblue;
/* 默认流向是左往右,再下一行左往右,重复前面方式 */
grid-template-columns: 1fr 1fr;
grid-auto-flow: row;
/* 换一个方向,上往下 */
/* grid-template-rows: 1fr 1fr;
grid-auto-flow: column; */
}
.item{
outline: 1px dotted;
}
</style>
8、grid-auto-flow 图片案例
第一个图片占据两行空间,其他图片自动排列
<div class="container">
<div class="item"><img src="./图片/shu.webp"></div>
<div class="item"><img src="./图片/1.webp"></div>
<div class="item"><img src="./图片/2.webp"></div>
<div class="item"><img src="./图片/3.webp"></div>
<div class="item"><img src="./图片/4.webp"></div>
</div>
<style>
.container {
display: grid;
background-color: skyblue;
/* 1. 修复:去掉 grid-auto-flow: column,用默认 row 按行排列 */
/* 2. 修复:用 minmax(0, 1fr) 防止单元格被图片撑大 */
grid-template:
"a . ." minmax(0, 1fr)
"a . ." minmax(0, 1fr)
/ minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr);
grid-gap: 6px;
}
/* 第一个元素占网格区域 a(2行1列) */
.container .item:first-child {
grid-area: a;
}
/* 修复:图片不溢出、不变形 */
.container img {
display: block;
width: 100%;
height: 100%;
object-fit: cover; /* 按比例裁剪,填满单元格 */
}
</style>
9、dense 填补
dense填补: 自动填补空缺位置,优化空间利用
<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>
<style>
.container {
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-auto-flow: dense;
}
.container .item {
outline: 1px dotted;
}
/* 模拟空缺位置 */
.container .item:first-child {
grid-column-start: 2;
}
</style>
10、grid 简写
<style>
/* 1、 none 表示设置所有子项属性值为初始化值*/
grid:none
2、template
单独:
grid-template-rows:100px 300px;
grid-template-columns:3fr 1fr;
简写:
grid:100px 300px / 3fr 1fr;
4、auto-flow
单独
grid-template-rows: 100px 300px;
grid-auto-flow: column;
grid-auto-columns: 200px;
合并
grid: 100px 300px / auto-flow 200px;
3、template-areas
完整:
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(4, 1fr);
grid-template-areas:
"葡萄 葡萄 葡萄"
"龙虾 养鱼 养鱼"
"龙虾 养鱼 养鱼"
"西瓜 西瓜 西瓜";
简写:
grid:
"葡萄 葡萄 葡萄" 1fr
"龙虾 养鱼 养鱼" 1fr
"龙虾 养鱼 养鱼" 1fr
"西瓜 西瓜 西瓜" 1fr
/ 1fr 1fr 1fr;
</style>
11、place-items 完整写法
place-items:项目在单元格内的居中对齐方式
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div>
<style>
.container {
display: grid;
grid: 1fr 1fr/1fr 1fr;
height: 300px;
background-color: skyblue;
/* 单个,类似flex
justify-content: center;
align-items: center;
*/
/* 合并 */
place-items: center right;
}
.item{
outline: 1px solid;
}
</style>
12、layout栏布局
经典的页面布局: 包含头部、侧边栏、主内容和底部四个区域
<style>
.grid-container {
width: 500px;
height: 400px;
margin: 20px auto;
display: grid;
/* 精简核心:去掉重复线名,换行简化,保留关键命名 */
grid-template:
[r1] "header header header" 1fr [r2]
[r2] "sidebar main main" 2fr [r3]
[r3] "sidebar footer footer" 1fr [r4]
/ [c1] 150px [c2] 1fr [c3] 1fr [c4];
gap: 8px;
}
/* 子项定位(极简写法) */
.grid-container>div{display: flex;justify-content: center;align-items: center;}
.header { grid-area: header; background: #409eff; color: #fff; }
.sidebar { grid-row: r2/r4; grid-column: c1/c2; background: #67c23a; color: #fff; }
.main { grid-area: main; background: #e6a23c; color: #fff; }
.footer { grid-row: r3/r4; grid-column: c2/c4; background: #f56c6c; color: #fff; }
</style>
<body>
<div class="grid-container">
<div class="header">头部</div>
<div class="sidebar">侧边栏</div>
<div class="main">主内容</div>
<div class="footer">底部</div>
</div>
</body>
<!-- Grid 布局示例,含命名网格线 + 区域命名,3 行 3 列分头部 / 侧边 / 主内容 / 底部 -->
13、grid-area 线条版
grid重叠: 图片和标题在同一网格单元格内叠加
<figure>
<img src="./图片/13.png">
<figcaption>自然风景</figcaption>
</figure>
<style>
figure {
display: grid;
}
img {
width: 100%;
}
figure>img,
figure>figcaption {
grid-area: 1 / 1 / 2 / 2;
}
figure>figcaption {
align-self: end;
text-align: center;
background: #0009;
color: #fff;
line-height: 2;
}
</style>
附录
参考资源
- 《CSS新世界》- 张鑫旭