html – 为什么填充扩展Flex项目?

前端之家收集整理的这篇文章主要介绍了html – 为什么填充扩展Flex项目?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在下面的代码片段中,第一行有两个带有flex-grow的div:1.正如预期的那样,每个div占用屏幕的50%.

向左侧div添加填充时,情况就不再如此.有人可以解释原因吗?

  1. body > div {
  2. height: 50px;
  3. display: flex;
  4. }
  5. body > div > div {
  6. flex: 1;
  7. Box-sizing: border-Box;
  8. }
  9. #a {
  10. background-color: red;
  11. }
  12. #b {
  13. background-color: green;
  14. }
  15. #c {
  16. padding: 10px;
  17. background-color: blue;
  18. }
  19. #d {
  20. background-color: yellow;
  21. }
  1. <div>
  2. <div id="a"></div>
  3. <div id="b"></div>
  4. </div>
  5. <div>
  6. <div id="c"></div>
  7. <div id="d"></div>
  8. </div>

解决方法

计算在规范中定义.

具有填充和柔性增长的弹性项目的大小由flexbox spec中的计算确定.

这些计算类似于具有填充和柔性收缩的柔性项目的大小.

坦率地说,数学是非常技术性的,并不是世界上最容易理解的东西.

但是如果你想进入它,这里有详细信息:

> 9.7. Resolving Flexible Lengths
> How does flex-shrink factor in padding and border-box?

例子

以下是希望使行为更加清晰的示例.

注意:请记住,flex-grow不是直接确定弹性项目长度的工具.它是一个在flex容器中分配容器空间的工具. flex-basis属性设置弹性项的初始主要大小.如果flex-grow与flex-basis一起使用,问题中的问题就解决了(参见下面的例子#4).

示例#1

在块容器中,您有box-sizing: border-box,代码中的框将均匀呈现,而不管填充.

  1. body > div {
  2. height: 50px;
  3. /* display: flex; */
  4. font-size: 0; /* remove inline block whitespace */
  5. }
  6. body > div > div {
  7. /* flex: 1; */
  8. Box-sizing: border-Box;
  9. height: 50px;
  10. display: inline-block;
  11. width: 50%;
  12. }
  13. #a {
  14. background-color: red;
  15. }
  16. #b {
  17. background-color: green;
  18. }
  19. #c {
  20. padding: 10px;
  21. background-color: blue;
  22. }
  23. #d {
  24. background-color: yellow;
  1. <div>
  2. <div id="a"></div>
  3. <div id="b"></div>
  4. </div>
  5. <div>
  6. <div id="c"></div>
  7. <div id="d"></div>
  8. </div>

jsFiddle demo

例#2

在Flex容器中,您有Box-sizing:border-Box,并且宽度或flex-basis用于计算长度,无论填充如何,框都将均匀呈现.

  1. body > div {
  2. height: 50px;
  3. display: flex;
  4. }
  5.  
  6. body > div > div {
  7. flex-basis: 50%;
  8. /* width: 50%; this works,as well */
  9. Box-sizing: border-Box;
  10. }
  11.  
  12. #a {
  13. background-color: red;
  14. }
  15. #b {
  16. background-color: green;
  17. }
  18. #c {
  19. padding: 10px;
  20. background-color: blue;
  21. }
  22. #d {
  23. background-color: yellow;
  1. <div>
  2. <div id="a"></div>
  3. <div id="b"></div>
  4. </div>
  5. <div>
  6. <div id="c"></div>
  7. <div id="d"></div>
  8. </div>

jsFiddle demo

例#3

在Flex容器中,你有盒子大小:border-Box和flex-grow,看起来盒子大小不起作用……

  1. body > div {
  2. height: 50px;
  3. display: flex;
  4. }
  5.  
  6. body > div > div {
  7. flex: 1;
  8. /* flex-basis: 50%; */
  9. /* width: 50%; this works,as well */
  10. Box-sizing: border-Box;
  11. }
  12.  
  13. #a {
  14. background-color: red;
  15. }
  16. #b {
  17. background-color: green;
  18. }
  19. #c {
  20. padding: 10px;
  21. background-color: blue;
  22. }
  23. #d {
  24. background-color: yellow;
  1. <div>
  2. <div id="a"></div>
  3. <div id="b"></div>
  4. </div>
  5. <div>
  6. <div id="c"></div>
  7. <div id="d"></div>
  8. </div>

jsFiddle demo

但那不是真的正确……

例#4

flex-grow根据Flex容器中的可用空间扩展Flex项的宽度.换句话说,它忽略了填充(and borders).

但是,如果您只是将flex-grow与flex-basis一起指定,则border-Box将起作用:

  1. flex: 1 1 50%; /* flex-grow,flex-shrink,flex-basis */
  1. body > div {
  2. height: 50px;
  3. display: flex;
  4. }
  5.  
  6. body > div > div {
  7. flex: 1 1 50%; /* flex-grow,flex-basis */
  8. /* flex-basis: 50%; */
  9. /* width: 50%; this works,as well */
  10. Box-sizing: border-Box;
  11. }
  12.  
  13. #a {
  14. background-color: red;
  15. }
  16. #b {
  17. background-color: green;
  18. }
  19. #c {
  20. padding: 10px;
  21. background-color: blue;
  22. }
  23. #d {
  24. background-color: yellow;
  1. <div>
  2. <div id="a"></div>
  3. <div id="b"></div>
  4. </div>
  5. <div>
  6. <div id="c"></div>
  7. <div id="d"></div>
  8. </div>

jsFiddle demo

猜你在找的HTML相关文章