flex:1是什么意思?


128

我们都知道,该flex属性是一个速记flex-growflex-shrinkflex-basis属性。其默认值为0 1 auto,表示

flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;

但我注意到,在很多地方flex: 1都使用过。是速记1 1 auto还是1 0 auto?我不明白这是什么意思,而我在Google上一无所获。


1
引用w3schools.com “ flex属性是flex-grow,flex-shrink和flex-basis属性的简写”
Imran Ali

Answers:


85

这里是解释:

https://www.w3.org/TR/css-flexbox-1/#flex-common

flex:<positive-number>
等效于flex:<positive-number> 10。使flex项目具有弹性,并将flex基础设置为零,从而使该项目接收flex容器中指定比例的可用空间。如果flex容器中的所有项目都使用此模式,则它们的大小将与指定的flex系数成比例。

因此flex:1相当于flex: 1 1 0


10
flex:1; 不等于flex:1 1 0; 请在下面看到我的答案,看看为什么。
DreamTeK '17

在一个旁注中:我认为当您将其flex应用于所有孩子时,实际上很重要flex: 1 ? 0;,在哪里“?” 可以是任何东西,不会有什么不同
逃离了

@DreamTeK仅在不符合标准的浏览器(例如Chrome)中。
TylerH's

1
@TylerH正确,并在我的回答中指出,但what does flex:1 mean?可以解释。运营商不要求规格,仅要求发生的事情。不幸的是,Chrome现在是最受欢迎的浏览器,并且需要支持。我自己不是Chrome的粉丝或用户!
DreamTeK '18

1
@TylerH这就是为什么在我的回答中指出“应该注意,这失败了,因为这些浏览器未能遵守该规范。” 以及指向规范的链接!
DreamTeK

98

flex: 1 表示以下内容:

flex-grow : 1;    ➜ The div will grow in same proportion as the window-size       
flex-shrink : 1;  ➜ The div will shrink in same proportion as the window-size 
flex-basis : 0;   ➜ The div does not have a starting value as such and will 
                     take up screen as per the screen size available for
                     e.g:- if 3 divs are in the wrapper then each div will take 33%.

1
@CookieMonster不,flex: 1意味着1 1 0...但是在IE上是1 1 0px
Ason

@LGSon,您可以省略从基础值,使单元1 1 01 1 0px是等价的。IE恰好只支持一个单元。
CookieMonster

@CookieMonster我知道Flexbox的工作原理,我只是在纠正您的第一条评论,这是错误的。
艾森(Ason)

@ LGSon,flex是怎样的:1 1 1 0px和1 1 1 0等价时1 1 0px错误吗?
CookieMonster

2
@CookieMonster它们可能呈现相同但不等效的效果,例如当使用无单位值时flex-basis,将忽略内容,并且元素大小基于其flex-grow/ flex-shrink
Ason

78

小心

在某些浏览器中:

flex:1; 等于flex:1 1 0;

flex:1;= flex:1 1 0n;(其中n是长度单位)。

  • flex-grow: 一个数字,用于指定项目相对于其余柔性项目将增长多少。
  • flex-shrink 一个数字,指定项目相对于其余柔性项目将收缩多少
  • flex-basis项目 的长度。合法值:“自动”,“继承”或数字,后跟“%”,“ px”,“ em”或任何其他长度单位。

这里的重点是flex-basis需要长度单位

以Chrome为例,flex:1flex:1 1 0产生不同的结果。在大多数情况下,它似乎flex:1 1 0;可以正常工作,但让我们检查一下实际发生的情况:

Flex基础将被忽略,仅应用flex-grow和flex-shrink。

flex:1 1 0;= flex:1 1;=flex:1;

乍一看,这似乎可以,但是如果容器的应用单元是嵌套的,则可以。期待意外!

在CHROME中尝试此示例

.Wrap{
  padding:10px;
  background: #333;
}
.Flex110x, .Flex1, .Flex110, .Wrap {
  display: -webkit-flex;
  display: flex;
  -webkit-flex-direction: column;
  flex-direction: column;
}
.Flex110 {
  -webkit-flex: 1 1 0;
  flex: 1 1 0;
}
.Flex1 {
  -webkit-flex: 1;
  flex: 1;
}
.Flex110x{
  -webkit-flex: 1 1 0%;
  flex: 1 1 0%;
}
FLEX 1 1 0
<div class="Wrap">
  <div class="Flex110">
    <input type="submit" name="test1" value="TEST 1">
  </div>
</div>

FLEX 1
<div class="Wrap">
  <div class="Flex1">
    <input type="submit" name="test2" value="TEST 2">
  </div>
</div>

FLEX 1 1 0%
<div class="Wrap">
  <div class="Flex110x">
    <input type="submit" name="test3" value="TEST 3">
  </div>
</div>

兼容性

应当指出,这失败是因为某些浏览器未能遵守该规范

使用完整的flex规范的浏览器:

  • Firefox-✓
  • Edge-✓ (我知道,我也感到震惊。)
  • 铬-x
  • 勇敢-x
  • 歌剧-x
  • IE- (大声笑,它不带长度单位,但不带长度单位。)

更新2019

最新版本的Chrome似乎终于可以解决此问题,但其他浏览器仍然没有。

经过测试并在Chrome Ver 74中工作。


1
值为0时,单位不是必需的。规格说flex: 1的一样flex: 1 1 0。在您的示例中,如果删除.Wrap该类,则 .Flex110x,.Flex1, .Flex110, .Wrap规则将按预期工作。

请提供一个链接,我在规范中找不到您要说的内容。我还没有发明任何东西,我的答案是基于flexbox规范的

@Obsidian这是链接:w3.org/TR/css-flexbox-1 如果转到“简写”部分,则会发现:“ flex:[positive-number]等效于flex:[positive-number] 1 0 ...
MikeB

1
@Toskan最大的兼容性使用完整的语法flex:1 1 0n;
DreamTeK

2
感谢您指出这种差异,我无法弄清楚问题的根源。赏金吧
Nit
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.