Flexbox布局(Flexible Box)模塊旨在提供一個更加有效的方式制定、調整和分布一個容器里的項目布局,即使他們的大小是未知或者是動態(tài)的。(這里我們稱為Flex)。 Flex布局主要思想是讓容器有能力讓其子項目能夠改變其寬度、高度(甚至順序),以最佳方式填充可用空間(主要是為了適應所有類型的顯示設備和屏幕大?。?。Flex容器會使子項目(伸縮項目)擴展來填滿可用空間,或縮小他們以防止溢出容器。 最重要的是,F(xiàn)lexbox布局方向不可預知,他不像常規(guī)的布局(塊就是從上到下,內聯(lián)就從左到右)。而那些常規(guī)的適合頁面布局,但對于支持大型或者雜的應用程序(特別是當他涉及到取向改變、縮放、拉伸和收縮等)就缺乏靈活性。 注:Flexbox布局最適合應用程序的組件和小規(guī)模的布局,而網(wǎng)格布局更適合那些更大規(guī)模的布局。 基本要素因為Flexbox是整個模塊,而不是一個屬性,它涉及很多東西,包括其整個組屬性。他們當中一部分是容器(父元素,稱為“伸縮容器”),另一部分是子元素(稱為“伸縮項目”)。 常規(guī)布局是基于塊和內聯(lián)流方向,而Flex布局是基于flex-flow流。請看看來自w3c規(guī)范中的這張圖,解釋了flex布局的主要思想。
基本上,伸縮項目是沿著主軸(main axis),從主軸起點(main-start)到主軸終點(main-end)或者沿著側軸(cross axis),從側軸起點(cross-start)到側軸終點(cross-end)排列。
屬性display:flex | inline-flex;(適用于伸縮容器,也就是伸縮項目的父元素)這個是用來定義伸縮容器,是內聯(lián)還是塊取決于設置的值。這個時候,他的所有子元素將變成flex文檔流,稱為伸縮項目。 display: other values | flex | inline-flex; 請注意:
flex-direction(適用于伸縮容器,也就是伸縮項目的父元素)這個主要用來創(chuàng)建主軸,從而定義了伸縮項目放置在伸縮容器的方向。 flex-direction: row | row-reverse | column | column-reverse
flex-wrap(適用于伸縮容器,也就是伸縮項目的父元素)這個主要用來定義伸縮容器里是單行還是多行顯示,側軸的方向決定了新行堆放的方向。 flex-wrap: nowrap | wrap | wrap-reverse
flex-flow(適用于伸縮容器,也就是伸縮項目的父元素)這個是“flex-direction”和“flex-wrap”屬性的縮寫版本。同時定義了伸縮容器的主軸和側軸。其默認值為“row nowrap”。 flex-flow: ‘flex-direction’> || ‘flex-wrap’> justify-content(適用于伸縮容器,也就是伸縮項目的父元素)這個是用來定義伸縮項目沿著主軸線的對齊方式。當一行上的所有伸縮項目都不能伸縮或可伸縮但是已經(jīng)達到其最大長度時,這一屬性才會對多余的空間進行分配。當項目溢出某一行時,這一屬性也會在項目的對齊上施加一些控制。 justify-content: flex-start | flex-end | center | space-between | space-around
align-item(適用于伸縮容器,也就是伸縮項目的父元素)這個主要用來定義伸縮項目可以在伸縮容器的當前行的側軸上對齊方式??梢园阉胂癯蓚容S(垂直于主軸)的“justify-content”。 align-items: flex-start | flex-end | center | baseline | stretch
align-content(適用于伸縮容器,也就是伸縮項目的父元素)這個屬性主要用來調準伸縮行在伸縮容器里的對齊方式。類似于伸縮項目在主軸上使用“justify-content”一樣。 注:請注意本屬性在只有一行的伸縮容器上沒有效果。 align-content: flex-start | flex-end | center | space-between | space-around | stretch
order(適用于伸縮項目,也就是伸縮容器的子元素)默認情況下,伸縮項目是按照文檔流出現(xiàn)先后順序排列。然而,“order”屬性可以控制伸縮項目在他們的伸縮容器出現(xiàn)的順序。 order: integer> flex-grow(適用于伸縮項目,也就是伸縮容器的子元素)根據(jù)需要用來定義伸縮項目的擴展能力。它接受一個不帶單位的值做為一個比例。主要用來決定伸縮容器剩余空間按比例應擴展多少空間。 如果所有伸縮項目的“flex-grow”設置了“1”,那么每個伸縮項目將設置為一個大小相等的剩余空間。如果你給其中一個伸縮項目設置了“flex-grow”值為“2”,那么這個伸縮項目所占的剩余空間是其他伸縮項目所占剩余空間的兩倍。 flex-grow: number> (默認值為: 0) 負值同樣生效。 flex-shrink(適用于伸縮項目,也就是伸縮容器的子元素)根據(jù)需要用來定義伸縮項目收縮的能力。 flex-shrink: number> (默認值為: 1) 負值同樣生效。 flex-basis(適用于伸縮項目,也就是伸縮容器的子元素)這個用來設置伸縮基準值,剩余的空間按比率進行伸縮。 flex-basis: length> | auto (默認值為: auto) 負值不合法。 flex(適用于伸縮項目,也就是伸縮容器的子元素)這是“flex-grow”、“flex-shrink”和“flex-basis”三個屬性的縮寫。其中第二個和第三個參數(shù)(flex-shrink、flex-basis)是可選參數(shù)。默認值為“0 1 auto”。 flex: none | [ 'flex-grow'> 'flex-shrink'>? || 'flex-basis'> ] align-self(適用于伸縮項目,也就是伸縮容器的子元素)用來在單獨的伸縮項目上覆寫默認的對齊方式。 屬性值的介紹請參閱“align-items”的屬性值。 align-self: auto | flex-start | flex-end | center | baseline | stretch 實例讓我們先從一個非常簡單的例子開始,解決一個幾乎每天都會碰到的問題:完美的居中。如果你使用flexbox,沒有比這更簡單的方法。 .parent { display: flex; height: 300px; /* Or whatever */}.child { width: 100px; /* Or whatever */ height: 100px; /* Or whatever */ margin: auto; /* Magic! */} 這個依賴于設置“margin”值為“auto”值,自動獲取伸縮容器中剩余的空間。所以設置垂直方向margin值為“auto”,可以使伸縮項目在伸縮容器的兩上軸方向都完全集中。 現(xiàn)在我們來使用一些其他的屬性。 考慮使用6個列表項,并且為了視覺審美給他設置了一個固定大小尺寸,但他們也有可能可以自動獲取尺寸大小。我們希望他們能均勻的、很好的分布在水平軸上,就算當我們調整瀏覽器,他們也依然顯示得很好(不使用媒體查詢)。 .flex-container { /* 我們第一步要創(chuàng)建一個flex文檔流(創(chuàng)建伸縮容器) */ display: flex; /* 然后我們定義伸縮流方向,并且可以換行 * 記得我們要這樣設置: * flex-direction: row; * flex-wrap: wrap; */ flex-flow: row wrap; /* 然后我們定義了如何分配伸縮容器的剩余空間 */ justify-content: space-around;} 完成。其他的一切都不過是一些美化外觀樣式。下面是在codepen上展示的一個例子。到codepen上查看,并試著調整你瀏覽器窗口去看發(fā)生什么事? 讓我們試試別的。假設我們網(wǎng)站頂部有一個右對齊的導航,但是我們希望它在小屏幕和小型設備中能單列居中顯示。非常簡單。 /* Large */.navigation { display: flex; flex-flow: row wrap; /* 所有列面向主軸終點位置靠齊 */ justify-content: flex-end;}/* Medium screens */@media all and (max-width: 800px) { .navigation { /* 當在中等屏幕中, 導航項目居中顯示,并且剩余空間平均分布在列表之間 */ justify-content: space-around; }}/* Small screens */@media all and (max-width: 500px) { .navigation { /* 在小屏幕下, 我們沒有足夠空間行排列,但我們可以換成列排列 */ flex-direction: column; }} 讓我們嘗試一些更靈活性的伸縮項目!關于移動先行,3列布局與頁眉頁腳全屏。和獨立的文檔順序。 .wrapper { display: flex; flex-flow: row wrap;}/* 設置所有標簽寬度為100% */.header, .main, .nav, .aside, .footer { flex: 1 100%;}/* 我們利用文檔流順序,考慮移動端先行 * 在這個例子中的順序: * 1. header * 2. nav * 3. main * 4. aside * 5. footer *//* Medium screens */@media all and (min-width: 600px) { /* 兩個邊欄在同一行 */ .aside { flex: 1 auto; }}/* Large screens */@media all and (min-width: 800px) { /* 設置左邊欄在主內容左邊 * 設置主內容區(qū)域寬度是其他兩個側邊欄寬度的兩倍 */ .main { flex: 2 0px; } .aside-1 { order: 1; } .main { order: 2; } .aside-2 { order: 3; } .footer { order: 4; }} 相關屬性
其他資源
瀏覽器兼容
黑莓瀏覽器10 +支持新的語法。全面兼容請觀注: 如何使用混合語法讓瀏覽器得到最好的支持,有關于這方面的信息,大家可以閱讀這篇文章(CSS-Tricks)和這篇文章(DevOpera)。
使用sass定義一個@mixin更容易解決為兼容瀏覽器寫的各種混合語法: @mixin flexbox() { display: -webkit-box; display: -moz-box; display: -ms-flexbox; display: -webkit-flex; display: flex;}@mixin flex($values) { -webkit-box-flex: $values; -moz-box-flex: $values; -webkit-flex: $values; -ms-flex: $values; flex: $values;}@mixin order($val) { -webkit-box-ordinal-group: $val; -moz-box-ordinal-group: $val; -ms-flex-order: $val; -webkit-order: $val; order: $val;}.wrapper { @include flexbox();}.item { @include flex(1 200px); @include order(2);} 如需轉載煩請注明出處:
|
|
來自: 昵稱41735554 > 《DIV+CSS》