1. 程式人生 > >CSS---flex佈局

CSS---flex佈局

一、CSS 盒子模型(Box Model)

盒子模型  ---  display: content-box

盒子中的區域

一個盒子中主要的屬性就5個:width、height、padding、border、margin。如下:

  • width和height:內容的寬度、高度(不是盒子的寬度、高度)。
  • padding:內邊距。
  • border:邊框。
  • margin:外邊距。

CSS box-model    

 

根據 W3C 的規範,元素內容佔據的空間是由 width 屬性設定的,而內容周圍的 padding 和 border 值是另外計算的。不幸的是,IE5.X 和 6 在怪異模式中使用自己的非標準模型。這些瀏覽器的 width 屬性不是內容的寬度,而是內容、內邊距和邊框的寬度的總和。

CSS盒模型和IE盒模型的區別:

  • 在 標準盒子模型中,width 和 height 指的是內容區域的寬度和高度。盒子實際寬度(高度)=內容(content)+邊框(border)+間隙(padding)+間隔(margin)。增加內邊距、邊框和外邊距不會影響內容區域的尺寸,但是會增加元素框的總尺寸。

  • IE盒子模型中,width 和 height 指的是內容區域+border+padding的寬度和高度 

CSS3 box-sizing 屬性 

box-sizing 屬性允許以特定的方式定義匹配某個區域的特定元素。

例如,假如您需要並排放置兩個帶邊框的框,可通過將 box-sizing 設定為 "border-box"。這可令瀏覽器呈現出帶有指定寬度和高度的框,並把邊框和內邊距放入框中。

用法:box-sizing: content-box|border-box|inherit;
描述
content-box

這是由 CSS2.1 規定的寬度高度行為。

寬度和高度分別應用到元素的內容框。

在寬度和高度之外繪製元素的內邊距和邊框。

預設值,平時普通盒子模型,向外擴充套件,新增border,padding,盒子會變大

border-box

為元素設定的寬度和高度決定了元素的邊框盒。

就是說,為元素指定的任何內邊距和邊框都將在已設定的寬度和高度內進行繪製。

通過從已設定的寬度和高度分別減去邊框和內邊距才能得到內容的寬度和高度。

內擴充套件,新增border,padding,盒子模型不會變大

inherit 規定應從父元素繼承 box-sizing 屬性的值。

 

calc() = calc(四則運算)

用於動態計算長度值。

  • 需要注意的是,運算子前後都需要保留一個空格,例如:width: calc(100% - 10px)
  • 任何長度值都可以使用calc()函式進行計算;
  • calc()函式支援 "+", "-", "*", "/" 運算;
  • calc()函式使用標準的數學運算優先順序規則;

 


二、前端佈局神器display:flex

2009年,W3C提出了一種新的方案--Flex佈局,可以簡便、完整、響應式地實現各種頁面佈局。目前已得到所有現在瀏覽器的支援。

Flex是Flexible Box的縮寫,意為"彈性佈局",用來為盒狀模型提供最大的靈活性。它即可以應用於容器中,也可以應用於行內元素。如果父級設為Flex佈局以後,子元素的floatclearvertical-align屬性將失效。 

.box{
    display: -webkit-flex; /*在webkit核心的瀏覽器上使用要加字首*/
    display: flex; //將物件作為彈性伸縮盒顯示
}

行內元素也可以使用Flex佈局。

.box {
    display: inline-flex; //將物件作為內聯塊級彈性伸縮盒顯示
}
//相容性寫法
.box {
    display: flex || inline-flex;
}

基本概念

採用Flex佈局的元素,被稱為Flex容器(flex container),簡稱“容器”。其所有子元素自動成為容器成員,成為Flex專案(Flex item),簡稱“專案”。

結構示意圖
容器預設存在兩根主軸:水平方向主軸(main axis)和垂直方向交叉軸(cross axis),預設專案按主軸排列。

  • main start/main end:主軸開始位置/結束位置;
  • cross start/cross end:交叉軸開始位置/結束位置;
  • main size/cross size:單個專案佔據主軸/交叉軸的空間;

容器屬性(父級屬性)

設定在容器上的屬性有6種。

  • flex-direction
  • flex-wrap
  • flex-flow
  • justify-content
  • align-item
  • align-content

1、flex-direction屬性:決定主軸的方向(即專案的排列方向)

.box {
   flex-direction: row | row-reverse | column | column-reverse;
}

 

  • row(預設):主軸水平方向,起點在左端;
  • row-reverse:主軸水平方向,起點在右端;
  • column:主軸垂直方向,起點在上邊沿;
  • column-reserve:主軸垂直方向,起點在下邊沿。

flex-wrap屬性:定義換行情況

預設情況下,專案都排列在一條軸線上,但有可能一條軸線排不下。

 

一條軸線排不下


.box{
   flex-wrap: nowrap | wrap | wrap-reverse;
}
  • nowrap(預設):不換行;

  • wrap:換行,第一行在上方;

  • wrap-reverse:換行,第一行在下方。 

3、*flex-flow屬性:flex-direction和flex-wrap的簡寫,預設row nowrap(較少使用)

.box{
    flex-flow: <flex-direction> || <flex-wrap>;
}

 

4、justify-content:專案在主軸上的對齊方式(主軸究竟是哪個軸要看屬性flex-direction的設定了)。子元素水平排列方式

.box {
    justify-content: flex-start | flex-end | center | space-between | space-around; 
}


.box{
    justify-content:center;            //居中
    justify-content:flex-start;        //居左
    justify-content:flex-end;          //居右
    justify-content:space-between;     //兩端對齊
    justify-content:space-around;      //拉手排列(廣播體操伸開雙臂)
}

flex-start:在主軸上由左或者上開始排列

flex-end:在主軸上由右或者下開始排列

center:在主軸上居中排列

space-between:在主軸上左右兩端或者上下兩端開始排列

space-around:每個專案兩側的間隔相等。所以,專案之間的間隔比專案與邊框的間隔大一倍。

5、align-items:定義在交叉軸上的對齊方式,若主軸為橫向,則交叉軸為縱向

.box {
    align-items: flex-start | flex-end | center | baseline | stretch; 
}

flex-start:在交叉軸上由左或者上開始排列

flex-end:在交叉軸上由右或者下開始排列

center:在交叉軸上居中排列

baseline:專案的第一行文字的基線對齊

stretch:如果專案未設定高度或設為auto,將佔滿整個容器的高度。

6、*align-content屬性:定義多根軸線的對齊方式

如果專案只有一根軸線,該屬性不起作用。
所以,容器必須設定flex-wrap:···;

.box{
    align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}

專案的屬性(子級屬性)

設定在專案上的屬性也有6個。

  • order
  • flex-grow
  • flex-shrink
  • flex-basis
  • flex
  • align-self

1、order屬性:定義專案的排列順序。

數值越小,排列越靠前,預設為0,可以是負值。

.item {
    order: <整數>;
}

2、flex-grow屬性:定義專案的放大比例

預設值為0,即如果空間有剩餘,也不放大。
可以是小數,按比例佔據剩餘空間。

預設情況


.item{
    flex-grow: <數字>;
}

若所有專案的flex-grow的數值都相同,則等分剩餘空間

如果有一個專案flex-grow為2,其餘都為1,則該專案佔據剩餘空間是其餘的2倍

3、lex-shrink屬性:定義專案的縮小比例

預設值都為1,即如果空間不足將等比例縮小。
如果有一個專案的值為0,其他專案為1,當空間不足時,該專案不縮小。
負值對該屬性無效,容器不應該設定flex-wrap。


.item{
    flex-shrink: <非負整數>;
}

如果一個專案設定flex-shrink為0;而其他專案都為1,則空間不足時,該專案不縮小。

如果所有專案都為0,則當空間不足時,專案撐破容器而溢位。

如果設定專案的flex-shrink不為0的非負數效果同設定為1。

4、flex-basis屬性:定義在分配多餘空間之前,專案佔據的主軸空間。

預設值為auto,瀏覽器根據此屬性檢查主軸是否有多餘空間。


.item{
    flex-basis:  <auto或者px>;
}

注意設定的flex-basis是分配多餘空間之前專案佔據的主軸空間,如果空間不足則預設情況下該專案也會縮小。

空間不足,專案縮小,小於設定值

5、flex屬性是flex-grow,flex-shrink和flex-basis的簡寫

預設值為0 1 auto,第一個屬性必須,後兩個屬性可選。

.item{
    flex: none | [<flex-grow><flex-shrink><flex-basis>];
}

  • 可以用 flex:auto; 代替 flex: 1 1 auto;
  • 可以用 flex: none;代替 flex: 0 0 auto
####align-self屬性:允許單個專案與其他專案有不一樣的對齊方式
>預設值為auto,表示繼承父元素的align-items屬性,並可以覆蓋align-items屬性。

.item{
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}