1. 程式人生 > >【CSS佈局】深入理解CSS flex佈局

【CSS佈局】深入理解CSS flex佈局

先來看一張圖:
在這裡插入圖片描述

基本概念

1, 主軸預設為x軸,側軸預設為y軸。flex佈局就是圍繞這個軸來進行的
2, flex container就是佈局的父元素,flex item就是子元素

flex container的屬性一共有:

在這裡插入圖片描述

1,主軸方向flex-direction: row/row-reverse/column/column-reverse

來看一個例子:

  <style>
    .parent {
      display: flex;
      border: 1px solid red;
      width: 500px;
    }
    .child {
      border: 1px solid black;
      width: 100px;
      height: 50px;
      margin: 10px;
    }
  </style>
  <div class="parent">
    <div class="child"></div>
    <div class="child"></div>
    <div class="child"></div>
  </div>

在這裡插入圖片描述
可以看到給父元素設定display後,三個子元素就排在一行了,因為flex-direction預設為row,就是排在一行
再看看一個flex-direction:row-reverse的例子:

 .parent {
      display: flex;
      border: 1px solid red;
      width: 500px;
      flex-direction: row-reverse;
    }
    .child {
      border: 1px solid black;
      width: 100px;
      height: 50px;
      margin: 10px;
    }

在這裡插入圖片描述

可以看到,子元素的排列順序反了過來

flex-direction:column就是排在一列,這裡就不做演示了

2,flex-wrap(換行):nowrap/wrap/wrap-reverse

看個例子:

 .parent {
      display: flex;
      border: 1px solid red;
      width: 500px;
      flex-direction: row-reverse;
    }
    .child {
      border: 1px solid black;
      width: 100px;
      height: 50px;
      margin: 10px;
    }

在這裡插入圖片描述
可以看到父元素的寬度為500,本來容不下六個子元素,但因為flex-wrap預設為nowrap。

來看加上flex-wrap:wrap的效果:
在這裡插入圖片描述

顯而易見,一行容不下6個子元素,他們自動進行了換行

3,justify-content(主軸內容)

.parent {
      display: flex;
      border: 1px solid red;
      width: 500px;
      height: 60px;
      flex-direction: row;
      flex-wrap: nowrap;
      justify-content: space-between
    }
       .child {
      border: 1px solid black;
      width: 100px;
      height: 50px;
    }
     <div class="parent">
    <div class="child">1</div>
    <div class="child">2</div>
    <div class="child">3</div>
    
  </div>

使用justify-content:space-between(空隙在中間)
來看效果圖:
在這裡插入圖片描述
可以看到,多餘的空間都在元素的中間

使用justify-content:space-around(空隙在周圍)
來看效果圖:

在這裡插入圖片描述

使用justify-content:flex-start (和主軸第一個元素對齊)
在這裡插入圖片描述

使用justify-content:center(居中)
在這裡插入圖片描述

4,align-items(側軸內容如何排列,)

使用align-items: stretch(預設值,意思是伸展,拉伸);

 .parent {
      display: flex;
      border: 1px solid red;
      width: 500px;
      flex-direction: row;
      flex-wrap: nowrap;
      justify-content: space-around;
      align-items: stretch;
    }
    .child {
      border: 1px solid black;
      width: 100px;
    }
  </style>
   <div class="parent">
    <div class="child">1 <br> 1<br>1 <br>1 <br>1 </div>
    <div class="child">2 <br> 2 <br> 2  </div>
    <div class="child">3</div>
  </div>

在這裡插入圖片描述

可以看到子元素2 和子3元素的內容是不足以撐開容器的高度,但是align-items: stretch吧他們的容器高度進行了拉伸,和最高的元素一樣高

使用align-items: flex-start(意思是所有的元素往側軸的起點靠);
看效果:
在這裡插入圖片描述

使用align-items: center(往側軸的中間放):
在這裡插入圖片描述

align-content和justify-content的屬性一樣,只不過前者是側軸,後者是主軸,這裡就不介紹啦。

下面來看flex item的屬性:

在這裡插入圖片描述

1,flex-grow(當空間多餘時,這個屬性決定孩子如何分配多餘的空間)

先看一個不使用flex-grow的例子:
在這裡插入圖片描述

可以看到第三個孩子右邊還有很多空間。
此時,在孩子1身上寫:flex-grow:1,

.child:nth-child(1) {
      flex-grow: 1
    }

效果如下:在這裡插入圖片描述
可以看到孩子1吧多餘的空間佔滿了!!!!, 因為他吃的是獨食

給孩子2加上flex-grow:1再看:

 .child:nth-child(1) {
      flex-grow: 1
    }
    .child:nth-child(2) {
      flex-grow: 1
    }

效果圖:
在這裡插入圖片描述

可以看到孩子1和孩子2平分了剩下的空間。
如果在孩子3上加flex-grow:1 ,那麼三個孩子平分這個多餘的空間

如果孩子1寫flex-grow:2, 孩子2寫:fle-grow:1,那麼孩子1就拿三分之二的空間,孩子2就拿三分之一的空間 是不是感覺恍然大悟呢?

2,flex-shrink(當空間不夠時,這個屬性決定孩子瘦了多少),這裡就不展開講了

3,flex-basis(預設為元素本身的大小,一般不用)

4,order(決定flex元素的順序)

看一個例子:

  .parent {
      display: flex;
      border: 1px solid red;
      width: 500px;
    
    }
    .child {
      border: 1px solid black;
      margin: 2px;
      height: 60px;
    }
    .child:nth-child(1) {
      order: 2;
    }
    .child:nth-child(2) {
      order: 3;
    }
    .child:nth-child(3) {
      order: 1;
    }

效果如圖:
在這裡插入圖片描述
可以看到,通過改變order,來改變元素的位置。

algin-self(自己決定自己的位置)

看一個例子:

  .parent {
      display: flex;
      border: 1px solid red;
      width: 500px;
      justify-content: space-around;
      align-items: flex-start;
    }
    .child {
      border: 1px solid black;
      margin: 2px;
    }
    <div class="parent">
    <div class="child">111 <br> 111 <br> 111 <br> 111 </div>
    <div class="child">222  <br>  222  <br> 222 </div>
    <div class="child">333</div>
  </div>

在這裡插入圖片描述

現在孩子3是在最上面的,可是他就很皮,就不想在最上面,那怎麼辦呢?
就可以用align-self來調整孩子3的位置,比如:

   .child:nth-child(3) {
      align-self: center;
    }

就有如下效果:
在這裡插入圖片描述

看到這裡,你是不是對flex佈局有的新的體會呢:)

完。