Grid 布局
Grid 简介
CSS Grid(网格布局)是一种二维布局模型,可以同时处理行和列,实现复杂的布局效果。
基本概念
Grid 容器
css
.container {
display: grid;
}Grid 项目
Grid容器的直接子元素自动成为Grid项目。
html
<div class="container">
<div class="item">项目1</div>
<div class="item">项目2</div>
<div class="item">项目3</div>
</div>容器属性
1. grid-template-columns(列定义)
css
.container {
grid-template-columns: 100px 200px 300px; /* 三列,固定宽度 */
grid-template-columns: 1fr 2fr 3fr; /* 三列,比例分配 */
grid-template-columns: repeat(3, 1fr); /* 三列,等宽 */
grid-template-columns: 100px 1fr 2fr; /* 混合使用 */
grid-template-columns: auto-fit minmax(200px, 1fr); /* 自适应 */
}2. grid-template-rows(行定义)
css
.container {
grid-template-rows: 100px 200px 300px; /* 三行,固定高度 */
grid-template-rows: 1fr 2fr 3fr; /* 三行,比例分配 */
grid-template-rows: repeat(3, 1fr); /* 三行,等高 */
grid-template-rows: 100px 1fr 2fr; /* 混合使用 */
}3. grid-template-areas(区域定义)
css
.container {
grid-template-areas:
"header header header"
"sidebar main main"
"footer footer footer";
}
.header {
grid-area: header;
}
.sidebar {
grid-area: sidebar;
}
.main {
grid-area: main;
}
.footer {
grid-area: footer;
}4. grid-template(简写)
css
.container {
grid-template:
"header header header" 60px
"sidebar main main" 1fr
"footer footer footer" 60px
/ 200px 1fr 1fr;
}5. grid-column-gap 和 grid-row-gap(间距)
css
.container {
grid-column-gap: 20px; /* 列间距 */
grid-row-gap: 20px; /* 行间距 */
}6. grid-gap(简写)
css
.container {
grid-gap: 20px; /* 行列间距相同 */
grid-gap: 20px 30px; /* 行间距20px,列间距30px */
}7. justify-items(水平对齐)
css
.container {
justify-items: start; /* 起点对齐 */
justify-items: end; /* 终点对齐 */
justify-items: center; /* 居中对齐 */
justify-items: stretch; /* 拉伸(默认) */
}8. align-items(垂直对齐)
css
.container {
align-items: start; /* 起点对齐 */
align-items: end; /* 终点对齐 */
align-items: center; /* 居中对齐 */
align-items: stretch; /* 拉伸(默认) */
}9. place-items(简写)
css
.container {
place-items: center center; /* 水平垂直居中 */
place-items: start end; /* 水平起点,垂直终点 */
}10. justify-content(整体水平对齐)
css
.container {
justify-content: start; /* 起点对齐 */
justify-content: end; /* 终点对齐 */
justify-content: center; /* 居中对齐 */
justify-content: stretch; /* 拉伸 */
justify-content: space-around; /* 环绕对齐 */
justify-content: space-between; /* 两端对齐 */
justify-content: space-evenly; /* 均匀对齐 */
}11. align-content(整体垂直对齐)
css
.container {
align-content: start; /* 起点对齐 */
align-content: end; /* 终点对齐 */
align-content: center; /* 居中对齐 */
align-content: stretch; /* 拉伸 */
align-content: space-around; /* 环绕对齐 */
align-content: space-between; /* 两端对齐 */
align-content: space-evenly; /* 均匀对齐 */
}12. place-content(简写)
css
.container {
place-content: center center; /* 水平垂直居中 */
place-content: start end; /* 水平起点,垂直终点 */
}项目属性
1. grid-column-start 和 grid-column-end(列位置)
css
.item {
grid-column-start: 1; /* 从第1列开始 */
grid-column-end: 3; /* 到第3列结束 */
}2. grid-column(简写)
css
.item {
grid-column: 1 / 3; /* 从第1列到第3列 */
grid-column: 1 / span 2; /* 从第1列开始,跨越2列 */
grid-column: span 2; /* 跨越2列 */
}3. grid-row-start 和 grid-row-end(行位置)
css
.item {
grid-row-start: 1; /* 从第1行开始 */
grid-row-end: 3; /* 到第3行结束 */
}4. grid-row(简写)
css
.item {
grid-row: 1 / 3; /* 从第1行到第3行 */
grid-row: 1 / span 2; /* 从第1行开始,跨越2行 */
grid-row: span 2; /* 跨越2行 */
}5. grid-area(区域)
css
.item {
grid-area: header; /* 使用区域名称 */
grid-area: 1 / 1 / 2 / 3; /* 从第1行第1列到第2行第3列 */
}6. justify-self(水平对齐)
css
.item {
justify-self: start; /* 起点对齐 */
justify-self: end; /* 终点对齐 */
justify-self: center; /* 居中对齐 */
justify-self: stretch; /* 拉伸 */
}7. align-self(垂直对齐)
css
.item {
align-self: start; /* 起点对齐 */
align-self: end; /* 终点对齐 */
align-self: center; /* 居中对齐 */
align-self: stretch; /* 拉伸 */
}8. place-self(简写)
css
.item {
place-self: center center; /* 水平垂直居中 */
place-self: start end; /* 水平起点,垂直终点 */
}常用布局
1. 基本网格
css
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-gap: 20px;
}2. 圣杯布局
css
.container {
display: grid;
grid-template-areas:
"header header header"
"sidebar main main"
"footer footer footer";
grid-template-rows: 60px 1fr 60px;
grid-template-columns: 200px 1fr 1fr;
min-height: 100vh;
}
.header {
grid-area: header;
}
.sidebar {
grid-area: sidebar;
}
.main {
grid-area: main;
}
.footer {
grid-area: footer;
}3. 响应式网格
css
.container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
grid-gap: 20px;
}4. 不规则网格
css
.container {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(2, 200px);
grid-gap: 20px;
}
.item1 {
grid-column: 1 / 3;
grid-row: 1 / 2;
}
.item2 {
grid-column: 3 / 5;
grid-row: 1 / 2;
}
.item3 {
grid-column: 1 / 2;
grid-row: 2 / 3;
}
.item4 {
grid-column: 2 / 4;
grid-row: 2 / 3;
}
.item5 {
grid-column: 4 / 5;
grid-row: 2 / 3;
}5. 图片网格
css
.container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
grid-gap: 20px;
}
.item {
position: relative;
overflow: hidden;
}
.item img {
width: 100%;
height: 100%;
object-fit: cover;
}实际应用
1. 仪表盘布局
css
.dashboard {
display: grid;
grid-template-columns: 250px 1fr;
grid-template-rows: 60px 1fr;
grid-template-areas:
"sidebar header"
"sidebar main";
min-height: 100vh;
}
.header {
grid-area: header;
background-color: #333;
color: white;
padding: 0 20px;
display: flex;
align-items: center;
}
.sidebar {
grid-area: sidebar;
background-color: #f5f5f5;
padding: 20px;
}
.main {
grid-area: main;
padding: 20px;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
grid-gap: 20px;
}2. 图片画廊
css
.gallery {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
grid-auto-rows: 250px;
grid-gap: 20px;
}
.gallery-item {
position: relative;
overflow: hidden;
}
.gallery-item img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.3s;
}
.gallery-item:hover img {
transform: scale(1.1);
}3. 卡片布局
css
.card-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
grid-gap: 20px;
}
.card {
background-color: white;
border-radius: 8px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
overflow: hidden;
}
.card img {
width: 100%;
height: 200px;
object-fit: cover;
}
.card-content {
padding: 20px;
}面试常见问题
1. Grid 和 Flexbox 的区别?
- Grid: 二维布局,同时处理行和列
- Flexbox: 一维布局,只处理行或列
css
/* Grid */
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
/* Flexbox */
.container {
display: flex;
flex-wrap: wrap;
}2. grid-template-columns 的常用值?
css
grid-template-columns: 100px 200px 300px; /* 固定宽度 */
grid-template-columns: 1fr 2fr 3fr; /* 比例分配 */
grid-template-columns: repeat(3, 1fr); /* 重复模式 */
grid-template-columns: auto-fit minmax(200px, 1fr); /* 自适应 */3. grid-area 的作用是什么?
grid-area用于定义Grid项目的区域,可以使用区域名称或行列位置。
css
.item {
grid-area: header; /* 使用区域名称 */
grid-area: 1 / 1 / 2 / 3; /* 使用行列位置 */
}4. 如何实现响应式Grid布局?
css
.container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
grid-gap: 20px;
}5. justify-items 和 justify-content 的区别?
- justify-items: 控制Grid项目在单元格内的水平对齐
- justify-content: 控制整个Grid在容器内的水平对齐
css
.container {
justify-items: center; /* 项目居中 */
justify-content: center; /* 整体居中 */
}通过理解CSS Grid的各种属性和应用,可以轻松实现复杂的二维布局效果。