gap属性在旧版Safari(iOS≤14.1)、IE、Android WebView等浏览器中被语法忽略而非表现异常,需手动降级;推荐用margin+ :nth-child模拟或flex-gap-polyfill自动转换。
gap 属性在旧版 Safari、IE、Android WebView 等浏览器中根本不会被解析,不是“表现异常”,而是静默失效——你得主动降级,不能指望 @supports 或 autoprefixer 自动兜底。
旧版 Safari(iOS ≤14.1 / macOS ≤11.2)的 CSS 引擎压根不认识 gap 这个属性名。DevTools 的 Computed 面板里它会显示为 not supported,getComputedStyle(el).gap 返回空字符串。这不是渲染 bug,是语法层面的忽略。
gap: 12px,这些浏览器会跳过整条规则,连带影响后续同块声明中的其他样式(如 row-gap 和 column-gap)@supports (gap: 0) 在部分旧 Safari 中返回 true 却不生效,属于 UA 检测缺陷,不能依赖display: flex 都需要前缀,更别说 gap
这是最轻量、无需构建工具的方案,适合小范围修复或快速上线场景。
:not(:first-child):iOS Safari 8–13.3 对伪类支持不稳定,:nth-child(n+2) 更可靠flex-shrink: 0,否则内容长时会被压缩,导致 margin-left 被“吞掉”.item:nth-child(1) { margin-left: 0; }
--gap: 12px,方便后续响应式调整border 或 padding,需在 margin-left 中预留空间,否则视觉间距不准PostCSS 插件 flex-gap-polyfill 是目前最接近“写一次、跑全端”的方案,它把 gap 编译成带负 margin 容器 + 正 margin 子项的组合。
require('flex-gap-polyfill')()
.grid { display: flex; gap: 24px; } 转为:
.grid { display: flex; --fgp-gap: 24px; margin-left: calc(-24px + var(--orig-margin-left, 0px)); }.grid > * { margin-left: calc(24px + var(--orig-margin-left, 0px)); }
flex-wrap: wrap 下最后一行末尾的多余空白,这点仍需手动用 :nth-child(3n) 清除ios_saf )
gap 失效只是表象,底层问题是 Flex 布局本身没被激活。Safari ≤14.1、Chrome 21–28 等浏览器,display: flex 会被直接忽略。
display 必须写成两行:display: -webkit-flex; 在前,display: flex; 在后-webkit-justify-content、-webkit-align-items、-webkit-flex-wrap
flex: 1 在 iOS 8.4 及更早无效,必须拆成:-webkit-flex-grow: 1; -webkit-flex-shrink: 1; -webkit-flex-basis: 0;
-webkit-flex,除非 browserslist 显式命中 safari 或 ios_saf
真正容易被忽略的是:gap 降级不是孤立问题。它往往暴露了整个 Flex 兼容链的断裂——从 display 声明、前缀顺序,到子项的 shrink/basis 行为,每一步都可能让布局彻底退化成普通块级流。别只盯着 gap,先确认 Flex 布局本身有没有被旧浏览器识别。