0

0

如何用 Flexbox 实现响应式 2×2 卡片网格布局

霞舞

霞舞

发布时间:2026-02-25 22:41:02

|

772人浏览过

|

来源于php中文网

原创

如何用 Flexbox 实现响应式 2×2 卡片网格布局

本文详解如何通过正确设置 flexbox 容器与子项的尺寸、结构和样式,构建稳定、响应式的 2×2 卡片布局,重点解决因 html 结构错位和宽度单位不当导致的换行失效问题。

本文详解如何通过正确设置 flexbox 容器与子项的尺寸、结构和样式,构建稳定、响应式的 2×2 卡片布局,重点解决因 html 结构错位和宽度单位不当导致的换行失效问题。

在使用 Flexbox 实现 2×2 网格布局时,常见误区是将 Flex 属性错误地应用在父容器的后代元素上(如 #structure div),或对子项设置固定百分比宽度(如 width: 40%)却未考虑边距与盒模型影响,最终导致四张卡片无法均匀分布在两行两列中——而是全部堆叠为单列或意外换行。

核心问题在于两点:
HTML 结构不匹配 Flex 容器逻辑:原代码中

内直接并列 4 个
,但 Flex 布局要求所有需参与排列的子项必须是同一父容器的直系子元素。而 #structure div 选择器虽选中了这 4 个 div,但其父级 #structure 本身并未声明 display: flex,Flex 属性实际未生效。
宽度单位缺乏响应性与容错空间:width: 40% 在存在左右 margin: 5% 的情况下,单个卡片实际占用宽度 = 40% + 5% + 5% = 50%,看似可容纳两个;但因浏览器渲染精度、box-sizing 缺失及 flex-wrap 对间隙的计算差异,极易触发强制换行,破坏 2×2 结构。

✅ 正确实现方案

1. 重构 HTML 结构:分组 + 统一容器

将 4 张卡片分为两组,每组放入一个独立的 .structure

中,确保每个 Flex 容器仅管理 2 个子项:

<section class="structure">
  <div><article class="service-box">...</article></div>
  <div><article class="service-box">...</article></div>
</section>

<section class="structure">
  <div><article class="service-box">...</article></div>
  <div><article class="service-box">...</article></div>
</section>

? 提示:若需语义化更强的单容器方案,也可保留单一

,但须移除中间所有包裹
,让 4 个
成为 .structure 的直接子元素(见进阶写法)。

2. 修正 CSS:容器设 Flex,子项控宽度与盒模型

.structure {
  display: flex;
  justify-content: space-between; /* 水平分散,留白均衡 */
  flex-wrap: wrap;                /* 允许换行(此处实际不换,但增强健壮性) */
  gap: 20px;                      /* 推荐替代 margin,更可控(现代浏览器支持) */
}

.service-box {
  flex: 1 1 calc(50% - 10px);     /* 主要方式:弹性分配,基础宽度≈50%减去间隙 */
  max-width: calc(50% - 10px);     /* 防止超宽 */
  box-sizing: border-box;         /* 关键!确保 padding/border 不撑大宽度 */
  margin: 0;                      /* 移除原 margin,改用 gap 或重置 */
  /* 删除 width: 40% / 40vw —— 它与 flex 分配冲突 */
}

⚠️ 注意:原文建议的 width: 40vw 虽可工作,但属“硬编码”方案,在小屏下可能过宽(如 375px 屏幕 → 150px,但卡片内容会挤压)。推荐使用 flex + calc() 的响应式组合,兼顾适配与语义。

3. 完整精简版代码(含修复)

/* 关键修复部分 */
.structure {
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 30px; /* 替代 margin,统一控制间距 */
  padding: 0 20px;
}

.service-box {
  flex: 1 1 calc(50% - 15px); /* 每行最多2个,自动适应 */
  max-width: calc(50% - 15px);
  box-sizing: border-box;
  margin: 0; /* 清除原 margin */
  /* 移除 width: 40% / 40vw */
}
<!-- 保持单容器更简洁(推荐) -->
<section class="structure">
  <article class="service-box"> <!-- 直接子元素 -->
    <img  src="..." alt="如何用 Flexbox 实现响应式 2×2 卡片网格布局" ><h3>Training</h3><p>...</p><div class="aritcle_card flexRow">
                                                        <div class="artcardd flexRow">
                                                                <a class="aritcle_card_img" href="/ai/764" title="芝士饼"><img
                                                                                src="https://img.php.cn/upload/ai_manual/000/000/000/175679962212002.png" alt="芝士饼"  onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
                                                                <div class="aritcle_card_info flexColumn">
                                                                        <a href="/ai/764" title="芝士饼">芝士饼</a>
                                                                        <p>芝士饼是一个一站式AI原生应用开发平台,简单几步即可完成应用的创建与发布。</p>
                                                                </div>
                                                                <a href="/ai/764" title="芝士饼" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
                                                        </div>
                                                </div>
  </article>
  <article class="service-box">
    <img  src="..." alt="如何用 Flexbox 实现响应式 2×2 卡片网格布局" ><h3>Get Ready</h3><p>...</p>
  </article>
  <article class="service-box">
    <img  src="..." alt="如何用 Flexbox 实现响应式 2×2 卡片网格布局" ><h3>Fly</h3><p>...</p>
  </article>
  <article class="service-box">
    <img  src="..." alt="如何用 Flexbox 实现响应式 2×2 卡片网格布局" ><h3>Jump!</h3><p>...</p>
  </article>
</section>

✅ 最佳实践总结

  • Flex 容器必须直接包含待排列子项,避免多层无意义包裹;
  • ✅ 使用 flex: 1 1 calc(50% - X) + box-sizing: border-box 替代固定 width,提升响应性;
  • ✅ 优先用 gap 控制子项间距,比 margin 更可靠、无折叠风险;
  • ✅ 在 CodePen 或本地调试时,启用浏览器开发者工具的「Flexbox 布局高亮」功能(Chrome DevTools → Elements → :hov → ✅ Show flexbox overlays),直观验证主轴/交叉轴与换行行为。

按此方案调整后,四张服务卡片将稳定呈现为整齐的 2×2 响应式网格,无论视口宽度如何变化,均能优雅回流为单列(如手机端),真正实现「一次编写,处处可用」的现代布局目标。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

986

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

806

2023.11.06

chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

986

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

806

2023.11.06

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

424

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

596

2023.08.10

margin在css中是啥意思
margin在css中是啥意思

在CSS中,margin是一个用于设置元素外边距的属性。想了解更多margin的相关内容,可以阅读本专题下面的文章。

458

2023.12.18

html边框设置教程
html边框设置教程

本教程将带你全面掌握HTML/CSS边框设置,从基础的border属性讲起,涵盖所有边框样式、圆角设置及高级技巧,帮助你快速上手实现各种边框效果。

41

2025.09.02

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

127

2026.02.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号