flex-shrink 为 0 时元素不压缩;其默认值为 1,易致移动端子项在空间不足时被意外压缩,引发错位;应针对固定尺寸项显式设 flex-shrink: 0,并配合 min-width 和 flex-basis 合理使用。
flex-shrink 为 0 时元素不压缩,但很多人误设成 1 导致错位
移动端 Flex 布局错位,常见原因是子项在空间不足时被意外压缩——
默认值是 1,意味着所有子项按比例“让出”空间。一旦父容器宽度受限(比如
或嵌套在
容器中),文字多、图片宽或带 padding 的项就会被强行压扁,出现文字换行、图标变形、按钮截断等现象。
实操建议:
明确需要固定尺寸的项(如图标按钮、头像、徽标),直接设
避免全局重置
,这会破坏正常流式行为
注意
不接受负值,设成
会被浏览器忽略并回退到 1
搭配
使用更稳妥,例如:
(满足移动端最小点击区域)
flex-shrink 数值不是“权重”,而是“压缩难易度”的倒数
的计算逻辑常被误解:它不是按数值占比分配压缩量,而是先按
(或
)算出“溢出总量”,再按
加权分摊压缩量。也就是说,
的项,比
的项“更容易被压”,且压缩量接近两倍。
典型场景:
立即学习
“
前端免费学习笔记(深入)
”;
一行三个按钮,中间按钮文字较长,希望它少压缩、两边图标按钮多压缩 → 中间设
,两边设
搜索栏含输入框 + 按钮,输入框应撑满剩余空间,按钮保持固定宽 → 输入框用
(等价于
),按钮加
使用
可同时禁用伸缩,比单独写
更清晰
和 flex-basis、width 冲突时,flex-shrink 表现不可预测
当子项同时设置了
、
和
,浏览器会优先采用
(除非为
),而
仅在
时作为后备。此时若
过大,
就得承担全部压缩任务,但压缩结果受盒模型影响(padding/border 是否包含在内)。
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
容易踩的坑:
用了
却忘了
仍按 content-box 计算(除非显式设为
)
+
在某些 Android WebView 中表现不一致,建议统一用
文字内容动态变化时(如 i18n 多语言),
固定值可能失效,此时更适合用
+
真机测试时,iOS Safari 和微信内置浏览器对 flex-shrink 处理有差异
iOS 15+ Safari 对
的计算更严格,尤其在
容器嵌套
子项时,可能完全忽略
;而微信 iOS 客户端(X5 内核)存在 flex 压缩后未触发重绘的问题,导致视觉上“卡在压缩态”。
应对方式:
在关键节点加
强制硬件加速,触发重排
避免在
元素上同时用
+ 长文本,iOS 下可能溢出容器却不换行
用
做特性检测,降级方案用
手动计算
实际项目里,错位往往不是单一属性问题,
是开关,但真正起效依赖
的初始值、父容器约束强度、以及是否触发了浏览器的 flex 重排 bug。调试时优先检查 computed styles 中的
是否生效,而不是只看声明值。
flex-shrinkmax-width: 100%position: fixedflex-shrink: 0* { flex-shrink: 0 }flex-shrink-1min-widthmin-width: 44pxflex-shrinkflex-basiswidthshrink * basisflex-shrink: 2flex-shrink: 1flex-shrink: 0flex-shrink: 2flex: 1flex-grow: 1; flex-shrink: 1; flex-basis: 0flex-shrink: 0flex: 0 0 autoflex-shrink: 0widthflex-basisflex-shrinkflex-basisautowidthflex-basis: autoflex-basisflex-shrinkbox-sizing: border-boxflex-basisflex-basis: 100pxflex-basis: autowidth: 120pxflex-basis: 120pxflex-basismin-widthflex-shrink: 0flex-shrinkdisplay: flexposition: absoluteflex-shrinktransform: translateZ(0)flex-shrink: 0white-space: nowrap@supports (display: flex) and (flex-shrink: 1)width: calc(...)flex-shrinkflex-basisflex-shrink