Skip to content

响应式布局

作者:青见春山
发表于:2026-07-24
字数统计:1578 字
预计阅读6分钟

Flexbox、Grid、媒体查询等响应式布局方案

1. Flex 弹性布局

Flexbox 是一维布局模型,适合沿主轴分配空间并在交叉轴上对齐项目。

当给父盒子设置 flex 布局,子元素 float,clear,vertical-align 会失效

1.1 原理

通过给父盒子添加 flex 属性,控制子盒子的位置和排列方式

1.2 常见父项元素属性

主轴与侧轴:

  • 在默认 flex-direction: row 且从左到右、横排书写的页面中,主轴水平向右
  • 侧轴与主轴垂直;它的实际方向还受书写模式、文本方向和 flex-direction 影响,并不恒等于物理 x/y 轴
  • 元素跟着主轴排列

1.2.1 flex-direction 设置主轴方向

描述
row默认值,从左到右
row-reverse从右到左
column从上到下
column-reverse从下到上

1.2.2 justify-content:设置主轴子元素排列方式

描述
flex-start默认值,从头部开始
flex-end从尾部开始
center居中对齐
space-around平分剩余空间
space-between先两边贴边,再平分剩余空间

垂直居中:

css
flex-direction: column;
justify-content: center;

1.2.3 flex-wrap 设置子元素是否换行

flex 布局中默认子元素不换行,装不开子元素宽度会缩小

  • flex-wrap: nowrap; 不换行
  • flex-wrap: wrap; 换行

1.2.4 align-items 设置侧轴上的子元素排列方式(单行)

描述
flex-start从侧轴起点对齐
flex-end从侧轴终点对齐
center居中(垂直居中)
stretch拉伸

1.2.5 align-content 设置侧轴上子元素的排列方式(多行)

描述
flex-start默认值,在侧轴头部开始排列
flex-end在侧轴尾部开始排列
center在侧轴中间显示
space-around子项在侧轴平分剩余空间
space-between子项在侧轴先分布两头,再平分剩余空间
stretch设置子项拉伸

1.2.6 flex-flow 复合属性

css
flex-flow: flex-direction flex-wrap;

1.3 flex 布局子项常见属性

1.3.1 flex 属性

flexflex-growflex-shrinkflex-basis 的简写。单个无单位数字常用于按比例分配剩余空间,但不是 flex 的完整定义。

css
.item {
  flex: <number>; /* 常见浏览器展开为 <number> 1 0% */
}

1.3.2 order 属性

控制项目在容器中的先后顺序,可以为负值,0

css
.item {
  order: <number>; /* default 0 */
}

1.3.3 flex-grow

定义项目放大比例,正整数默认为 0 不放大

所有项目该属性为 1,则将等分剩余空间;若一个为 2,其他为 1,则前者占的剩余空间比其他项多一倍

css
.item {
  flex-grow: <number>; /* default 0 */
}

1.3.4 flex-shrink

定义项目缩小比例,默认为 1 缩小,0 为不缩小

css
.item {
  flex-shrink: <number>; /* default 1 */
}

1.3.5 align-self

css
.item {
  align-self: auto | flex-start | flex-end | center | baseline | stretch;
}

align-self 允许单个项目有与其他项目不一样的对齐方式

2. Grid 网格布局

Grid 是二维布局模型,适合同时控制行和列;Flexbox 与 Grid 解决的问题不同,是否产生空白取决于具体尺寸和对齐规则。

css
display: grid; /* 改变方式为 grid */
grid-template-columns: 1fr 1fr 1fr; /* 均分三列 */
gap: 30px; /* 元素间距为 30px */
  • grid-template-columns:列数列宽

2.1 网格轨道

  • grid-template-columns
  • grid-template-rows

2.2 grid-template-columns: repeat()

定义网格容器中水平方向的网格轨道布局结构

css
grid-template-columns: repeat(number, size1, size2, ...);
  • number 每行中重复的次数
  • size 所要重复的值,可以是具体长度值(像素,百分比,fr 等)

可以有多个,每个值对应一列的宽

如果只有一个,所有列将使用相同的大小,比如 grid-template-columns: repeat(3, 1fr);

2.3 grid-template-rows: repeat()

行高

auto-fill 自动填充,一行或一列中尽可能容纳更多的单元格

2.4 fr 关键字

代表网格容器可用空间的一等份

css
grid-template-columns: 200px 1fr 2fr;
/* 第一个容器列宽 200px,剩下的宽度分为两部分,1/3 和 2/3 */

2.5 minmax() 函数

给定一个长度范围

css
grid-template-columns: 1fr 1fr minmax(300px, 2fr);
/* 第三列下限为 300px;有可分配空间时按 2fr 参与弹性分配 */

2.6 auto 关键字

由浏览器确定长度

2.7 gap

css
grid-row-gap: 10px; /* 行间距 */
grid-column-gap: 10px; /* 列间距 */
grid-gap: 10px 10px; /* 简写 */

2.8 类似合并单元格的布局

css
grid-row: 2 / 5; /* 从第 2 条网格线开始,到第 5 条网格线结束 */
grid-column: 1 / span 2; /* 从第 1 条列线开始,跨 2 个轨道 */

2.9 响应式布局

repeat + auto-fill + minmax 去掉右侧空白

css
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
/* 列宽至少是 200,若有空余则一起等分 */
  • min 是轨道最小值,可用长度、百分比或 min-content 等,但不能使用 fr
  • max 是轨道最大值,可用长度、百分比、内容关键字或 fr 等弹性值

意思是在满足最小和最大的范围内,尽可能占据空间

fr 等分响应式

css
grid-template-columns: 1fr 1fr 1fr;

repeat + auto-fill 固定列宽变列数

css
grid-template-columns: repeat(auto-fill, 200px); /* 固定列宽 200px,数量自适应 */

3. 媒体查询

使用媒体查询针对不同宽度的设备进行布局和样式的设置,响应式开发的原理。

需要一个父级做布局容器,通过媒体查询改变容器大小,再改变里面子元素排列和大小。

3.1 语法

1.mediatype 查询类型

  • all 适用所有设备
  • print 打印机和打印预览
  • screen 电脑屏幕,平板电脑,智能手机等
css
@media mediatype and/not/only (media feature) {
    CSS-Code;
}

2.关键字

将媒体类型或多个媒体特性连接到一起作为媒体查询的条件

  • and:且
  • not:排除某个媒体类型(非)
  • only:指定某个媒体类型,可省略

从小到大写,具有层叠性

3.2 容器类

container 类:固定宽度

container-fluid 类:流式布局容器,百分百宽度,占全部视口的容器