在网页开发中,卡片列表是非常常见的页面组件,比如商品展示、文章列表等场景都会用到。使用CSS Flexbox布局可以灵活控制卡片的排列、间距和对齐方式,同时配合媒体查询就能轻松实现不同屏幕尺寸下的响应式适配,不需要复杂的浮动或定位计算。

Flexbox核心属性说明
要实现响应式卡片列表,首先需要了解Flexbox的几个核心属性,这些属性是控制布局的关键:
- display: flex:将容器设置为Flex容器,内部的子元素会自动成为Flex项目
- flex-wrap:控制Flex项目是否换行,默认值是nowrap不换行,设置为wrap时空间不足会自动换行
- justify-content:控制Flex项目在主轴上的对齐方式,比如space-between可以让项目两端对齐,中间留空
- gap:设置Flex项目之间的间距,比传统的margin设置更方便,不会出现边缘多余间距的问题
- flex:是flex-grow、flex-shrink、flex-basis的简写,用来控制Flex项目的伸缩规则
基础卡片列表布局实现
首先我们先搭建基础的HTML结构,然后添加Flexbox样式实现卡片的基础排列效果。
HTML结构
<div class="card-container">
<div class="card">
<div class="card-img">卡片图片</div>
<div class="card-title">卡片标题</div>
<div class="card-desc">这是卡片的描述内容,用来展示卡片的核心信息</div>
</div>
<div class="card">
<div class="card-img">卡片图片</div>
<div class="card-title">卡片标题</div>
<div class="card-desc">这是卡片的描述内容,用来展示卡片的核心信息</div>
</div>
<div class="card">
<div class="card-img">卡片图片</div>
<div class="card-title">卡片标题</div>
<div class="card-desc">这是卡片的描述内容,用来展示卡片的核心信息</div>
</div>
<div class="card">
<div class="card-img">卡片图片</div>
<div class="card-title">卡片标题</div>
<div class="card-desc">这是卡片的描述内容,用来展示卡片的核心信息</div>
</div>
</div>
基础CSS样式
接下来给容器和卡片添加基础样式,使用Flexbox让卡片排列起来:
/* 容器样式,设置为Flex容器 */
.card-container {
display: flex;
flex-wrap: wrap; /* 空间不足时自动换行 */
justify-content: space-between; /* 两端对齐,中间留空 */
gap: 20px; /* 卡片之间的间距 */
padding: 20px;
max-width: 1200px;
margin: 0 auto; /* 容器居中 */
}
/* 卡片基础样式 */
.card {
/* 基础宽度,后面会通过媒体查询调整 */
flex: 0 0 calc(25% - 15px); /* 一行4个,减去gap的一半平均到每个卡片 */
background-color: #fff;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
overflow: hidden;
}
/* 卡片内部样式 */
.card-img {
height: 160px;
background-color: #f0f0f0;
display: flex;
align-items: center;
justify-content: center;
color: #666;
}
.card-title {
padding: 12px 16px 0;
font-size: 16px;
font-weight: bold;
color: #333;
}
.card-desc {
padding: 8px 16px 16px;
font-size: 14px;
color: #666;
line-height: 1.5;
}
上面的样式在宽度大于1200px的屏幕上,会一行显示4个卡片,卡片之间间距均匀,容器居中显示。但是如果屏幕宽度变小,比如平板或者手机屏幕,4个卡片挤在一起会显得很窄,这时候就需要添加响应式适配规则。
响应式适配实现
使用媒体查询针对不同屏幕尺寸调整卡片的宽度,让布局适配不同设备:
/* 屏幕宽度小于等于992px时,一行显示3个卡片 */
@media (max-width: 992px) {
.card {
flex: 0 0 calc(33.333% - 13.333px); /* 3个卡片,减去gap的平均分配 */
}
}
/* 屏幕宽度小于等于768px时,一行显示2个卡片 */
@media (max-width: 768px) {
.card {
flex: 0 0 calc(50% - 10px); /* 2个卡片,减去gap的平均分配 */
}
}
/* 屏幕宽度小于等于480px时,一行显示1个卡片 */
@media (max-width: 480px) {
.card {
flex: 0 0 100%; /* 占满整行 */
}
.card-container {
padding: 10px;
gap: 15px;
}
}
这里的适配逻辑是,随着屏幕宽度减小,逐步减少一行显示的卡片数量,保证每个卡片都有足够的展示空间,不会出现内容挤压的情况。如果需要调整不同屏幕下的卡片数量,只需要修改对应媒体查询里的flex属性值即可。
常见问题说明
在实际使用过程中,可能会遇到一些问题,这里做简单说明:
- 如果卡片内容高度不一致,Flex项目默认会拉伸对齐,如果需要顶部对齐,可以给
.card添加align-self: flex-start属性 - 使用
gap属性时,要注意旧版本浏览器可能不支持,如果需要兼容旧浏览器,可以用margin代替,但是需要额外处理边缘的margin问题 - 如果卡片内部有动态内容,比如描述文字长度不固定,建议给卡片设置最小高度,避免卡片高度差异过大影响布局美观
Flexbox的布局逻辑是沿着主轴和交叉轴两个方向排列项目,理解这两个轴的方向是灵活使用Flexbox的关键,默认主轴是水平方向,交叉轴是垂直方向,修改flex-direction属性可以改变主轴方向。完整代码示例
下面是整合了所有样式的完整代码,可以直接复制到本地运行查看效果:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Flexbox响应式卡片列表</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background-color: #f5f5f5;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}
.card-container {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
gap: 20px;
padding: 20px;
max-width: 1200px;
margin: 0 auto;
}
.card {
flex: 0 0 calc(25% - 15px);
background-color: #fff;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
overflow: hidden;
}
.card-img {
height: 160px;
background-color: #f0f0f0;
display: flex;
align-items: center;
justify-content: center;
color: #666;
}
.card-title {
padding: 12px 16px 0;
font-size: 16px;
font-weight: bold;
color: #333;
}
.card-desc {
padding: 8px 16px 16px;
font-size: 14px;
color: #666;
line-height: 1.5;
}
@media (max-width: 992px) {
.card {
flex: 0 0 calc(33.333% - 13.333px);
}
}
@media (max-width: 768px) {
.card {
flex: 0 0 calc(50% - 10px);
}
}
@media (max-width: 480px) {
.card {
flex: 0 0 100%;
}
.card-container {
padding: 10px;
gap: 15px;
}
}
</style>
</head>
<body>
<div class="card-container">
<div class="card">
<div class="card-img">卡片图片</div>
<div class="card-title">卡片标题</div>
<div class="card-desc">这是卡片的描述内容,用来展示卡片的核心信息</div>
</div>
<div class="card">
<div class="card-img">卡片图片</div>
<div class="card-title">卡片标题</div>
<div class="card-desc">这是卡片的描述内容,用来展示卡片的核心信息</div>
</div>
<div class="card">
<div class="card-img">卡片图片</div>
<div class="card-title">卡片标题</div>
<div class="card-desc">这是卡片的描述内容,用来展示卡片的核心信息</div>
</div>
<div class="card">
<div class="card-img">卡片图片</div>
<div class="card-title">卡片标题</div>
<div class="card-desc">这是卡片的描述内容,用来展示卡片的核心信息</div>
</div>
<div class="card">
<div class="card-img">卡片图片</div>
<div class="card-title">卡片标题</div>
<div class="card-desc">这是卡片的描述内容,用来展示卡片的核心信息</div>
</div>
<div class="card">
<div class="card-img">卡片图片</div>
<div class="card-title">卡片标题</div>
<div class="card-desc">这是卡片的描述内容,用来展示卡片的核心信息</div>
</div>
</div>
</body>
</html>
CSS_Flexbox响应式布局卡片列表flex属性修改时间:2026-07-15 20:15:50