用flex实现九宫格菜单的核心是:父容器设display:flex;flex-wrap:wrap;,子项用width:calc(100%/3-2*间距);height相同或aspect-ratio:1/1;图片用object-fit:cover并包裹在overflow:hidden的.item内,配合媒体查询实现响应式单列/三列切换。

用 Flex 实现九宫格菜单,核心是让 9 个子项自动均分容器空间、保持正方形比例、等比缩放且不拉伸变形。关键不在“设死宽高”,而在利用弹性布局特性 + 容器约束 + 图片裁剪控制。
容器设置 flex-wrap 与尺寸分配
父容器必须启用换行,并通过百分比或 calc 分配单个格子的空间:
- 给父容器设 display: flex; flex-wrap: wrap;,允许子项自动折行
- 每个子项宽度设为 width: calc(100% / 3 - 2 * 间距值);(例如间距 1%,就写
calc(100% / 3 - 2% )) - 高度建议也用相同计算值,或统一设为 aspect-ratio: 1 / 1;(现代浏览器支持,兼容性好于 padding-bottom 方案)
- 用 :nth-of-type(3n) 清除每行最后一项的右外边距,:nth-of-type(n+7) 清除最后一行的下外边距,避免多余空白
图片等比缩放且居中裁剪
九宫格里的图片不能直接设 width/height,否则会变形。正确做法是包裹一层容器再控制:
- 每个菜单项用
<div class="item"><img src="..."></div>结构 - .item 设固定宽高(如上面 calc 计算出的值)和 overflow: hidden;
- img 设 width: 100%; height: 100%; object-fit: cover;
- 对 iOS Safari 13.3 及更早版本,补充 -webkit-object-fit: cover;
响应式适配不同屏幕
纯 flex 本身具备响应能力,但需注意断点处理:
- 小屏(如手机竖屏)可改为单列:媒体查询中设 flex-direction: column;,并取消 width 计算,改用 width: 100%;
- 中屏(平板横屏)维持三列,但可微调间距和圆角等视觉细节
- 避免使用 px 固定高度,全部依赖相对单位(%、rem、vh)或 aspect-ratio
避免常见坑点
实际开发中容易忽略但影响体验的细节:
- 不要给 img 直接加 margin/padding,应在 .item 上操作
- 若用 background-image 替代 img 标签,记得加 background-size: cover; 和 background-position: center;
- 文字叠加在图片上时,确保 .item 有相对定位,文字元素用绝对定位 + z-index 控制层级
- 测试真机 Safari 和微信内置浏览器,尤其关注 object-fit 兼容性和 flex gap 行为差异
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











