一起从头学习Flex
前言
“其實我覺得flex很像現在的人——是適應性很好的生物,在家秋衣秋褲在外香肩外露。flex container看作一個環境或者大佬,flex-item是其中個體或者馬仔。個體如何存在很大程度上取決環境的設定,當然也會有一些出世的人 比如position: absolute; 存在感就有比較酷” —— 燉燉
背景:布局模式
頁面拆開了看,無非是由眾多尺寸各異的box以不同層疊水平和順序組合而成。
CSS2.1定義了下面前4種布局模式,不同的布局模式下box內的渲染規則不同。
| block layout | 塊級布局 | 獨立的渲染區域,與外界無關 |
| inline layout | 行內布局 | 為布局文本設計 |
| table layout | 表格布局 | 在表格格子布局二維數據 |
| positioned layout | 定位布局 | 不考慮文件流中其他元素,布局有非常明確的位置 |
| flex layout | 彈性布局 | 呈現復雜的應用與頁面 |
flex-layout和block-layout非常相似。
塊級布局中一些比較復雜的屬性,比如浮動、多列,在彈性布局中是沒有的;
反過來彈性布局有一些很簡單但厲害的屬性去實現復雜的網頁布局中常見的需求。
flex-container檔案
被接受程度:所有的瀏覽器都支持flexbox(caniuse)
如何成為大佬 flex:display:flex/inline-flex; 分別產生塊級和行內的彈性容器。
flexbox
速記幾個屬性:
flex-flow 子元素排列的方向和是否換行 flex-flow: [<flex-direction> <flex-wrap>]
flex-direction 排列方向和順序(主軸側軸方向決定)
flex-direction: row | row-reverse | column | column-reverse
flex-wrap 主軸個數和排列順序
flex-wrap: nowrap | wrap | wrap-reverse
eg. flex-flow: row || column wrap || row-reverse wrap-reverse
justify-content 安排(決定)子元素在主軸上如何分配空白空間的方式
justify-content: flex-start | flex-end | center | space-between | space-around
align-items 安排(決定)子元素在縱軸上的伸展方式
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
flex-items檔案
- 不參與flex布局,脫離文檔流 (戳)
- align-self: auto/stretch = align:flex-start 默認布局從主軸開始位置放置
- align-self: center 垂直方向居中(chrome遵守了這一規范,IE/FF沒有,戳)
幾個重要屬性:
margins 和 paddings:flex item的margins不會重疊(應該盡量避免使用百分比的margins、paddings,在不同瀏覽器下表現不一樣,目前在IE/FF/Chrome還沒有測試出來差別啦) 百分比的基準是瀏覽器寬度
有order的元素渲染順序會重置,相當于指定特定的子元素出現在什么位置
visibility: collapse 看例子
flex 子元素的彈性
flex: [ <flex-grow> <flex-shrink> <flex-basis>] 詳見flex縮寫探究
margin: auto 會“貪吃”掉所有空白的區域 例子
align-self 單獨設置子元素(包括絕對定位的子元素)在縱軸上的定位方式,可以覆蓋align-items屬性
align-self: auto | flex-start | flex-end | center | baseline | stretch (auto是跟container的flex-items屬性一致)
flex縮寫的探究
flex: [ <flex-grow> <flex-shrink> <flex-basis>]
- flex-grow 默認1 如何分配container中的空白空間,數值決定權重
- flex-shrink 默認1 在空間不夠的時候如何收縮元素
- flex-basis 指定flex-item的默認尺寸 百分比以父級容器寬度為基數計算(Flexbox Tester可以幫助理解flex item寬度的工具網站)
| no declaration | 0 | 1 | auto |
| auto | 1 | 1 | auto |
| 0 | 0 | 1 | 0% |
| 1 | 1 | 1 | 0% |
| none | 0 | 0 | auto |
彈性布局不是塊級布局
為什么你的flexbox不管用
"了解一個人并不代表什么,人是會變的"——《重慶森林》。
放在W3C規范和瀏覽器實現就是“了解一個屬性并不代表什么,瀏覽器實現都是有差異的”。
W3C只是制定了規范,但是遵守程度和實現效果各個瀏覽器是有所差異的。當你清楚你想實現什么效果而使用了對應的屬性卻發現不起作用,那么很可能是瀏覽器的差異造成的。比如上面提到的flex縮寫,IE10的實現是不符合規范的
| (no flex declaration) | flex: 0 1 auto | flex: 0 0 auto |
| flex: 1 | flex: 1 1 0% | flex: 1 0 0px |
| flex: auto | flex: 1 1 auto | flex: 1 0 auto |
| flex: initial | flex: 0 1 auto | flex: 0 0 auto |
另外一個可能不常見但也能體現瀏覽器差異的是,嵌套的彈性容器的baseline不作為其他彈性子元素的對齊參考(可以在Firefox戳例子看看)。
“當你在構建頁面的時候使用了flexbox但是發現他并沒有出現你預想的效果,可以在這里找到答案”——flexbugs
關于flex.css
flex.css就是對flex布局的一種封裝,通過簡潔的屬性設置就能使得它完美的運行在移動端的各種瀏覽器,甚至能運行在ie10+的各種PC端瀏覽器中。是一種類似于標簽屬性聲明的方式,指定flex屬性。
<!-- 設置主軸方向 --> <div class="flexbox" flex="dir: top"> ... </div>復制代碼| dir: top | flex-direction: cloumn |
| main: center | justify-content: center |
| cross: top | align-items: flex-start |
試驗flex布局的工具網站: flexbox playground and code generator
參考
by DDun
總結
以上是生活随笔為你收集整理的一起从头学习Flex的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WebP图片格式,压缩提高28%
- 下一篇: 第二次作业——个人项目实战