flex布局(1):display:flex 布局應用


最近越來越依賴display:flex 了。本來只是在移動端用來作彈性布局,現在在PC端,我基本用它來取代 float:left。比如昨天做的一個專題,基本都用 flex 來布局。

但是這其中的原理呢,flex布局的相對於float的優勢又在哪呢。只是對這些有一個模糊的概念。

比如float:left/right 這個功能,一般用來排版。而它的高度塌縮,一些潛在的未被觸發的問題,總是給人一種很“不靠譜”的感覺。

先來盤點下float的特性:

1. 脫離當前文檔流。浮動盒子會貼着容器或者另一個浮動元素的邊緣(包括水平方向和垂直方向的邊緣),寬度不夠的話,就排到下一行。

舉個例子:

    <style>
        .box1 {
            width: 100px;
            height: 100px;
            background: #aedbf0;
            float:left;
        }
        .box2 {
            width: 100px;
            height: 150px;
            background: #ffbe84;
            float:left;
        }
        .box3 {
            width: 100px;
            height: 100px;
            background: #d4e280;
            float:left;
        }
        .parent {
            overflow: hidden;
            padding: 10px;
            border:1px solid #005e96;
            text-align:left;
            width: 250px; /*這里設置寬度為250px,無法容下3個100px寬度的方塊*/
            /*height: 200px;*/
        }
    </style>
</head>
<body>
<div class="parent">
    <div class="box1"></div>
    <div class="box2"></div>
    <div class="box3"></div>
</div>
</body>

這里將第二個浮動元素的高度設置為150px,比其他多了50。效果如下:

如果將第一個浮動元素設置為150px,則效果如下:

2. 文檔流的行內元素將會圍繞浮動元素,這個和塊狀元素不一樣。塊狀元素如果不設置float屬性,則會被浮動盒子覆蓋。比如文字環繞效果。

 

3. 對於浮動元素,top/left/right/bottom, z-index無效。(貌似很久前,我在使用z-index時被這個坑過...)

4. 形成 block formatting context (BFC)。創建了 BFC的元素就是一個獨立的盒子,里面的子元素不會在布局上影響外面的元素。

 

二、display: flex

1. 垂直居中 align-items: center;

配合align-items: center,輕松達到垂直居中的效果,好用到哭。解決了折磨我幾百年的圖片和多行文字垂直居中的問題。

具體效果可以點這里查看,垂直居中的幾個辦法

Flex布局教程語法篇

在實際開發中,假設我有並列兩個div,兩個div寬度不一致。假設比較小的flex盒子寬度比例設置為1,那么另外一個的寬度比例 = 大盒子寬度/設置比例為1的盒子寬度。

這樣,當包裹兩個flex盒子的容器整體寬度需要發生改變時,就不需要再去更改兩個盒子的寬度。

<style>
        .tips {
            max-width: 800px;
            height: 100px;
            display: flex;
            align-items: center; // 在容器設置這個屬性,達到垂直居中效果。
            background-color: #1e5dad;
            border-radius: 15px;
            margin: 25px auto;
        }
        .tips div:nth-child(1) {
            flex: 1; //小盒子比例為1
            margin-left: 25px;
        }
        .tips div:nth-child(2) {
            flex: 9.5; //大盒子寬度比例 = 大盒子寬度/小盒子寬度
        }
        .tips p {
            color: #fff;
            text-align: left;
            font-size: 20px;
            line-height: 31px;
        }
    </style>
</head>
<body>
<div class="tips">
    <div>
        <img src="images/doc.png" alt="">
    </div>
    <div>
        <p>注意,設為 Flex 布局以后,子元素的float、clear和vertical-align屬性將失效。</p>
    </div>
</div>
</body>

效果圖如下:

再來看看另外一個復雜點的例子:

    <style>
        *{ /*實際開發中,別這樣偷懶哦*/
            margin: 0;
            padding: 0;
        }
        .frequency {
            max-width: 1000px;
            margin-bottom: 20px;
            display: flex;
            align-items: center;
            background-color: #f3f4f6;
            height: 175px;
        }
        .fre_left {
            flex: 1;
        }
        .fre_right {
            flex: 4.78;
        }
        .fre_left div {
            color: #fff;
            width: 100px;
            height: 100px;
            background-color: #3ac1d5;
            border-radius: 50%;
            -moz-border-radius: 50%;
            -webkit-border-radius: 50%;
            border: 10px solid #e7eef8;
            margin: 0 auto;
            text-align: center;
            line-height: 50px;
        }
        .fre_left p {
            font-size: 26px;
            height: 24px;
            line-height: 31px;
            padding-top: 17px;
        }
        .fre_right ul {
            display: flex;
        }
        ul, ol {
            list-style: none;
        }
        .fre_right ul li {
            flex: 1;
            color: #4c4c52;
            font-size: 16px;
            line-height: 31px;
        }
        .fre_right ul li:before {
            content: url(images/arrow.png);
        }

    </style>
</head>
<body>
<div class="frequency">
    <div class="fre_left">
        <div>
            <p>熱點<br>問題</p>
        </div>

    </div>
    <div class="fre_right">
        <ul>
            <li> 一、Flex 布局是什么?</li>
            <li> 二、基本概念</li>
            <li> 三、容器的屬性</li>
        </ul>
        <ul>
            <li> flex-direction屬性決定主軸的方向</li>
            <li> flex-wrap屬性定義如何換行。</li>
            <li> flex-flow屬性默認值為row nowrap</li>
        </ul>
        <ul>
            <li> justify-content屬性定義了項目在主軸上的對齊方式。</li>
        </ul>
    </div>
</div>
</body>

效果圖如下:

在CSS布局中,Flex布局還有許多妙用,等待研究。

但是並不是什么時候都一股腦兒用這個。實際上每一種方式都有它自己的優勢和缺陷。

比如,Flex 布局下,

1. 子元素的float、clear和vertical-align屬性將失效。
2. 移動端img標簽下的圖片,如果設定了寬度,未設定高度,圖片高度產生變形。原因是:align - items 屬性的默認值:
  • stretch(默認值):如果項目未設置高度或設為auto,將占滿整個容器的高度。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM