整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          手把手教你CSS Flex布局「真香」


          者:EcbJS

          轉發鏈接:https://blog.csdn.net/EcbJS/article/details/106466757

          在css3 Flex技術出現之前制作網頁大多使用浮動(float)、定位(position)以及 顯示(display)來布局頁面,隨著互聯網快速發展,移動互聯網的到來,已無法滿足需求,它對于那些特殊布局非常不方便,比如,垂直居中就不容易實現。

          什么是 Flex?

          Flex 是 Flexible Box 的縮寫,是 CSS3 中的一種新的布局模式,可以簡便、完整、響應式地實現各種頁面布局,當頁面需要適應不同的屏幕大小以及設備類型時非常適用。

          目前,幾乎所有的瀏覽器都支持 Flex 布局,所以flex 是必須要掌握的知識,比float、position更重要。

          基本概念

          采用Flex布局的元素,稱為Flex容器(flex container),簡稱”容器”。它的所有子元素自動成為容器成員,稱為Flex項目(flex item),簡稱”項目”。

          容器默認存在兩根軸,分別為水平的主軸(main axis)和垂直的交叉軸(cross axis)。主軸的開始位置叫做 main start,結束位置叫做 main end;交叉軸的開始位置叫做 cross start,結束位置叫做 cross end。項目默認沿主軸排列。單個項目占據的主軸空間叫做 main size,占據的交叉軸空間叫做 cross size。如下圖所示:

          圖1

          你可以通過display: flex (塊級)或 display:inline-flex(行內塊級)使一個元素變成flex容器,一旦其元素被設置flex容器,其子元素的 float、clear 和 vertical-align 等屬性將失效。

          flex 有以下這些屬性:


          屬性

          描述

          flex-direction

          指定彈性盒子中子元素的排列方向

          flex-wrap

          設置當彈性盒子的子元素超出父容器時是否換行

          flex-flow

          flex-direction 和 flex-wrap 兩個屬性的簡寫

          justify-content

          設置彈性盒子中元素在主軸(橫軸)方向上的對齊方式

          align-items

          設置彈性盒子中元素在交叉軸(縱軸)方向上的對齊方式

          align-content

          修改 flex-wrap 屬性的行為,類似 align-items,但不是設置子元素對齊,而是設置行對齊

          order

          設置彈性盒子中子元素的排列順序

          align-self

          在彈性盒子的子元素上使用,用來覆蓋容器的 align-items 屬性

          flex

          設置彈性盒子中的子元素如何分配空間

          flex-grow

          設置彈性盒子的擴展比率

          flex-shrink

          設置彈性盒子的收縮比率

          flex-basis

          設置彈性盒子伸縮基準值

          按照功能范圍可分為容器屬性和項目屬性。

          容器的屬性

          1、flex-direction

          此屬性決定容器主軸排列方式,它有以下幾個值:

          描述

          row

          默認值,主軸沿水平方向從左到右

          row-reverse

          主軸沿水平方向從右到左

          column

          主軸沿垂直方向從上到下

          column-reverse

          主軸沿垂直方向從下到上

          initial

          使用此屬性的初始值

          inherit

          從父元素繼承此屬性的值

          如下圖演示:

          圖2

          2、flex-wrap

          flex-wrap 當子元素項超出容器時,設置其是否換行,有以下值:

          描述

          nowrap

          默認值,表示項目不會換行

          wrap

          項目會在需要時換行

          wrap-reverse

          項目會以相反的順序換行

          initial

          設置為屬性的默認值

          inherit

          從父元素繼承屬性的值

          默認如果不設置flex-wrap,當子元素在主軸方向總和超過容器大小,則其大小會變小,直到容器沒有多余的空間,如下演示:

          圖3

          如圖3即使子元素設置了寬度或高度,它仍然被擠壓,直到容器沒有多余空間,此時就會超出容器顯示。當主軸方向是垂直方向時一樣。

          下面是flex-wrap換行的效果:

          當主軸是水平方向時

          圖4

          當主軸是垂直方向時

          圖5

          3、flex-flow

          flex-flow 是flex-direction 和 flex-wrap 兩個屬性的簡寫,也就是說它可以同時設置這2個屬性,語法如下:

          flex-flow: flex-direction flex-wrap;

          如下圖示例:

          flex-flow: row nowrap

          圖6

          flex-flow: row wrap

          圖7

          flex-flow: column wrap

          圖8

          其它屬性依次類推,你可以試試相互組合。

          4、justify-content

          此屬性用來設置子元素項目在主軸上的對齊方式,它有以下幾個值:

          描述

          flex-start

          默認值,在主軸開始位置對齊,水平排列時就是左對齊,垂直排列是上對齊

          flex-end

          在主軸結束位置對齊,水平排列是右對齊,垂直排列是下對齊

          center

          水平或垂直居中對齊

          space-between

          兩端對齊,項目之間的間隔是相等的

          space-around

          每個項目兩側的間隔相等

          initial

          設置為屬性的默認值

          inherit

          從父元素繼承屬性的值

          如下圖演示的效果:

          水平排列時

          圖9

          垂直排列時

          圖10

          5、align-items

          此屬性和justify-content類似,區別是align-items 是這種子項目元素在交叉軸上的對齊方式,它有以下值:

          描述

          stretch

          默認值,項目將被拉伸以適合容器

          center

          項目位于交叉軸方向的中間位置

          flex-start

          項目位于交叉軸方向的開始位置

          flex-end

          項目位于交叉軸方向的結束位置

          baseline

          項目與容器的文字基線對齊

          initial

          將設置為屬性的默認值

          inherit

          從父元素繼承屬性的值

          效果如下:

          圖11

          這里注意,當值為baseline時,是基于文字的基線對齊的。

          6、align-content

          align-content 屬性比較抽象,它只有滿足以下條件下才能起作用:

          1. 對父元素設置屬性display:flex;
          2. 并且設置排列方式為水平排列 flex-direction:row;
          3. 設置換行,flex-wrap:wrap;

          align-content 只適用多行的flex容器(也就是flex容器中的子項不止一行時該屬性才有效果),它的作用是當flex容器在交叉軸上有多余的空間時,將子項作為一個整體進行對齊。不同取值的效果如下所示:

          描述

          stretch

          默認值,將項目拉伸以占據剩余空間,占滿整個交叉軸

          center

          項目交叉軸的中點對齊

          flex-start

          項目與交叉軸的起點對齊

          flex-end

          項目交叉軸的終點對齊

          space-between

          多行項目均勻分布在容器中,其中第一行分布在容器的頂部,最后一行分布在容器的底部

          space-around

          多行項目均勻分布在容器中,并且每行的間距(包括離容器邊緣的間距)都相等

          initial

          將設置為屬性的默認值

          inherit

          從父元素繼承該屬性的值

          如下示例:

          圖12

          項目屬性

          1、order

          order 屬性用來設置項目在容器中出現的順序,您可以通過具體的數值來定義,如下圖示例:

          圖13

          圖14

          子元素項目按照order的值從小到大排序。

          2、align-self

          align-self 屬性允許您為某個項目設置不同于其它項目的對齊方式,align-self 屬性和容器的align-items屬性一樣,它可以覆蓋容器的align-items 屬性的值。

          如下示例:

          圖15

          如圖15中c方塊的對齊方式覆蓋了容器的align-items: center;

          3、flex-grow

          flex-grow屬性定義項目的放大比例,默認為0。

          圖16

          如上圖中其它方塊默認是flex-grow:0不放大。

          圖17

          如上圖方塊2占滿了剩余的空間,雖然讓設置了flex-grow:2;

          圖18

          如上圖當所有項目flex-grow:1時,則它們將等分剩余空間(如果有的話),這里即使你設置了其它的數值比如flex-grow:2,flex-grow:10結果都一樣等分

          圖17

          如果其中一個項目的flex-grow屬性為2,其他項目都為1,則前者占據的剩余空間將比其他項多一倍。

          4、flex-shrink

          flex-shrink屬性和flex-grow相反,它是設置項目縮小比例。默認為1,如果空間不足,該項目將縮小。

          如下所圖例,當子元素設置flex-shrink:1時,如果空間不足,該項目將等比縮小。

          圖18

          如下圖,當子元素設置flex-shrink:1時,但是其中c子項的flex-shrink:0時,在空間不足時c子項保持不變,其它項等比縮小。

          圖19

          同理當c項flex-shrink:2時,在空間不足時c項將比其它項目多縮小2倍,數值不同縮小比例不一樣,如下圖:

          圖20

          5、flex-basis

          flex-basis屬性設置項目如何分配主軸上剩余的空間,值為 auto(默認值,表示自動)、inherit(表示從父元素繼承該屬性的值) 或者以具體的值加 "%"、"px"、"em" 等單位的形式。

          flex-basis:auto 時:

          圖21

          flex-basis:100% 時:

          圖22

          flex-basis:100px 時:

          圖23

          • 注意它和width的區別,flex-basis只能在flex容器中使用,但width在任何塊級元素都可以。
          • 同時設置width,又設置flex-basis,當flex-basis大于自身內容寬度時,不管width是否設置,flex-basis優先級高。
          • 當flex-basis和width都小于自身內容寬度時,flex-basis和width哪個值大,寬度就是那個。
          • 當flex-basis設置值小于自身內容寬度,而width大于自身寬度時,則寬度為自身內容寬度。

          flex屬性

          flex 屬性是 flex-grow、flex-shrink 和 flex-basis 三個屬性的簡寫,語法格式如下:

          flex: flex-grow flex-shrink flex-basis;

          如下示例:

          圖24

          圖25


          最后

          關于flex容器,其知識點比較多相對難易理解,它非常靈活,所以要活學活用,多加練習。通常flex會和rem一起使用,實現頁面自適應,常見的網頁布局比如以下:

          上中下+側邊欄,中間側邊邊和內容區域高度自適應

          左右結構,側邊等高,右邊上中下結構

          關于網頁布局,以后會專門介紹,在這里不詳細說明了,感謝關注,學習愉快。

          參考資料:

          https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex

          https://www.runoob.com/w3cnote/flex-grammar.html

          http://c.biancheng.net/css3/flex.html

          https://www.w3school.com.cn/cssref/pr_flex.asp

          flex布局在布局中用的很多,可以使用在pc端,也可以在小程序中使用,甚至可以代替float浮動,學好flex布局對我們的用處很大。

          flex布局的重要性

          1. flex布局可以設置控件的排列方向和順序。
          2. flex布局可以設置各種各樣的對齊方式。
          3. flex布局可以彈性的放大和縮小

          flex布局的應用

          先設計容器。

          <view class="containers">
          <view class="div1"></view>
          <view class="div2"></view>
          <view class="div3"></view>
          </view>

          在父控件上加上display:flex,就變成了css的彈性布局。

          .containers{
            /* 加上他,變成彈性布局,將會水平排列 */
            display: flex;
            /* 控件的排列方向,默認是row,水平排列 */
            /* flex-direction: column; */
            /* 對齊方式.
            flex-start:起點對齊,
            flex-end:末尾對齊
            space-between:兩端對齊
            space-around:環繞對齊
             */
            justify-content: space-between;
            /* 相對于父控件的對齊方式
              flex-start:頂端對齊
              flex-end:末端對齊
              center:居中對齊
              baseline:文字基線對齊
            */
            align-items: flex-end;
            height: 200px;
            background: pink; 
          }

          子div的樣式如:

          .div1{
            width: 50px;
            height: 50px;
            background-color: yellow;
            /* 在子控件上加入flex=1,將會平分屏幕的寬度 */
            /* flex: 1; */
            /* 該子組件將會填充剩余的寬度 */
            /* flex-grow: 1; */
          }
          .div2{
            width: 50px;
            height: 50px;
            background: blue;
            /* flex: 1; */
          }
          .div3{
            width: 50px;
            height: 50px;
            background: greenyellow;
            /* flex: 1; */
          }

          當子樣式中添加flex:1的時候,該資陽市將會把容器填充滿,如果每個子控件都加上flex,將會平分父容器。不會受到自身div寬度的限制。
          如下圖為子組件都設為flex:1的情況。

          如果子div沒有填滿屏幕的寬度,這時我們可以在子組件中設置 flex-grow: 1;來讓該子組件填充滿屏幕的寬度。如下圖所示,為黃色的子div加上了flex-grow:1,當為多個子div設置該屬性的時候,子div也會平分。

          接下來設計父div,在父div上加**justify-content:**屬性,會給子組件設置對齊方式。

          • flex-start:起點對齊

        1. flex-end:末尾對齊
        2. space-between:兩端對

        3. space-around:環繞對齊
        4. 也可以設置align-items屬性來設置相對于父div的高度對齊方式。

          • flex-start:頂端對齊

        5. flex-end:末端對齊
        6. center:居中對齊
          • baseline:文字基線對齊

          文字基線對齊,是子div有文字的時候,文字在一條線上


          主站蜘蛛池模板: 久久福利一区二区| 亚洲av乱码一区二区三区| 免费高清在线影片一区| 久久久人妻精品无码一区| 国产成人一区二区三区在线| 无码人妻精品一区二区三18禁| 韩国美女vip福利一区| 国产在线一区二区三区在线| 无码av免费一区二区三区试看| 一区二区高清视频在线观看| 国产免费av一区二区三区| 国产精品第一区第27页| 日本在线不卡一区| 久久毛片一区二区| 精品性影院一区二区三区内射| 在线精品国产一区二区三区| 国产伦精品一区二区三区视频猫咪| 亚洲国产成人久久一区二区三区 | 在线播放偷拍一区精品| 亚洲国产日韩一区高清在线 | 无码一区二区三区亚洲人妻| 在线一区二区观看| 无码8090精品久久一区| 午夜精品一区二区三区免费视频| 国模无码一区二区三区 | 怡红院一区二区三区| 国产激情一区二区三区在线观看| 激情啪啪精品一区二区| 国产精品主播一区二区| 国产在线观看一区二区三区精品 | 亚洲国产精品成人一区| 精品一区二区三区视频| 无码一区二区三区中文字幕| 波多野结衣AV一区二区三区中文| 国产在线一区二区杨幂| 日本高清成本人视频一区| 伊人久久一区二区三区无码| 无码人妻精品一区二区蜜桃AV| 无码日韩精品一区二区免费暖暖| 精品无码综合一区二区三区| 国产乱码精品一区二区三区中文|