計算は仕様で定義されています。
フレックスアイテムのパディング付きのサイズで、フレックスボックス仕様flex-grow
の計算によって決定されます。
これらの計算は、パディングとflex-shrink
.
率直に言って、数学は非常に専門的であり、世界で最も簡単に理解できるものではありません。
しかし、あなたがそれに入りたいのであれば、ここに詳細があります:
例
以下は、うまくいけば動作をより明確にする例です。
注: フレックス アイテムの長さを直接設定するためのツールではないことに注意してください。flex-grow
これは、コンテナー内のスペースをフレックス アイテム間で分配するためのツールです。このflex-basis
プロパティは、フレックス アイテムの初期のメイン サイズを設定します。flex-grow
を とともに使用すると、flex-basis
質問の問題は解決されます (以下の例 #4 を参照)。
例 #1
があるブロックコンテナではbox-sizing: border-box
、コード内のボックスはパディングに関係なく均等にレンダリングされます。
body > div {
height: 50px;
/* display: flex; */
font-size: 0; /* remove inline block whitespace */
}
body > div > div {
/* flex: 1; */
box-sizing: border-box;
height: 50px;
display: inline-block;
width: 50%;
}
#a {
background-color: red;
}
#b {
background-color: green;
}
#c {
padding: 10px;
background-color: blue;
}
#d {
background-color: yellow;
<div>
<div id="a"></div>
<div id="b"></div>
</div>
<div>
<div id="c"></div>
<div id="d"></div>
</div>
jsFiddle デモ
例 #2
があり、またはが長さの計算に使用される flex コンテナーでは、ボックスはパディングに関係なく均等にレンダリングされます。box-sizing: border-box
width
flex-basis
body > div {
height: 50px;
display: flex;
}
body > div > div {
flex-basis: 50%;
/* width: 50%; this works, as well */
box-sizing: border-box;
}
#a {
background-color: red;
}
#b {
background-color: green;
}
#c {
padding: 10px;
background-color: blue;
}
#d {
background-color: yellow;
<div>
<div id="a"></div>
<div id="b"></div>
</div>
<div>
<div id="c"></div>
<div id="d"></div>
</div>
jsFiddle デモ
例 #3
と があるフレックスコンテナでは、動作しないようbox-sizing: border-box
にflex-grow
見えます...box-sizing
body > div {
height: 50px;
display: flex;
}
body > div > div {
flex: 1;
/* flex-basis: 50%; */
/* width: 50%; this works, as well */
box-sizing: border-box;
}
#a {
background-color: red;
}
#b {
background-color: green;
}
#c {
padding: 10px;
background-color: blue;
}
#d {
background-color: yellow;
<div>
<div id="a"></div>
<div id="b"></div>
</div>
<div>
<div id="c"></div>
<div id="d"></div>
</div>
jsFiddle デモ
しかし、それは本当に正しくありません...
例 #4
flex-grow
フレックス コンテナー内の使用可能なスペースに基づいて、フレックス アイテムの幅を拡張します。つまり、パディング (とボーダー) を無視します。
flex-grow
ただし、と一緒に単純に指定するとflex-basis
、border-box
が機能します。
flex: 1 1 50%; /* flex-grow, flex-shrink, flex-basis */
body > div {
height: 50px;
display: flex;
}
body > div > div {
flex: 1 1 50%; /* flex-grow, flex-shrink, flex-basis */
/* flex-basis: 50%; */
/* width: 50%; this works, as well */
box-sizing: border-box;
}
#a {
background-color: red;
}
#b {
background-color: green;
}
#c {
padding: 10px;
background-color: blue;
}
#d {
background-color: yellow;
<div>
<div id="a"></div>
<div id="b"></div>
</div>
<div>
<div id="c"></div>
<div id="d"></div>
</div>
jsFiddle デモ