1. 程式人生 > >flex彈性盒子佈局中,關於flex-grow佈局問題設定

flex彈性盒子佈局中,關於flex-grow佈局問題設定

先貼上上一段程式碼,flex總體佈局
<body>
  <div class="total">
    <div class="one">第一個</div>
    <div class="two">第二個</div>
    <div class="three">第三個</div>
  </div>
</body>
css樣式
*{
      margin:0;
      padding: 0;
    }
    .one{
      background: #f00;
    }
    .two{
      background: #0f0;
      height: 30px;
    }
    .three{
      background: #00f;
      height: 60px;
    }
.total{
      width: 900px;
      height: 100px;
      display: flex;
      display: -webkit-flex;
      background: #ff0;
      flex-direction: row;
      -webkit-flex-direction:row;
      flex-wrap:wrap;
      -webkit-flex-wrap:wrap;
      justify-content:space-between;
      -webkit-justify-content:space-between;
    }
    .total>div{
      flex-grow:1;
      -webkit-flex-grow:1;
    }
    .total>.two{
      flex-grow:2;
      -webkit-flex-grow:2;
    }

第二個div設定flex-grow為2,另外兩個均為1.

實際效果第二個div並沒有是其他兩個div的寬度的二倍,似乎是不到二倍,但確實是比另外兩個要大,這是為什麼呢?

後來經過一番折騰終於搞明白了,是自己的理解有誤,參考於阮一峰先生的相關文章,連結在這裡flex佈局教程

自己總結了三個解決辦法:

一、結合flex-basis

將整體div樣式進行修改,加入flex-basis屬性

.total>div{
      flex-grow:1;
      -webkit-flex-grow:1;
      flex-basis:0;
      -webkit-flex-basis:0;
    }
設定專案固定空間均為0;
二、不單設定flex-grow屬性,設定flex綜合屬性

這一點在阮一峰文章中有提到,建議優先使用這個屬性,而不是單獨寫三個分離的屬性,因為瀏覽器會推算相關值。

單單設定flex-grow的數值時,因為這時flex-basis的值為auto,專案佔據了相應的固定空間,導致設定錯誤。

.total>div{
      flex:1;
    }
 .total>.two{
      flex:2;
    }
三、去掉div文字內容

這種方法是使div中不含有固定寬度,設定二倍不成功的根本原因就在這兒,因為div中的文字佔有固定寬度,我們都知道flex-grow設定的是剩餘空間的大小分配,而剩餘空間就是去掉文字之後的空間,大家可以自己計算一下,為什麼不是我們想要的二倍,去掉div中的文字,就相當於去掉了固定空間,如下

<body>
  <div class="total">
    <div class="one"></div>
    <div class="two"></div>
    <div class="three"></div>
  </div>
</body>

    .total>div{
      flex-grow:1;
      -webkit-flex-grow:1;
    }
     .total>.two{
      flex-grow:2;
      -webkit-flex-grow:2;
    }
這樣設定出來也是二倍關係,當然,這種方法肯定不推薦

其實,這三種方法的原理實際上是一樣的,都是使固定空間為0,切記flex-grow設定的是剩餘空間的分配比例,分配之前一定要先除去實際固定空間在進行計算。

第一次發部落格,不足之處望讀者多多指教!大笑