1. 程式人生 > >等寬布局和flex

等寬布局和flex

content padding 鄰居 介紹 若有 研究 默認 開開 技術分享

等寬布局是一種比較常見的布局,但我還沒有仔細的去研究過,今天就來稍稍總結一下。

首先是我們要實現的最終效果,如下圖:

技術分享圖片

要求:三個子項目等寬等高,寬高隨父類變化自適應。每兩個子項目之間需要有20px的間距。

這個要求用css來實現可能會有一些麻煩,並且如果此處變成了四列,五列的話,使用css可能又需要重新計算寬度。

所以這裏我們使用flex來進行布局:

html 代碼:

<section class="father">
      <div class="item item-1"></div>
      <div class="item item-2"
></div> <div class="item item-3"></div> </section>

css(單純實現等寬,不考慮間距):

我們先不管間距,我們先來實現等寬的效果(這裏為了做出區分,我們把三個子項目的顏色做一些變化。):

.father {
      display: flex;
      padding : 20px;
      width: 300px;
      height : 200px;
      border : 5px solid #000;
 }
.item {
    flex : 1;
} .item-1
{ background: red;
} .item-2 { background: green; } .item-3 { background: blue; }

最後的效果是這樣(每個子項目都是100px):

技術分享圖片

這裏我們需要註意的就是下面這句代碼:

flex : 1

它是一個簡寫形式 其實是 flex : flex-grow flex-shrink flex-basis的簡寫形式。那麽我們定義的就是這個flex-grow屬性

flex-grow

flex-grow:它是指整個項目有多余空間時項目的放大比例。默認為0,也就是不放大。

分配多余空間

這是什麽意思呢?比如說我們這裏什麽都不設置,那麽父元素中間就是空的,那麽就會有300px的多余空間,然後子元素來分這些多余空間。怎麽分呢?我們按照權重比例來計算寬度。即子項目的寬度都是 (1 / (1+1+1) ) * 300

,也就是平分了父容器的寬度。這裏這樣寫你可能會覺得很麻煩,但是你可以嘗試把其中一個的flex設置成flex:2,那麽它的寬度就會變成150px,就是用權重來進行計算的。

  多余空間到底是什麽?

那麽這裏還有一個問題,這裏父元素的多余空間是否包括子元素的margin,border,padding呢?

還是用一個例子來說明,比如我們這裏把item-1的padding設置成 padding : 0 20px;

最後的結果:

技術分享圖片

這裏很明顯item-1的寬度增加了,而另外兩個的寬度減少了,但我們打開開發者工具可以看到,三個item的content的寬度都相同是86.67%

  那麽就很容易推斷出這是(300 - 20 * 2)/ 3 得到的結果

那麽就是計算多余空間時是減掉了子元素的padding

大家可以去試試margin,和 border,都是這樣的情況。

css(加上間距的等寬布局):

那麽回到我們的題目要求,理解上面所說之後就很簡單了。我們只要給後兩個間距一個margin-left 即可。那麽我們只要在等寬的基礎上加上如下代碼即可。

.father .item + .item {
     margin-left : 20px;
 }

最終效果:

技術分享圖片

+ 號選擇器:

這裏用到了一個css的+號選擇器,這裏來做一下簡單介紹。

+號選擇器是相鄰居兄弟選擇器,例如:

h1 + p {
  color:red;
}

它指的是緊跟在h1後面的p選擇器,這裏用一個w3school的例子:

<body>
    <h1>This is a heading.</h1>
    <p>This is paragraph.</p>
    <p>This is paragraph.</p>
    <p>This is paragraph.</p>
    <p>This is paragraph.</p>
    <p>This is paragraph.</p>
</body>

那麽效果會是這樣:

技術分享圖片

現在更改一下css代碼:

p + p {
  color:red;
}

你可以把它理解成每一個p元素後面緊跟著的p元素,就是說第一個p元素(此處簡稱p1,之後都用簡稱)後面的p2被選中,p2後面的p3被選中,以此類推,最後除p1之外就都被選中了,效果如下:

技術分享圖片

如果還是不理解,可以嘗試再改一下html代碼(此處在最後一個p元素之前加了一個h1元素),如下:

<body>
    <h1>This is a heading.</h1>
    <p>This is paragraph.</p>
    <p>This is paragraph.</p>
    <p>This is paragraph.</p>
    <p>This is paragraph.</p>
    <h1>This is a heading.</h1>
    <p>This is paragraph.</p>
</body>

效果會是這樣:

技術分享圖片

那麽p4之後是一個h1元素,所以p5就沒有被選中。

到此我們的等寬布局就結束了。

以上均是個人理解,若有錯漏,希望各位在評論區指出。

等寬布局和flex