flex佈局踩過的那些坑

接觸H5項目後,開始瞭解到flex佈局,功能很是之強大,用起來至關之舒服。基本的知識介紹就不說了,參考http://www.ruanyifeng.com/blo...css

接下來講說我踩過的那些坑:html

1.flex佈局版本兼容問題web

flex佈局自2009提出以後,變化過好幾個版本:瀏覽器

**2009** version
標誌:**display: box**; 

**2011** version
標誌:**display: flexbox**; 

**2012** version
標誌:**display: flex/inline-flex**; 

2014 version
新增了對flex項z-index的規定

2015 W3C Editor’s Draft
(草案階段)

兼容方案:
父級flex佈局佈局

display: -webkit-box;   /* OLD - iOS 6-, Safari 3.1-6 */
display: -moz-box;  /* OLD - Firefox 19- H5不用考慮 */
display: -mz-flexbox; /* TWEENER IE 10 */
display: flex; /* NEW, Spec - Opera 12.1, Firefox 20+ */

其餘屬性都對應相關的版本方案,目前項目中是隻寫最新的方案,由autoprefixer自動添加兼容方案。flex

2.關於flex-grow的寬度分配問題ui

flex-grow屬性用於設置或檢索彈性盒的擴展比率,默認爲0。不容許爲負值。
最爲常見的用法是用flex-grow實現等比例「tab」佈局,舉例:flexbox

<div class="box">
    <span class="item">元素</span>
    <span class="item">元素</span>
    <span class="item">元素</span>
    <span class="item">元素</span>
    <div class="item">元素</div>
    <div class="item">元素</div>
</div>

css:spa

.box {
    display: flex;
    align-items: center;
    padding: 40px 20px;
    color: white;
    background-color: black;
}
.item {
    flex-grow: 1;
    height: 60px;
    line-height: 60px;
    text-align: center;
    border: 1px solid white;
    background-color: #ff0000;
}

不用懼怕浮動,不用考慮子元素是塊級元素仍是行內元素,顯示OK,無論外面flex父級寬度如何變化,它們都等比分佈:code

糾正一下本身錯誤的理解,flex-grow是分配flex容器除內容外剩餘空間的比例,並非整個容器的比例[捂臉],因此出現下面的現象是徹底正常的,雖然解決方案可行,但我依然不懂其中的原因,再次[捂臉]。。。

clipboard.png

氮素,「意外」來了:
clipboard.png

好奇怪,怎麼不是等比例顯示?你們flex-grow都是1,爲何你要佔那麼寬?
最後找到解決方案,全部flex-grow的子元素加上flex-basis: 0%;就是徹底等比分佈了,這個屬性值會讓父級主軸在計算剩餘空間時忽略子元素的自己寬度,從而實現等比分配。簡單寫法就是直接定義flex: 1;不分開定義三個屬性。固然若是是那種連串的英文就要設置word-break: break-all;。

clipboard.png

3.設置了flex-grow元素的子級寬度問題

來,栗子:

<div class="box">
    <span class="other">Hi</span>
    <div class="item">
        <div class="text">
             一個flex-grow爲1的元素的子級一個flex-grow爲1的元素的子級一個flex-grow    爲1的元素的子級一個flex-grow爲1的元素的子級
        </div>
    </div>
</div>

css:

.box {
    display: flex;
    align-items: center;
    padding: 40px 20px;
    color: white;
    background-color: black;
}

.item {
    flex-grow: 1;
    width: 100%;
    height: 60px;
    line-height: 60px;
    text-align: center;
    background-color: #ff0000;
}

.text {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.other {
    flex-shrink: 0;
    display: inline-block;
    width: 150px;
    height: 60px;
    line-height: 60px;
    background-color: orange;
}

大跌眼鏡的事就這麼發生了,flex-grow元素的子級竟然撐破了父級的寬度,超出去了,不知道該怎麼解釋這種現象:
clipboard.png
clipboard.png

解決方案就是,flex-grow元素設置overflow: hidden;效果:

clipboard.png

最後一個小坑,算不上坑,就是父級設置了flex佈局後,子元素就算是行內元素不少瀏覽器能夠把它當作inline-block或者block元素來用,能夠直接設置它的寬高,可是仍是有些瀏覽器不支持,因此要設置行內元素的寬度,仍是手動設置一下它的display爲inline-block或者block.

flex佈局很是好用,就是PC兼容性相對較差,IE要10,甚至11以上纔有很好的兼容,不過你們能夠用它在H5頁面好好發揮。

相關文章
相關標籤/搜索