CSS3之伸縮布局盒模型

一、css的布局模式

css2.1中定義了四種布局模式,由一個盒與其兄弟、祖先盒的關系決定其尺寸與位置的算法。

  • 塊布局:呈現文檔的布局模式
  • 行內布局:呈現文本的布局模式
  • 表格布局:用格子呈現2D數據的布局模式
  • 定位布局:定位元素的布局模式,定位元素基本與其它元素無關

css3引入的布局模式flexbox布局,主要思想是讓容器有能力讓其子項目能夠改變其寬度、高度(甚至順序),以最佳的方式填充可用空間(主要是為了適應所有類型的顯示設備和屏幕大?。?。Flex容器會使子項目(伸縮項目)擴展來填滿可用空間,或縮小他們以防止溢出容器。

二、Flexbox模型的功能

Flexbox布局對于設計比較復雜的頁面非常有用,可輕松地實現屏幕和瀏覽器窗口大小發生變化時保持元素的相對位置和大小不變。同時減少了依賴于浮動布局實現元素位置的定義以及重置元素的大小。

特點:

  • 屏幕和瀏覽器窗口大小發生改變也可以靈活地調整布局
  • 指定伸縮項目沿著主軸或側軸按比例分配額外的空間,從而調整伸縮項目的大小
  • 指定伸縮項目沿著主軸或側軸將伸縮容器額外的空間,分配到伸縮項目之前、之后或之間。
  • 指定如何將垂直于元素布局軸的額外空間分布到該元素的周圍
  • 控制元素在頁面上的布局方向
  • 按照不同于文檔對象模型(DOM)所指定的排序方式對屏幕上的元素重新排序

三、Flexbox模型中的術語

1、主軸和側軸

伸縮布局偏向使用伸縮流的方向。
1)主軸、主軸方向:用戶代理沿著一個伸縮容的主軸配置伸縮項目,主軸是主軸方向的延伸。它不一定是水平的,主要取決于justify-content屬性。
2)主軸起點、主軸終點:伸縮項目的配置從容器的主軸起點邊開始,往主軸終點邊結束。
3)主軸長度、主軸長度屬性:伸縮項目在主軸方向的寬度或高度就是項目的主軸長度
4)側軸、側軸方向:與主軸垂直的軸稱作側軸,側軸是側軸方向的延伸,主要取決于主軸方向。
5)側軸起點、側軸終點:填滿項目的伸縮行的配置從容器的側軸起點邊開始,往側軸終點邊結束。
6)側軸長度、側軸長度屬性:伸縮項目在側軸方向的寬度和高度就是項目的側軸長度

2、伸縮容器和伸縮項目

通過display屬性給一個元素設置為flex或者inline-flex,這個容器就是一個伸縮容器。伸縮容器會為其內容創立新的伸縮格式化上下文,其中設置為flex的容器被渲染為塊級元素,設置為inline-flex的容器渲染為行內元素。若元素display的指定值是inline-flex且元素是一個浮動或絕對定位元素,則display的計算值是flex。

一個伸縮容器內具有零個以上的伸縮項目,伸縮容器的每個子元素都會成為一個伸縮項目,且用戶代理會將任何直接在伸縮容器里的連續文字塊包起來成為匿名伸縮項目。

3、伸縮容器的屬性

Flexbox伸縮布局中伸縮容器和伸縮項目是伸縮布局模塊中的重要部分,其中每一部分都具有各自的屬性。
1)伸縮流方向:指伸縮容器的主軸方向,決定了伸縮項目放置在伸縮容器的方向。主要通過flex-direction屬性設置,默認值為row。
2)伸縮行換行:主要用來設置伸縮容器的伸縮項目是單行顯示還是多行顯示,以及決定側軸的方向。通過flex-wrap屬性設置伸縮項目是否換行,默認值為nowrap。
3)伸縮方向與換行:是伸縮流方向與伸縮換行的縮寫,決定了伸縮容器的主軸與側軸,通過flex-flow同時設定了伸縮流方向和伸縮換行兩個屬性。
4)主軸對齊:用來設置伸縮容器當前行伸縮項目在主軸方向的對齊方式,指定如何在伸縮項目之間分布伸縮容器的額外空間。
5)側軸對齊:定義伸縮項目在伸縮容器的當前行的側軸對齊方式,類似于主軸對齊。
6)堆棧伸縮行:用來定義伸縮容器中伸縮項目行在側軸的對齊方式,類似于側軸對齊,只不過是用來控制伸縮項目行在布局軸的堆放方式。

4、伸縮項目的屬性

一個伸縮項目是一個伸縮容器的子元素,伸縮容器的文本也被視為一個伸縮項目。
伸縮項目都有一個主軸長度和側軸長度,主軸長度是伸縮項目在主軸上的尺寸,側軸長度是伸縮項目在側軸的尺寸。一個伸縮項目的寬度和高度取決于伸縮容器的軸。
1)顯示順序:伸縮容器中的伸縮項目默認顯示順序遵循文檔在源碼中出現的先后順序(DOM結構中的先后順序)??梢酝ㄟ^伸縮項目的顯示順序修改伸縮項目在頁面中的顯示順序,也可以通過這個屬性對伸縮項目進行排序組合。
2)側軸對齊:包含兩種,一種是align-items屬性,用來設置伸縮容器中包括匿名伸縮項目的所有項目的對齊方式;另一種是align-self屬性,用來在單獨的伸縮項目上覆寫默認的對齊方式。對于匿名的伸縮項目,align-self的值與其關聯的伸縮容器的align-items的值相同。
3)伸縮性:定義伸縮項目可改變他們的寬度或高度填補可用的空間,可將伸縮容器的額外空間分發給其伸縮項目(與伸縮項目的正彈性成正比)或將他們縮小以防止伸縮項目溢出(與伸縮項目的負彈性成正比)。

5、伸縮行

伸縮項目沿著伸縮容器內的一個伸縮行定位,伸縮容器可以是單行的,也可以是多行的。主要由flex-wrap決定。

四、Flexbox模型的基本使用

1、伸縮容器display

語法:display:flex|inline-flex
參數說明:

  • flex:將一個容器設置為塊伸縮容器
  • inline-flex:將一個容器設置為內聯 伸縮容器

注意:設為 Flex 布局以后,css的columns在伸縮容器上將失效;子元素的float、clear和vertical-align屬性將失效。

2、伸縮流方向flex-direction

flex-direction適用于伸縮容器,就是伸縮項目的父元素。主要用來創建主軸,從而定義了伸縮項目放置在伸縮容器的方向。
語法:
flex-direction:row|row-reverse|column|column-reverse

參數說明:

  • row:在ltr排版方式下從左到右排列,在rtl排版方式下從右向左排列(默認值)
  • row-reverse:與row排列方向相反
  • column:類似于row,不過是從上到下排列
  • column-reverse:類似于row-reverse,不過是從下到上排列

3、伸縮換行flex-wrap

flex-wrap屬性適用于伸縮容器,也就是伸縮項目的父元素,主要用來定義伸縮容器里是單行還是多行顯示,側軸的方向,決定了新行堆放的方向。
語法:flex-wrap:nowrap|wrap|wrap-reverse
參數說明:

  • nowrap:伸縮容器單行顯示,ltr排版下,伸縮項目從左到右排列;rtl排版下,伸縮項目從右向左排列(默認值)
  • wrap:伸縮容器多行顯示,ltr排版下,伸縮項目從左到右排列;rtl排版下伸縮項目從右向左排列。
  • wrap-reverse:伸縮容器多行顯示,ltr排版下,伸縮項目從右向左排列;rtl排版下,伸縮項目從左往右排列(與wrap相反)

4、伸縮流方向與還換行flex-flow

flex-flow適用于伸縮容器,也就是伸縮項目的父元素,是flex-direction和flex-wrap屬性的縮寫版本,同時定義了伸縮容器的主軸和側軸,默認值為row nowrap。
語法:flex-flow:flex-direction|flex-wrap

5、主軸對齊justify-content

主軸對齊justify-content適用于伸縮容器,也就是伸縮項目的父元素,主要用來定義伸縮項目沿著主軸線的對齊方式。
當一行的所有伸縮項目都不能伸縮或可伸縮但已經達到其最大長度時,這一屬性才會對伸縮容器額外的空間進行分配。當伸縮項目溢出某一行時,這一屬性也會在項目的對齊上施加一些限制。

語法:justify-content:flex-start|flex-end|center|space-between|space-around
參數說明:

  • flex-start:伸縮項目向一行的起始位置靠齊
  • flex-end:伸縮項目向一行的結束位置靠齊
  • center:伸縮項目向一行的中間位置靠齊
  • space-between:伸縮項目會平均的分布在行里
  • space-around:伸縮項目會平均地分布在行里,兩端保留一半的空間

示例鏈接:justify-content

6、側軸對齊align-items和align-self

設置伸縮項目在側軸的對齊方式有兩種:一種是伸縮項目行在側軸的對齊方式,主要由屬性align-items控制;另一種是伸縮項目自身在側軸的對齊方式,主要由屬性align-self控制。

align-items和justify-content相呼應。align-items調整伸縮項目在側軸上的定位方式,主要用來定義伸縮項目可以在伸縮容器的當前行的側軸對齊方式。

align-self屬性主要是用來設置單獨伸縮項目在側軸的對齊方式,可以用來覆蓋該伸縮項目的伸縮容器的align-items屬性,屬性值和align-items一樣。

語法:align-items:flex-start|flex-end|center|baseline|stretch
參數說明:

  • flex-start:伸縮項目在側軸起點邊的外邊距緊靠住該行在側軸起始邊
  • flex-end:伸縮項目在側軸終點邊的外邊距靠住該行在側軸終點邊
  • center:伸縮項目的外邊距盒在該行的側軸上居中放置
  • baseline:伸縮項目根據伸縮項目的基線對齊
  • stretch:默認值,伸縮項目拉伸填充整個伸縮容器。

示例鏈接:align-items ???? align-self

7、堆棧伸縮行align-content

align-content屬性會更改flex-wrap的行為,和align-items相似,但不是對齊伸縮項目,它對齊的是伸縮行。
align-content屬性主要用來調準伸縮行在伸縮容器里的對齊方式。
語法:align-content:flex-start|flex-end|center|space-between|space-around|stretch
參數說明:

  • flex-start:各行向伸縮容器的起點位置堆疊
  • flex-end:各行向伸縮容器的結束位置堆疊
  • center:各行向伸縮容器的中間位置堆疊
  • space-between:各行在伸縮容器中平均分布
  • space-around:各行在伸縮容器中平均分布,在兩邊各有一半的空間
  • stretch:默認值,各行將會伸展以占用額外的空間

示例鏈接:align-content

提示:這個屬性只有伸縮項目有多行時才生效,這種情況只有display的flex-wrap為wrap時,并且沒有足夠的空間把伸縮項目行放在同一行中。這個屬性將對每一行起作用,而不是每個伸縮項目。

8、伸縮性flex

flex屬性是讓伸縮項目可伸縮,讓伸縮項目的寬度和高度自動填充伸縮容器額外的空間。一個伸縮容器會等比地按照各伸縮項目的擴展比率分配額外的空間,也會按照收縮比率縮小各伸縮項目以避免伸縮項目溢出伸縮容器。

flex屬性可以用來指定可伸縮長度的部件,擴展比率、收縮比率、以及伸縮基準值。
當一個元素是伸縮項目時,flex屬性將代替主軸長度屬性決定元素的主軸長度;若元素不是伸縮項目,則flex屬性沒有效果。
語法:flex:none|flex-grow|flex-shrink|flex-basis

  • flex-grow:<number>(默認值為0),設置伸縮項目占伸縮容器的額外空間的份數
  • flex-shink:<number>(默認值為1),用來定義伸縮項目收縮的能力
  • flex-basis:<length>|auto(默認值auto),設置伸縮項目的伸縮基準值

9、顯示順序order

默認狀態下,元素是按照文檔流的結構順序排列,可以通過order屬性來改變伸縮項目出現在原文檔的次序。
語法:order:<number>
order屬性透過將伸縮項目分到有序號的組以控制伸縮項目的順序。伸縮容器會從序號最小的組開始布局,在同一個組里伸縮項目依據源文檔里的次序布局。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,185評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,656評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,446評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,951評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,189評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,718評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,800評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,420評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,755評論 2 371

推薦閱讀更多精彩內容

  • 移動開發基本知識點 一.使用rem作為單位 html { font-size: 100px; } @media(m...
    橫沖直撞666閱讀 3,497評論 0 6
  • H5移動端知識點總結 閱讀目錄 移動開發基本知識點 calc基本用法 box-sizing的理解及使用 理解dis...
    Mx勇閱讀 4,583評論 0 26
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,774評論 1 92
  • flex布局基礎知識 main axis(主軸): Flex容器的主軸主要用來配置Flex項目。它不一定是水平,這...
    前端小兵閱讀 503評論 0 1
  • 彈性布局(flexble box)模塊指在提供一個更加有效的方式來布置,對齊和分部在容器之間的各項內容,即使它們的...
    土豆蘿卜君閱讀 1,158評論 2 5