为什么Flex容器里的元素在移动端显示时会超出屏幕宽度?
我用Flex布局做移动端导航栏,设置了容器display: flex,里面三个等宽按钮。但在手机真机测试时,第三个按钮总是溢出屏幕边缘,左右两边留白也不一致。试过加flex-wrap: wrap和设置容器width: 100%都不管用,这是为什么?
.nav {
display: flex;
justify-content: space-between;
width: 100%;
}
.nav button {
flex: 1;
padding: 12px;
min-width: 100px;
}
手机调试发现每个按钮实际宽度比计算值大,比如设计稿每个按钮应该80px,但实际测量显示有120px。明明设置了min-width和flex,为什么会这样?
min-width: 100px和flex: 1冲突了。当按钮设置了
min-width: 100px,而容器宽度不够时,Flex 会优先满足每个子元素的最小宽度,导致实际宽度大于flex: 1计算出来的值,所以第三个按钮就挤出去了。直接用
flex: 1 1 0%替代flex: 1,并去掉min-width:flex: 1 1 0%的意思是:基础宽度为 0,允许收缩, growth factor 为 1,这样三个按钮就会严格按 1:1:1 分配容器宽度,不会被min-width拖累。如果一定要限制最小宽度(比如防止文字被压太窄),用
flex-basis: 0%+min-width时,记得加box-sizing: border-box,因为 padding 也会占宽度:不过一般导航栏按钮根本不需要
min-width,直接用flex: 1 1 0%就行,简单粗暴有效。min-width和padding上,这两个属性会让按钮的实际宽度超出你预期的等分宽度。省事的话,把min-width去掉,然后给.nav加个box-sizing: border-box,顺便确认下html和body的宽度是不是 100%。代码调整如下:
如果还不行,检查一下是否有默认样式或者外边距影响,加个全局样式重置更省心: