免費配套視頻教程html
教程配套源碼資源前端
<ul> <!--parent element--> <li></li> <!--first child element--> <li></li> <!--second child element--> <li></li> <!--third child element--> </ul>
這就是一個無序列表(ul
)裏有三個列表元素(li
)。git
你能夠把ul
稱爲父元素,li
稱爲子元素。瀏覽器
要開始使用Flexbox,必須先讓父元素變成一個Flex容器。dom
你能夠在父元素中顯式的設置display:flex
或者display:inline-flex
。這樣你就能夠開始使用Flexbox模塊。ide
實際是顯式聲明瞭Flex容器以後,一個Flexbox格式化上下文(Flexbox formatting context)就當即啓動了。佈局
使用一個無序列表(ul
)和一羣列表元素(li
),啓動Flexbox格式化上下文的方式以下:學習
/* 聲明父元素爲flex容器 */ ul { display:flex; /*或者 inline-flex*/ }
給列表元素(li
)添加一點基本樣式。flex
li { width: 100px; height: 100px; background-color: #8cacea; margin: 8px; list-style: none; }
你將看到的效果以下圖所示:
默認狀況下,li
是塊級元素,在CSS中垂直排布的,也就是說從上到下排列顯示,就像下圖這樣:
然而,簡單的寫一行代碼display:flex
,你當即就能夠看到佈局改變了。
如今列表元素(li
)水平排列,從左到右。
Flexbox模塊的開始,正如前面的介紹,在任何父元素上使用display:flex
。
一旦你顯式的設置了display
屬性的值爲flex
,無序列表ul
就會自動變成Flex容器,而其子元素(在本例中是指列表元素li
)就變成了Flex項目。
使用了兩個關鍵詞,咱們把重點放到他們身上。瞭解他們對於理解後面的知識相當重要。
display:flex
這些只是Flexbox模塊的基礎。
flex-direction || flex-wrap || flex-flow || justify-content || align-items || align-content
經過上面的內容,咱們瞭解了一些基礎知識。知道了Flex容器和Flex項目是什麼,以及如何啓動Flexbox模塊。
有設置一個父元素做爲一個Flex容器,幾個對齊屬性可使用在Flex容器上。
正如你的塊元素的width
設置了200px
,有六種不一樣的屬性能夠用於Flex容器。
flex-direction
屬性控制Flex項目沿着主軸(Main Axis)的排列方向。
它具備四個值:
/* ul 是一個flex容器 */ ul { flex-direction: row || column || row-reverse || column-reverse; }
簡單點來講,就是flex-direction
屬性讓你決定Flex項目如何排列。它能夠是行(水平)、列(垂直)或者行和列的反向。
從技術上講,水平和垂直在Flex世界中不是什麼方向(概念)。它們經常被稱爲主軸(Main-Axis)和側軸(Cross-Axis)。默認設置以下所示。
通俗的說,感受Main-Axis就是水平方向,從左到右,這也是默認方向。Cross-Axis是垂直方向,從上往下。
默認狀況下,flex-direction
屬性的值是row
。它讓Flex項目沿着Main-Axis排列(從左向右,水平排列)。這就解釋了本文開始部分時無序列表的表現效果。
儘管flex-direction
屬性並無顯式的設置,但它的默認值是row
。Flex項目將沿着Main-Axis從左向右水平排列。
若是把flex-direction
的屬性值修改爲column
,這時Flex項目將沿着Cross-Axis從上到下垂直排列。再也不是從左向右排列。
flex-wrap
屬性有三個屬性值:
ul { flex-wrap: wrap || nowrap || wrap-reverse; }
我將經過一個例子來解釋如何使用flex-wrap
屬性。首先在前面的無序列表的HTML結構中多添加幾個列表項li
。
<ul> <!--parent element--> <li></li> <!--first child element--> <li></li> <!--second child element--> <li></li> <!--third child element--> <li></li> <li></li> <li></li> </ul>
幸運的是,新添加的Flex項目恰好適合Flex容器大小。也就是Flex項目能恰好填充Flex容器。
再深刻一點。
繼續給Flex容器內添加Flex項目,好比說添加到10
個Flex項目。這個時候會發生什麼?
<ul> <!--parent element--> <li></li> <!--first child element--> <li></li> <!--second child element--> <li></li> <!--third child element--> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> </ul>
一樣的,Flex容器仍是能容納全部的子元素(Flex項目)排列,這是每個Flex容器的默認行爲。Flex容器會在一行內容納全部的Flex項目。這是由於flex-wrap
屬性的默認值是nowrap
。也就是說,Flex項目在Flex容器內不換行排列。
ul { flex-wrap: nowrap; /*Flex容器內的Flex項目不換行排列*/ }
no-wrap
不是不可改變的。咱們能夠改變。
當你但願Flex容器內的Flex項目達到必定數量時,能換行排列。當Flex容器中沒有足夠的空間放置Flex項目(Flex項目默認寬度),那麼Flex項目將會換行排列。把它(flex-wrap
)的值設置爲wrap
就有這種可能:
ul { flex-wrap: wrap; }
如今Flex項目在Flex容器中就會多行排列。
在這種狀況下,當一行再不能包含全部列表項的默認寬度,他們就會多行排列。即便調整瀏覽器大小。
就是這樣子。注意:Flex項目如今顯示的寬度是他們的默認寬度。也沒有必要強迫一行有多少個Flex項目。
除此以外,還有一個值:wrap-reverse
。
是的,你猜對了。它讓Flex項目在容器中多行排列,只是方向是反的。
flex-flow
是flex-direction
和flex-wrap
兩個屬性的速記屬性。
你還記得使用border
的速記寫法?border: 1px solid red
。這裏的概念是相同的,多個值寫在同一行,好比下面的示例:
ul { flex-flow: row wrap; }
至關於:
ul { flex-direction: row; flex-wrap: wrap; }
除了這個組合以外,你還能夠嘗試一些其它的組合。flex-flow: row nowrap
,flex-flow: column wrap
,flex-flow: column nowrap
。
Flexbox模塊真得很好。若是你仍然不相信它的魅力,那麼justify-content
屬性可能會說服你。
justify-content
屬性能夠接受下面五個值之一:
ul { justify-content: flex-start || flex-end || center || space-between || space-around }
justify-content
屬性又能給咱們帶來什麼呢?提醒你一下,你是否還記得text-align
屬性。其實justify-content
屬性主要定義了Flex項目在Main-Axis上的對齊方式。
來看一個簡單的例子,仍是考慮下面這個簡單的無序列表:
<ul> <li>1</li> <li>2</li> <li>3</li> </ul>
添加一些基本樣式:
ul { display:flex; border: 1px solid red; padding: 0; list-style: none; background-color: #e8e8e9; } li { background-color: #8cacea; width: 100px; height: 100px; margin: 8px; padding: 4px; }
你將看到的效果是這樣:
經過justify-content
屬性,可讓Flex項目在整個Main-Axis上按照我本身的慾望設置其對齊方式。
可能會有如下幾種類型。
justify-content
的默認屬性值是flex-start
。
flex-start
讓全部Flex項目靠Main-Axis開始邊緣(左對齊)。
ul { justify-content: flex-start; }
flex-end
讓全部Flex項目靠Main-Axis結束邊緣(右對齊)。
ul { justify-content: flex-end; }
和你預期的同樣,center
讓全部Flex項目排在Main-Axis中間(居中對齊)。
ul { justify-content: center; }
space-between
讓除了第一個和最一個Flex項目的二者間間距相同(兩端對齊)。
ul { justify-content: space-between; }
你注意到有什麼不一樣?看看下圖的描述:
最後,space-around
讓每一個Flex項目具備相同的空間。
ul { justify-content: space-around; }
和space-between
有點不一樣,第一個Flex項目和最後一個Flex項目距Main-Axis開始邊緣和結束邊緣的的間距是其餘相鄰Flex項目間距的一半。看看下圖的描述:
align-items
屬性相似於justify-content
屬性。只有理解了justify-content
屬性,才能更好的理解這個屬性。
align-items
屬性能夠接受這些屬性值:flex-start || flex-end || center || stretch || baseline
。
ul { align-items: flex-start || flex-end || center || stretch || baseline }
它主要用來控制Flex項目在Cross-Axis對齊方式。這也是align-items
和justify-content
兩個屬性之間的不一樣之處。
下面是不一樣的值對Flex項目產生的影響。不要忘記這些屬性只對Cross-Axis軸有影響。
首先,讓咱們設置ul的高度高於li的高度
ul { height: 200px; }
align-items
的默認值是stretch
。讓全部的Flex項目高度和Flex容器高度同樣。
正如你所但願的flex-start
讓全部Flex項目靠Cross-Axis開始邊緣(頂部對齊)。
flex-end
讓全部Flex項目靠Cross-Axis結束邊緣(底部對齊)。
center
讓Flex項目在Cross-Axis中間(居中對齊)。
讓全部Flex項目在Cross-Axis上沿着他們本身的基線對齊。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> ul { border: 1px solid red; display: flex; height: 200px; align-items: baseline; } li { width: 100px; background-color: #8cacea; margin: 8px; list-style: none; font-size: 28px; } li:nth-child(2){ font-size: 12px; } </style> </head> <body> <ul> <!--parent element--> <li>1</li> <!--first child element--> <li>2</li> <!--second child element--> <li>333 33333 33 </li> <!--third child element--> </ul> </body> </html>
結果看上去有點像flex-start
,但略有不一樣。那「baseline」究竟是什麼呢?下圖應該能幫助你更好的理解。
還記得前面討論的wrap
屬性嗎?咱們在Flex容器中添加了更多的Flex項目。讓Flex容器中的Flex項目多行排列。
align-content
屬性用於多行的Flex容器。它也是用來控制Flex項目在Flex容器裏的排列方式,排列效果和align-items
值同樣,但除了baseline
屬性值。
像align-items
屬性同樣,它的默認值是stretch
。你如今應該熟悉這些值。那它又是如何影響Flex容器裏的10個Flex項目多行排列方式。
使用stretch
會拉伸Flex項目,讓他們沿着Cross-Axis適應Flex容器可用的空間。
你看到的Flex項目間的間距,是Flex項目自身設置的margin
值。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> ul { border: 1px solid red; display: flex; height: 400px; flex-wrap: wrap; align-content:center; } li { width: 100px; background-color: #8cacea; margin: 8px; list-style: none; font-size: 28px; } li:nth-child(2){ font-size: 12px; } </style> </head> <body> <ul> <!--parent element--> <li>1</li> <!--first child element--> <li>2</li> <!--second child element--> <li>333 33333</li> <!--third child element--> <li>1</li> <!--first child element--> <li>2</li> <!--second child element--> <li>333 33333 33 </li> <!--third child element--> <li>1</li> <!--first child element--> <li>2</li> <!--second child element--> <li>333 33333 33 </li> <!--third child element--> </ul> </body> </html>
以前你看到過flex-start
。此次是讓多行Flex項目靠Cross-Axis開始邊緣。沿着Cross-Axis從上到下排列。所以Flex項目在Flex容器中頂部對齊。
flex-end
恰好和flex-start
相反,讓多行Flex項目靠着Cross-Axis結束位置。讓Flex項目沿着Cross-Axis從下到上排列,即底部對齊。
你猜到了,center
讓多行Flex項目在Cross-Axis中間。在Flex容器中居中對齊。
這是Flex容器的最後一個屬性。你如今知道如何使用各類Flex容器屬性。你能夠在工做中實踐這些屬性。
flex-grow || flex-shrink || flex-basis
如今咱們把注意力從Flex容器轉移到Flex項目及其對齊屬性。
像Flex容器,對齊屬性也能夠用在全部的Flex項目。
flex-grow
和flex-shrink
屬性控制Flex項目在容器有多餘的空間如何放大(擴展),在沒有額外空間又如何縮小。
他們可能接受0
或者大於0
的任何正數。0 || positive number
。
接下來闡述它們的使用。使用一個簡單的無序列表作爲例子,它只包含一個列表項。
ul { display:flex; border: 1px solid red; padding: 0; list-style: none; } li { background-color: #8cacea; height: 100px; margin: 8px; padding: 10px; } <ul> <li>I am a simple list</li> </ul>
添加更多的樣式,看起來像這樣:
默認狀況下,flex-grow
屬性值設置爲0
。表示Flex項目不會增加,填充Flex容器可用空間。取值爲0
就是一個開和關的按鈕。表示flex-grow
開關是關閉的。
若是把flex-grow
的值設置爲1
,會發生:
如今Flex項目擴展了,佔據了Flex容器全部可用空間。也就是說開關打開了。若是你試着調整你瀏覽器的大小,Flex項目也會縮小,以適應新的屏幕寬度。
爲何?默認狀況下,flex-shrink
的值是1
,也就是說flex-shrink
開關也是打開的。
能夠仔細看看flex-grow
和flex-shrink
屬性在各類狀況下的效果,這樣能更好的幫助你理解。
flex-basis
屬性能夠指定Flex項目的初始大小。也就是flex-grow
和flex-shrink
屬性調整它的大小以適應Flex容器以前。
flex-basis
默認的值是auto
。flex-basis
能夠取任何用於width
屬性的任何值。好比 % || em || rem || px
等。
注意:若是flex-basis
屬性的值是0
時,也須要使用單位。即flex-basis: 0px
不能寫成flex-basis:0
。
這裏一樣使用只有一個列表項的列表作爲示例。
/* 聲明父元素爲flex容器 */ ul { display:flex; border: 1px solid red; padding: 0; list-style: none; } li { background-color: #8cacea; height: 100px; margin: 8px; padding: 10px; } <ul> <li>I am a simple list</li> </ul>
默認狀況,Flex項目的初始寬度由flex-basis
的默認值決定,即:flex-basis: auto
。Flex項目寬度的計算是基於內容的多少來自動計算(很明顯,加上了padding
值)。
這意味着,若是你增長Flex項目中的內容,它能夠自動調整大小。
<ul> <li>I am a simple list AND I am a simple list</li> </ul>
然而,若是你想將Flex項目設置一個固定的寬度,你也能夠這樣作:
li { flex-basis: 150px; }
如今Flex項目的寬度受到了限制,它的寬度是150px
。
flex
是flex-grow
、flex-shrink
和flex-basis
三個屬性的速記(簡寫)。
在適當的時候,我建議你使用flex
,這樣比使用三個屬性方便。
li { flex: 0 1 auto; }
上面的代碼至關於:
li { flex-grow: 0; flex-shrink: 1; flex-basis: auto; }
注意它們之間的順序。flex-grow
第一,而後是flex-shrink
,最後是flex-basis
。縮寫成GSB,能夠幫助你更好的記憶。
若是flex
屬性值中少一個值,會發生什麼呢?
若是你只設置了flex-grow
和flex-shrink
值,flex-basis
多是默認值0
。這就是所謂的絕對flex項目。只有當你設置了flex-basis
,你會獲得一個相對flex項目。
/* 這是一個絕對的Flex項目 */ li { flex: 1 1; /*flex-basis 默認值爲 0*/ } /* 這是一個相對的Flex項目 */ li { flex-basis: 200px; /* 只設置了flex-basis的值 */ }
你確定想知道相對和絕對的Flex項目是什麼?將在後面回答這個問題。
讓咱們看看一些很是有用的flex
值。
li { flex: 0 1 auto; }
這至關於寫了flex
默認屬性值以及全部的Flex項目都是默認行爲。
很容易理解這一點,首先看看flex-basis
屬性。flex-basis
設置爲auto
,這意味着Flex項目的初始寬度計算是基於內容的大小。
把注意力放到下一個屬性,flex-grow
設置爲0
。這意味着flex-grow
不會改變Flex項目的初始寬度。也就是說,flex-grow
的開關是關閉的。
flex-grow
控制Flex項目的增加,若是其值設置爲0
,Flex項目不會放大以適應屏幕(Flex容器大小)。
最後,flex-shrink
的值是1
。也就是說,Flex項目在必要時會縮小。
應用到Flex項目效果就是這樣子:
注意:Flex項目沒有增加(寬度)。若是有必要,若是調整瀏覽器(調小瀏覽器寬度),Flex項目會自動計算寬度。
li { flex: 0 0 auto; }
這個至關於flex: none
。
仍是老規矩:寬度是被自動計算,不過彈性項目不會伸展或者收縮(由於兩者都被設置爲零)。伸展和收縮開關都被關掉了。
它基本上是一個固定寬度的元素,其初始寬度是基於彈性項目中內容大小。
看看這個 flex 簡寫是如何影響兩個彈性項目的。一個彈性項目會比另外一個容納更多內容。
應該注意到的第一件事情是,這兩個彈性項目的寬度是不一樣的。由於寬度是基於內容寬度而自動計算的,因此這是預料獲得的。
試着縮放一下瀏覽器,你會注意到彈性項目不會收縮其寬度。它們從父元素中突出來了,要看到全部內容,必須橫向滾動瀏覽器。
在縮放瀏覽器時,彈性項目不會收縮,而是從彈性容器中突出來了。
這與 flex: auto
項目相同。
仍是按我前面立的規矩。即,自動計算初始化寬度,可是若是有必要,會伸展或者收縮以適應整個可用寬度。
伸展和收縮開關打開了,寬度自動被計算。
此時,項目會填滿可用空間,在縮放瀏覽器時也會隨之收縮。剩餘寬度被2個item平均分配,一人一半。
通常應用於有多個彈性項目的情形。
這裏正數能夠表明任何正數(沒有引號)。這與 flex: 「正數」 1 0
相同。
flex: 2 1 0
與寫爲 flex: 2
是同樣的,2
表示任何正數。
li { flex: 2 1 0; / *與 flex: 2相同 */ }
與前面我立的規矩同樣,即,將彈性項目的初始寬度設置爲零(嗯?沒有寬度?),伸展項目以填滿可用空間,而且最後只要有可能就收縮項目。
彈性項目沒有寬度,那麼寬度該如何計算呢?
這個時候 flex-grow
值就起做用了,它決定彈性項目變寬的程度。由它來負責沒有寬度的問題。
當有多個彈性項目,而且其初始寬度 flex-basis
被設置爲基於零的任何值時,好比 0px
,使用這種 flex
簡寫更實用。
實際發生的是,彈性項目的寬度被根據 flex-grow
值的比例來計算。
考慮以下兩個列表項標記及 CSS:
<ul> <li>I am One</li> <li>I am Two</li> </ul> <style> /* 聲明父元素爲flex容器 */ ul { display:flex; border: 1px solid red; padding: 0; list-style: none; } li { background-color: #8cacea; height: 100px; margin: 8px; padding: 10px; /* flex-basis: 150px; */ } /* 第一個彈性項目 */ li:nth-child(1) { flex: 2 1 0; /* 與寫成 flex: 2 相同*/ } /* 第二個彈性項目 */ li:nth-child(2){ flex: 1 1 0; background-color: #8cacea; } </style>
記住設置 flex-grow : 1
,會讓彈性項目填滿可用空間。伸展開關打開了。
這裏有兩個彈性項目。一個的 flex-grow
屬性值是 1
,另外一個是 2
,那麼會出現啥狀況呢?
兩個項目上的伸展開關都打開了。不過,伸展度是不一樣的,1
和 2
。
兩者都會填滿可用空間,不過是按比例的。
它是這樣工做的:前一個佔 1/3
的可用空間,後一個佔 2/3
的可用空間。
即便兩個彈性項目內容同樣大(近似),它們所佔空間仍是不一樣。寬度不是基於內容的大小,而是伸展值。一個是另外一個的約兩倍。
前面瞭解了一些基本概念,但重要的是要澄清一些重要的概念。那絕對和相對Flex項目之間到底有啥區別呢?兩者之間主要的區別在於間距及如何計算間距。
一個相對Flex項目內的間距是根據它的內容大小來計算的。而在絕對Flex項目中,只根據 flex
屬性來計算,而不是內容。
考慮以下的標記:
<ul> <li> This is just some random text to buttress the point being explained. Some more random text to buttress the point being explained. </li> <li>This is just a shorter random text.</li> </ul>
兩個列表項元素,一個比另外一個的文本多得多。
加點樣式:
ul { display: flex; /*觸發彈性盒*/ } li { flex: auto; /*記住這與 flex: 1 1 auto; 相同*/ border: 2px solid red; margin: 2em; }
以下是結果:
若是你已經忘了的話,flex: 1 1 auto
是與 flex-grow: 1
、flex-shrink: 1
和 flex-basis: auto
相同的。
Flex項目的初始寬度是被自動計算的(flex-basis: auto
),而後會伸展以適應可用空間(flex-grow: 1
)。
當Flex項目由於被設置爲 flex-basis: auto
,而致使寬度被自動計算時,是基於Flex項目內包含的內容的大小而計算。
上面示例中Flex項目的內容大小不相同。所以,Flex項目的大小就會不相等。
既然各個寬度開始就不是相等的(它是基於內容的),那麼當項目伸展時,寬度也保持不相等。
能夠試試讓兩個li的內容相同再試試。
上面示例中的Flex項目是相對Flex項目。
下面咱們把Flex項目變成絕對的, 就是說此次它們的寬度是基於 flex
屬性,而不是內容的大小。一行代碼就能夠出奇蹟。
li { flex: 1 ; /*與 flex: 1 1 0 相同*/ }
效果以下:
此次看到兩個Flex項目的寬度相同了嗎?
Flex項目的初始寬度是零(flex-basis: 0
),而且它們會伸展以適應可用空間。當有兩到多個Flex項目的 flex-basis
取值爲0
時,它們會基於 flex-grow
值共享可用空間。
如今寬度不會基於內容大小而計算,而是基於指定的 flex
屬性值來計算。
絕對Flex項目的寬度只基於 flex
屬性,而相對Flex項目的寬度基於初始內容大小。
小心Flex項目上的 margin: auto
對齊。當在Flex項目上使用 margin: auto
時,事情看起來就很怪異了。
你須要理解會發生什麼。它會致使不可預料的結果,不過我打算解釋解釋。
當在Flex項目上使用 margin: auto
時,值爲 auto
的方向(左、右或者兩者都是)會佔據全部剩餘空間。
這玩意有點難理解。下面我來講明一下。
考慮以下的導航欄標記以及 CSS 樣式:
<ul> <li>Branding</li> <li>Home</li> <li>Services</li> <li>About</li> <li>Contact</li> </ul> <style> /* 聲明父元素爲flex容器 */ ul { display:flex; border: 1px solid red; padding: 0; list-style: none; } li { background-color: #8cacea; margin: 8px; padding: 10px; flex: 0 0 auto; border: 2px solid red; } </style>
你能夠看到以下的效果:
這裏有幾件事情要注意:
flex-grow
值爲設置爲0
。這就解釋了爲何列表項不會伸展。
如今在第一個列表項(branding)上使用 margin: auto
,看看會出啥狀況。
li:nth-child(1) { margin-right: auto; /*只應用到右外邊距*/ }
剛剛發生了什麼?以前的剩餘空間如今已經被分配到第一個Flex項目的右邊了。
還記得我前面說的話吧?當在Flex項目上使用 margin: auto
時,值爲 auto
的方向(左、右或者兩者都是)會佔據全部剩餘空間。
若是想讓一個Flex項目的兩邊都用自動外邊距對齊,該怎麼辦呢?
/* 若是願意的話,也能夠用 margin 簡寫來設置兩個邊 */ li:nth-child(1) { margin-left: auto; margin-right: auto }
如今空白被分配到Flex項目的兩邊了。
那麼,這是否是對很酷的自動外邊距對齊的一種折衷方案呢?看起來是。若是沒注意的話,它也多是受挫之源。當在一個Flex項目上使用自動外邊距(margin: auto
)時,justify-content
屬性就不起做用了。
例如,在上面的Flex容器上經過 justify-content
屬性,設置不一樣的對齊選項時,對佈局沒有影響。
ul { justify-content: flex-end; }
導航系統是每一個網站或者應用程序的重要組成部分。這個世界上的每一個網站都會有某種導航系統。
下面咱們看看這些熱門網站,以及它們是如何實現其導航系統的。你看到Flexbox是如何幫助你更高效地建立這些佈局嗎?
也仔細看看哪裏會用得上自動外邊距特性。
建議你本身寫代碼。試着本身實現這些導航系統。
還記得我說過默認的Main-Axis方向是從左到右,Cross-Axis方向是從上到下吧?
好吧,如今你也能夠改變這個方向。
正如在較早的小節中所描述的那樣,用 flex-direction: column
時,確實是這樣。
當用 flex-direction: column
時,Main-Axis和Cross-Axis會向以下所看到的那樣改變:
若是曾用英語寫過文字,那麼你就知道英語是從左到右,從上到下來寫的。
Flexbox的默認Main-Axis和Cross-Axis也是採用一樣的方向。
不過,若是將 flex-direction
切換爲 column
,它就再也不遵循英語的範式,而是日語的範式!
是的,日語。
若是你用日語寫過文字,那麼應該很熟悉了。(鄭重聲明,我從沒用過日語寫過文字)。
日文一般是從上到下寫的!沒那麼怪,對吧?
這就解釋了爲嘛這對英語寫做者可能有點惱火。
看看下面這個例子。標準無序列表(ul
),帶有 3
個列表項(li
)。不過此次我要改變一下flex-direction
。
<ul> <li></li> <li></li> <li></li> </ul> <style> /* 聲明父元素爲flex容器 */ ul { display:flex; border: 1px solid red; padding: 0; list-style: none; flex-direction: column; } li { background-color: #8cacea; margin: 8px; padding: 10px; flex: 0 0 auto; border: 2px solid red; } </style>
以下是方向變化以前的樣子:
以下是方向變化以後的樣子:
如今文字是以日語風格寫的:沿Main-Axis從上到下。
你會看到項目的寬度填滿了空間,對吧?
若是在以前要變成這樣子,得處理 flex-basis
以及 flex-grow
屬性。
下面來看看這些會如何影響新的佈局。
li { flex-basis: 100px; }
下面是你會獲得的。
什麼?高度是被影響了,可是寬度沒有啊?我以前說過,flex-basis
屬性定義每一個Flex項目的初始寬度。
在切換 flex-direction
時,請注意,影響Main-Axis的每個屬性如今會影響新Main-Axis。像 flex-basis
這種會影響Main-Axis上Flex項目寬度的屬性,如今會影響項目的高度,而不是寬度。
方向已經被切換了!
因此,即便你使用 flex-grow
屬性,它也是影響高度。本質上,每一個做用於橫向軸(即Main-Axis)上的 flex 屬性,如今都會做用於縱向上的新Main-Axis。它只是在方向上的一個切換。
這裏再來一個例子。我發誓在這個例子以後你會有更好的理解。減小以前看到過的Flex項目的寬度,它們就再也不填滿整個空間了:
li { width: 200px; }
若是想把列表項移到屏幕中間該怎麼辦呢?
在英語中,這是你到目前爲止處理彈性容器的方式。就是說, 把Flex項目移到Main-Axis的中間 。
因此,你會用 justify-content: center
。可是這樣作不起做用。由於方向變了,中心是沿着Cross-Axis,而不是Main-Axis。
再來看看:
因此請用日語文字來思考。Main-Axis是從上到下,你不須要這樣。Cross-Axis是從左到右。貌似是你所要的。
你須要 把Flex項目移到Cross-Axis的中間 。這裏想起哪一個Flex容器屬性了麼?
是的,align-items
屬性。align-items
屬性處理Cross-Axis上的對齊。
因此要把這些項目移到中間,得這樣作:
li { align-items: center; }
瞧瞧!Flex項目已經居中了吧。