Flex布局中,flex-basis优先级高于width,仅设为auto时回退到width。它沿主轴方向生效:水平轴覆盖width,垂直轴覆盖height。IE兼容性建议使用-ms-flex简写并保留width作为降级方案。
先扔一个核心结论出来:flex-basis 之所以能覆盖 width,根本不是 bug,而是 Flex 布局规范有意为之。说白了,flex-basis 才是 Flex 容器里计算主轴尺寸的“第一道关卡”,width 在它面前就是个备胎——只有 flex-basis 设为 auto 时,浏览器才会回头看一眼 width。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
咱们拆开细说。在普通盒模型里,width 是老大;可一到 Flex 容器里,兄弟就得让位。浏览器的布局流程是这样的:先看 flex 项目上有没有 flex-basis,只要它不为 auto,直接拿它当初始尺寸起点,width 就算写了 200px 或 100% 也直接被忽略。这不是优先级的问题,而是切入时机的问题——flex-basis 在空间分配的第一步就介入了,比 width 更早。
规范写得明明白白:flex-basis 是 flex 项目的“空间分配起点”。只要它不为 auto,浏览器就全程无视 width。来看几个典型场景:
flex: 1 展开后是 flex: 1 1 0%,flex-basis: 0% 生效,width 彻底作废。flex-basis: 150px 加上 width: 300px,最后实际宽度是 150px,300px 直接躺平。flex-basis: auto 时,浏览器才会 fallback 到 width(或者内容的固有尺寸)。有用,但得看条件。它只有在 flex-basis 不挡道的情况下才能上线:
flex-basis,也没用 flex 简写(默认是 flex: 0 1 auto),此时 width 被当作 flex-basis: auto 的降级方案。flex-basis: auto,这时 width 会参与计算,但还得受内容影响——比如文字很短,实际宽度可能远小于 width 值。flex: none 或 flex: 0 0 auto,width 就能稳稳生效,既不被拉伸也不被压缩。注意一点:box-sizing: border-box 改的是 padding 和 border 是否算进 width,跟 flex-basis 的优先级无关,别混为一谈。
flex-basis 不是死磕 width 的,它跟着主轴方向走:
flex-direction: row(默认)→ flex-basis 管水平尺寸,覆盖 width。flex-direction: column → flex-basis 管垂直尺寸,覆盖 height;此时 width 沦为交叉轴约束,对 flex 分配没有直接影响。flex-basis: 200px,一到 column 方向就成了“初始高度”,稍不留神就会导致高度塌缩或溢出。老生常谈的 IE 兼容问题,尤其是 flex-basis 和 box-sizing 混用时容易踩坑(Flexbug #7)。实战建议:
flex-basis,改用 -ms-flex: 0 0 200px 这种写法。width: 200px 和 box-sizing: border-box 作为降级方案。box-sizing: border-box + flex-basis: 100% 的组合,容易翻车。最后提一个容易被忽略的点:flex-basis 的单位(px、%、em)在不同主轴方向下的含义不同,但它本身永远不会去读 width 的值——哪怕你写了 width: 100%,只要 flex-basis: 200px 存在,它就一直按 200px 算,父容器多宽都跟它没关系。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述