CSS3 彈性框(Flexible Box 或 Flexbox),是一種當頁面需要適應不同的屏幕大小以及設備類型時確保元素擁有恰當排布行為的布局方式。對很多應用程序來說,由于不使用浮動,且彈性容器的外邊距也不會與其內(nèi)容的外邊距合并,彈性框模型比起方框模型要好一些。 許多設計師會發(fā)現(xiàn)彈性框模型易于使用。彈性框中的子元素可以在各個方向上進行布局,并且能以彈性尺寸來適應顯示空間。由于元素的顯示順序與它們在源代碼中的順序無關,定位子元素變得更容易,并且能夠用更簡單清晰的代碼來完成復雜的布局。這種無關性是特意限制于視覺呈現(xiàn)上的,語音順序以及基于源代碼順序的導航均不受影響。 注意: 雖然 CSS 彈性框布局規(guī)范 還處于最終征求意見稿 (Last Call Working Draft)階段(參見最新編輯草案),并非所有瀏覽器都實現(xiàn)了彈性框的所有功能。但,這么說吧,現(xiàn)在全線產(chǎn)品對彈性框都有良好支持。最新的兼容性狀況可以查看每個具體屬性的兼容性表格獲取。 彈性框概念彈性布局在定義方面是指調(diào)整其內(nèi)項目寬高從而在任何顯示設備上實現(xiàn)對可用顯示空間最佳填充的能力。彈性容器擴展其內(nèi)項目來填充可用空間,或將其收縮來避免溢出。 彈性框布局算法是方向無關的,與此相對的,塊級布局側重于垂直方向、行內(nèi)布局側重于水平方向。雖然塊級布局用于頁面行之有效,但其仍缺乏足夠的定義來支持那些必須隨用戶代理(user agent)不同或設備方向從水平轉為垂直等各種變化而變換方向、調(diào)整大小、拉伸、收縮的應用程序組件。 彈性框布局主要適用于應用程序的組件及小規(guī)模的布局,而(新興的)網(wǎng)格布局則針對大規(guī)模的布局。這二者都是 CSS 工作組為在不同用戶代理、不同書寫模式和其他靈活性要求下的網(wǎng)頁應用程序有更好的互操作性而做出的更廣泛的努力的一部分。 彈性框相關詞匯表關于彈性框的討論已經(jīng)從諸如水平/行內(nèi)軸和垂直/塊級軸這些術語中解放出來,與此同時,需要有一套新的術語來正確描述此模型。在學習下面的詞匯項目時請對照下圖。圖中是一個
指派彈性框為要使用此樣式的元素指派 CSS,需按以下方式設置 display 屬性: display : flex 或者 display : inline-flex 這樣做將元素定義為彈性容器,其子元素則成為彈性項目。值 注意:廠商前綴標記應當附加給 display 屬性值,而不是加給 display 屬性本身。例如: display : -webkit-flex 。彈性項目須知彈性容器直接包含的文本將自動包覆成匿名彈性項目。不過,只包含空白的彈性項目不會被渲染,就如同對其指派 對于彈性容器的絕對定位子元素來說,其靜態(tài)位置參照彈性容器的內(nèi)容框的主起始角確定,而后依此完成此元素的定位。 相鄰的彈性元素其外邊距不會互相合并。使用
不像 CSS 中的其他對齊方法,彈性框的對齊屬性將進行“真正的”居中對齊。這意味著即使彈性條目溢出了彈性容器,它依然保持居中。不過這在某些時候可能會有問題。如果溢出超過了頁面的上邊緣或左邊緣(在從左到右的語言中,比如英語;在諸如阿拉伯語這樣從右到左的語言中這個問題出現(xiàn)在右邊緣),則雖然那些地方確實有內(nèi)容,卻無法滾動到那些位置。在未來的發(fā)布版本里,對齊屬性將會有所擴展,使其包含有“安全”選項。目前,如果操心這點,可以改用外邊距來達成居中效果,因為外邊距會用比較“安全”的方式來響應變化,出現(xiàn)溢出時將停止居中。對需要居中的彈性項目應用自動外邊距來替代 重新提一下,元素的顯示順序與它們在源代碼中的順序無關,這種無關性只影響視覺呈現(xiàn),語音順序以及基于源代碼順序的導航均不受影響。 彈性框相關屬性不影響彈性框的屬性由于彈性框使用了不同的布局算法,某些屬性用在彈性容器上沒有意義:
示例基本的彈性布局示例這個基本的示例展示了如何對元素應用彈性布局,以及在彈性布局狀態(tài)下相鄰元素的行為方式。 html lang='en'> head> style> .flex { /* 基本樣式 */ width: 350px; height: 200px; border: 1px solid #555; font: 14px Arial; /* 建立彈性框 */ display: -webkit-flex; -webkit-flex-direction: row; display: flex; flex-direction: row; } .flex > div { -webkit-flex: 1 1 auto; flex: 1 1 auto; width: 30px; /* 讓過渡表現(xiàn)良好。(從/到'width:auto'的過渡 至少在 Gecko 和 Webkit 上是有 bug 的。 更多信息參見 http:///731886 ) */ -webkit-transition: width 0.7s ease-out; transition: width 0.7s ease-out; } /* colors */ .flex > div:nth-child(1){ background : #009246; } .flex > div:nth-child(2){ background : #F1F2F1; } .flex > div:nth-child(3){ background : #CE2B37; } .flex > div:hover { width: 200px; } style> head> body> p>Flexbox nuovop> div class='flex'> div>unodiv> div>duediv> div>trediv> div> body>html> 圣杯布局示例此示例展示了彈性框根據(jù)不同屏幕分辨率動態(tài)改變布局的能力。下圖說明了這種轉換。 這里展示的正是針對瀏覽器窗口的頁面布局必須為智能手機窗口優(yōu)化的場景。不僅元素的尺寸需要縮減,其呈現(xiàn)順序也需要改變。彈性框讓這變得很簡單。 html lang='en'> head> style> body { font: 24px Helvetica; background: #999999; } #main { min-height: 800px; margin: 0px; padding: 0px; display: -webkit-flex; display: flex; -webkit-flex-flow: row; flex-flow: row; } #main > article { margin: 4px; padding: 5px; border: 1px solid #cccc33; border-radius: 7pt; background: #dddd88; -webkit-flex: 3 1 60%; flex: 3 1 60%; -webkit-order: 2; order: 2; } #main > nav { margin: 4px; padding: 5px; border: 1px solid #8888bb; border-radius: 7pt; background: #ccccff; -webkit-flex: 1 6 20%; flex: 1 6 20%; -webkit-order: 1; order: 1; } #main > aside { margin: 4px; padding: 5px; border: 1px solid #8888bb; border-radius: 7pt; background: #ccccff; -webkit-flex: 1 6 20%; flex: 1 6 20%; -webkit-order: 3; order: 3; } header, footer { display: block; margin: 4px; padding: 5px; min-height: 100px; border: 1px solid #eebb55; border-radius: 7pt; background: #ffeebb; } /* 窄到已不足以支持三欄 */ @media all and (max-width: 640px) { #main, #page { -webkit-flex-flow: column; flex-direction: column; } #main > article, #main > nav, #main > aside { /* 恢復到文檔內(nèi)的自然順序 */ -webkit-order: 0; order: 0; } #main > nav, #main > aside, header, footer { min-height: 50px; max-height: 50px; } } style> head> body> header>headerheader> div id='main'> article>articlearticle> nav>navnav> aside>asideaside> div> footer>footerfooter> body>html> 試驗場有幾個在線彈性框試驗場可以進行各種實驗: 務必牢記描述彈性項目如何排布的算法有時會極其棘手。在使用彈性框進行設計時,請考慮以下幾點,以免碰到不好的意料外狀況。 彈性框的排布與書寫模式是一致的,這意味著排布的主軸起點和主軸終點根據(jù)的是開始與結束的位置。 側軸起點與側軸終點依賴于開始或前面的位置定義,而后者依賴于 只要 瀏覽器兼容性[1] Safari 在版本 6.0 (iOS.1)以前支持的是規(guī)范的一個與現(xiàn)有版本不兼容的舊版草案。Safari 6.1(以及 iOS 7 上的 Safari)已更新為支持最終版本。 [2] 直到 Firefox 22 位置,用戶必須修改 [3] Internet Explorer 10 支持的是規(guī)范的一個與現(xiàn)有版本不兼容的舊版草案;Internet Explorer 11 已更新為 支持最終版本。 [4] Android 瀏覽器直到 4.3 為止支持的是規(guī)范的一個與現(xiàn)有版本不兼容的舊版草案。Android 4.4 已更新為支持最終版本。 [5] 在 Opera 12.10 的 [6] 直到 Firefox 29 為止,在彈性項目上指定 參見
|
|