【前端知識】Flexbox,更優雅的布局

2021-02-19 GitCafe

上個周末,在北航新主樓會議廳裡舉行了首屆 CSS 開發者大會,GitCafe 的前端工程師 Jaych Su 在會上做了演講,與大家分享了一款更優雅的前端布局——Flexbox。現在,我們就邀請他來為大家講一下 Flexbox 的相關知識吧~


在設計的眼中,排版的操作是一件很簡單的事情,靠左、置中、靠右,我只要點一下,所有元素,就會乖乖的到指定的位置。


但到了前端在排版的實現上,就不是這樣了。


我們常常得用一堆其實本來不是這樣用的屬性來做 hack,比如說用 line-height 來做垂直置中,這樣做的確能達到效果,但是在語意上就有點不順,拿剛剛提到的 line-height 來說,這本來是用來當作段落中的行距,但卻因為這個屬性能擴展文字的上下空間,結果也被拿來做垂直置中。那有沒有一個方法能用來更好地實現 Web 布局呢?


這是 Google 的 Angular。他們幾個月前做了一套 UI 來實現在 Angular 上的 Material Design。這套框架用來實現布局的方式,不是以往的 float,而是用了 Flexbox。

Flexbox 是什麼呢?就 W3C 官方給到的解釋是,這是設計來實現更複雜的版面布局。那我自己對他的定義是,Flexbox 從本質上就是一個 Box-model 的延伸,我們都知道 Box-model 定義了一個元素的盒模型,然而 Flexbox 更進一步的去規範了這些盒模型之間彼此的相對關係。而不需要去用一些很 cheat 的做法,去 hack 一些本來其實不應該用來做版面布局的屬性。


身為一個喜歡去玩一些新東西的前端,應該說每個跟網際網路有所接觸的人,都需要去學新東西。


這是我碰到新東西的時候,一定會問自己的三個問題:
1. 這能做什麼?也就是他能解決什麼問題?
2. 能用在哪裡?在哪些地方能用這個方法?
3. 為什麼能用?他實現所用到的邏輯是什麼?

接下來就跟大家分享一下,當初看到 Flexbox 的我問了自己這個三個問題之後,到目前為止我找到的答案。

舉一個例子,所有前端都會有的痛點,置中,我們以前是怎麼實現的?


最常看到就是用絕對定位,然後把 top 和 left 偏移 五零%,在用 margin 偏移回去。但是這隻適用在已經固定大小的元素。


最近幾年常看到的做法是這樣,在想置中的元素之前,加上一個元素,不想管太舊的 IE 的話,甚至偽元素也可以。在容器用 text-align,然後把底下的兩個元素弄成 inline 的形式,在用 vertical-align。他的好處就是,即使底下的元素會隨內容改變大小,但不管怎麼改變,就是可以始終維持垂直和水平置中。


當然啦,還有很多置中的方法,就不一一介紹了,我們來看一下用 flex 的話怎麼置中。

用 Flex 來做置中的話,你可以很從容地做到置中,不用一堆即使本來不是這樣用的屬性。我只要先指定容器為一個 Flex 容器,然後 justify-content 讓他水平方向置中,再 align-items 讓他垂直方向置中。我可以很簡單很優雅的就做到置中。


那也許你會說,欸?既然一個可以的話,那我再多放幾個可不可以?其實可以的。


假設我們現在容器底下有三個元素,喔,這裡就要提到 Flexbox 另外一個屌炸天的功能。


假設一個元素是四零%,另一個是一二%,那在一個 Flex 容器中,只要你有設定 flex-grow 這項屬性的話,他的第三個元素就會自適應寬度,填滿剩下容器的空白。而在多個元素的狀態之下,我們仍然能很輕易的就置中。


剛剛我們提到過,flexbox 是用來規範盒模型之間的相對關係,從這裡你就可以看到。現在我將 justify-content 設成 space-around,元素就會變成已分散對齊的方式去分佈在 flex 容器中。


關於元素的分步,我們再來看幾個例子。

這是一個我最近看到的網站。我們可以看到他底下有一個 Slider,這有個問題,而且也常常是前端在版面上的一個痛點,我們想讓所有的子元素能夠等高。在以前我們很難只用 CSS 去做到這樣。


而 flexbox 可以很輕易地只用 CSS 做到這點。只需要在 flex 容器加上 align-items 就好。就能實現容器底下的所有元素,與最高的那個元素等高。


即使我在本來最高的那個元素多加一些內容,其他的元素也一定會維持等高。

Flex 最初被 W3C 於 09 年制定出來,隨後就被大量的討論。拿指定元素為一個 flex 容器來講,第一個版本裡是 display:box,第二個版本是 display: flexbox,第三個版本是 display: flex。實在太複雜,還好現在在開源的世界裡已經有大大把這三個版本的 flex 做成一些 mixin,使用的時候,你只要 include 進來就可以。



就跟 IE 的使用體驗一樣,所有的好東西跟 IE 基本都沾不上邊,所以如果你需要考慮 IE 用戶,那請慎入。所以有人說 IE 的功能只剩下用來下載 Chrome 和 Firefox。

如果你到網上搜 flex,大多都會著墨在 他的對齊、他的控制 DOM 順序是如何如何好用。但今天我們想聊一聊更深一點的東西,flex item 寬度的計算,大多數情況下,我們只在意顯示的比例,這也是寬度的計算比較少被討論的原因,但如果你想要更精確的控制 item 的顯示寬度,其實你是需要去了解,在一個 flex 容器當中,item 的寬度是如何被計算出來的。



當我們把一個容器指定為 flex 容器時,它裡面的 item 其實是有著這樣的設定:flex: 0 1 auto

這三個數字其實分別代表:flex-grow、flex-shrink、flex-basis,這三個屬性可以說是 flex 之所以智能的原因。


我們先來聊聊 flex-basis 好了,這個屬性在 flex 容器為橫向的時候,其實就是寬度,當我們把 item 指定成 flex: 0 0 480px 時,其實就是把它的寬度設定成 480px。但是這樣並不能表現出 flex 有什麼特別的地方啊?為什麼要重複設定寬度?

這時候就要講到另外兩個屬性:flex-grow、flex-shrink

這兩個屬性其實是雙胞胎,grow 表示在 item 總寬度比容器小的時候,為了讓 item 填滿容器,每個 item 增加的寬度。假設有三個 basis 為 100px 的 item。我們從左到右給予 grow 值分別為 3、2、1,那麼當 flex 作用之後,最左邊的 item 實際增加的寬度是多少?從圖中可以算到增加的寬度是 90px,於是最後最左邊 item 的寬度是 190px。


我們剛才提到 grow 跟 shrink 其實是雙胞胎,其實他們真的很像,shrink 表示在 item 總寬度比容器大的時候,為了讓 item 填滿容器,每個 item 減少的寬度。但是計算的公式卻是不一樣的。為什麼?因為當你在加的時候無所謂,但是在減的時候,如果只計算賦予的 shrink 值,那麼很有可能最後減少的寬度比 basis 大,於是 item 的寬度就變成負值。那我們該怎麼修正?把 basis 當成參數計算進去,這樣就能保證減少的寬度永遠小於 basis。所以我們可以得到修正後的公式,一樣以最左邊為例子,最後計算出來減少 60px,於是 item 就變成 140px。以上腦子不好使,沒關係,實際上最常用的只是 flex: 1。

講到這裡,你剛剛講的好像這東西很厲害的樣子,那你有沒有一個最快最簡單粗暴的方式去說 Flexbox 真的是個好東西?

嗯⋯⋯有點難,不過我想應該可以。


請點擊【閱讀原文】進入 slides 在 GitCafe 上的開源地址,歡迎大家下載並與我們交流~

相關焦點

  • 前端知識-概念篇
    瀏覽器對頁面進行渲染呈現給用戶2、對前端工程師這個職位你是怎麼樣理解的?a. 前端是最貼近用戶的程式設計師,前端的能力就是能讓產品從 90分進化到 100 分,甚至更好b.針對伺服器的優化、擁抱最新前端技術。
  • 平面設計、UI設計、Web前端有什麼不同?薪資水平如何?
    跟UI設計比,雖然也需要承擔一些跟布局排版相關的工作,但更多是在用技術實現。平面設計:需具備圖像處理、繪製、圖文排版布局基礎的視覺設計技能,熟練使用PS、AI、In、Coreldraw等圖形設計軟體,有創意能力,能把控設計作品的風格、色調搭配、布局合理性等;根據不同的行業,可能會有不同細節要求,如有的平面設計會跟印刷廠對接,就要了解印刷相關的設計輸出規範等內容。
  • 為什麼2017年Web前端開發工程師薪資越來越高?
    原因二:對前端,普遍存在巨大的誤解,其實前端一點也不簡單大多人都認為前端開發是一個「相對於其他模塊來說更簡單的領域」,在他們心中的前端工程師是這樣工作的:、代碼質量、產品標準;6、調節Web應用程式的樣式,包括間距、字體、標題、圖標、布局等等;7、根據不同解析度、橫屏豎屏等,調節Web應用程式的樣式;8、標記 Web 應用程式,使之語義化,SEO 友好;9、通過API獲取內容要考慮友好性、電池消耗性、設備和客戶端的特性;10、開發客戶端要考慮動畫的流暢、延遲加載、交互、應用工作流程,大多數時間用來考慮漸進增強和向後兼容的標準
  • 前端進階:css必知的幾個底層知識和技巧
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫學習方法推薦問題學習法:帶著問題去學習,有利於集中注意力,目的明確,這既是有意學習的要求,也是發現學習的必要條件
  • 【專欄試讀】(02)初次接觸前端,我們要理解哪些名詞?| Web 前置知識
    前言:在上一篇《老生常談的從 URL 輸入到頁面展現背後發生的事》中,我們了解了從輸入到輸出背後到底發生了什麼,也初步認知到「前端」在這個過程中扮演了什麼角色。這一篇,我們就正式從名詞解釋開始,慢慢推開「前端」這扇大門。以下系列文章先從「Web 前端開發」談起。因此,所說的「前端」都指「Web 前端開發」。
  • Chrome72 嵌套 flex 布局修改,你的網站可能會發生布局錯亂
    起源2019 年 1 月 29 日,Chrome72 正式版(72.0.3626.81)發布,本次發布帶來了一個改變,且沒有在更新日誌中提及,該改變導致某些網站發生了布局錯亂
  • 免費送書 | 《瘋狂前端開發講義-jQuery+AngularJS+Bootstrap前端開發實戰》
    送去知識和好運!《瘋狂前端開發講義-jQuery+AngularJS+Bootstrap前端開發實戰》截止至2018年 2 月 1 號 12點前,精選留言被點讚最多的前3名用戶將獲得此書。圍繞真正輕量級的AngularJS進行講解適合熟悉JS的前端開發者Bootstrap採用最新版本一本書搞定前端開發
  • 前端工程師主要做什麼?你了解Web前端開發工程師嗎-開課吧
    前端開發顧名思義就是頁面的設計,代碼的實現。零基礎學Web前端前端主要是負責頁面的設計,比如我們看到的手機界面、網頁等,能看到的都離不開前端的努力,學習起來是比較簡單的,因為界面的編程可以直接看到編程的結果,有什麼問題可以及時看到並修改
  • 前端行業內幕:「打工人」的真實寫照!
    只看重眼前的得失,不知道在行業裡多掌握一點技術和信息,從長遠看,比當下的那點工資更重要。當你的身上不具備超出旁人的能力,還沒有向上生長的努力,更看不到創造價值的希望,那麼你的老闆,也會嫌你「不值錢」。正如近些年,網上卻一直充斥著「前端飽和了」、「前端熱度降低了」、「前端工作沒有那麼好找了」。
  • 為什麼那麼多自學WEB前端的人後來都放棄了?
    先是聽說前端技術門檻低,就業機會多,於是開始各種打聽,道聽途說,覺得學習前端太容易了,不就是設計頁面,html,css嘛,沒技術含量。於是在沒有對前端知識有一個客觀系統的認知下,就貿然開始自學。自學方法無非是網上找資料,看教學視頻,看到什麼學什麼,碎片化學習,跟裝垃圾一樣,一股腦地往自己腦袋裡裝各種所謂的「前端技巧」、「前端高手經驗」之類的碎片知識。這樣的學習方法,嚴重分散了你的學習焦點,該學的沒學到,學習結果一塌糊塗。
  • 前端設計-JavaScript簡單數字時鐘開發實例
    簡單數字時鐘開發實例藉助於JavaScript window對象所提供的計時觸發函數setInterval可以實現前端動畫效果的設計與製作。主要設計階段如下:1、整體HTML頁面布局設置這個階段主要完成時鐘構成的8個DIV的布局設計,為下一步顯示時鐘提供基礎。本例DIV整體布局設計樣式效果如下:
  • 讓你見識一下什麼叫最完整、最系統的前端學習路線
    根據開發者生態系統 2018 的調查數據,排名前三的程式語言分別是:Java (72%)、JavaScript (41%)、Python (36%) js是前端的核心,不會js更別說會前端,從2012年至今,「Web前端工程師」的需求持續走高,薪酬也是水漲船高,所以,有不少人立志要成為前端開發工程師。
  • 中國航信重慶研發中心IOS、Andorid、初級JAVA開發 、前端開發、軟體測試崗位
    任職要求:1.計算機相關專業本科及以上學歷,兩年以上項目經驗;2.熟悉Java、Kotlin語言,具備良好的編碼風格;3.熟悉android UI框架、線程、進程特性,熟悉android性能指標、監控工具及調優方法,有系統化的知識體系;4.熟悉MVVM、Jetpack、DataBinding、ObjectBox 、Dagger;
  • 專訪|百度高級前端開發工程師@葉小釵
    今天我們來看看百度高級前端開發工程師@葉小釵的前端之旅。但是當時找實習工作時候發現.net好像大公司不太招,於是就開始看資料庫的底層設計想走深度(現在看來這個事情太二了),結果發現確實看不懂,當時覺得伺服器的水實在太深了,就開始質疑自己的選擇是否正確,於是選擇了前端。很多年以後,看見前端的發展速度,小釵突然醒悟,原來前端的水似乎也很深啊! 3)有了解到你的博客,對技術的分解很有深度,你是如何去發現這種問題?
  • 前端超級實用的在線工具以及進階資料推薦!
    在線地址:https://caniuse.com/一個強力推薦的網站:這個網站包含了中文和英文的開源書籍(建議多看英文版本,資源和知識更豐富)。在線地址:http://jsbeautifier.org/木易楊前端進階一個前端進階的網站,包含了很多面試題以及前端基礎知識的講解。
  • 開課吧前端課程怎麼樣,學員真實職業「上升通道」搭建過程
    開課吧前端課程,開課吧Web前端2017年,北京化工大學碩士畢業後,王亮(化名)順利地進入了一家國企的網際網路部門工作,這份工作不僅收入穩定,可以解決北京市戶口,還能讓他有較多的業餘時間。正如王亮(化名)自己的話說,按照目前的知識儲備足以應對現在的工作,之所以學習,就是為了給未來3~5年或者5~10年打基礎。讓我們來捋一捋王亮(化名)職業「上升通道」的邏輯是怎樣的。他平常工作時的常用工具語言是Web和Java,雖然大學時的專業並不是計算機,但通過不斷的學習和幾年的工作實踐,王亮(化名)已經具備了一定水平的代碼能力。
  • 住在北歐小宅 生活更優雅
    這是一套建築面積88m 北歐兩居室,小平米的空間十分考驗設計師的功力,如果布局緊湊就會擁擠,但是設計並沒有改變空間布局;從開放式的空間布局設計到配色,都在傳遞生活即簡單,簡單即美的設計哲學;整個開放式的空間,利用白色的電視櫃解決功能性需求、灰色地板與淡藍色背景牆調和著出優雅和大氣,而實木家具從材質到造型都在傳遞北歐設計的溫實樸質
  • 騰訊Web前端大會精彩回顧
    然後是業界工程化先驅,現在在全民直播擔任CTO的張雲龍大神,他毫無保留地將自己在全民直播這樣一家初創公司的前端工程化實踐,介紹給了大家。迷渡分享面向前端的V8 性能優化主會場最後是由V8專家迷渡大神介紹面向前端工程師的V8優化。內容有點深,大家可以多到大會技術交流群裡向他提問題。
  • 10個簡單的技巧讓你的 vue.js 代碼更優雅 - 酷扯兒
    本文轉載自【微信公眾號:前端人,ID:FrontendPeople】,經微信公眾號授權轉載,如需轉載原文作者聯繫前言作為深度代碼潔癖,我們都希望能寫出簡單高效的代碼,讓我們的代碼看起來更加優雅,讓我們拋棄繁雜的代碼,一起開啟簡單的旅程~~slots 新語法向 3.0 看齊使用帶有「#」的新命名插槽縮寫語法,在Vue 2.6.0
  • 前端requestAnimationFrame概述
    與此同時,對DOM結構所做的更改要比瀏覽器渲染的要多,這也被稱為布局抖動,因為這些操作是同步的,會影響網站的性能以及繪製操作,從而導致動畫效果不佳。瀏覽器只在屏幕有樣式更改,布局改動,以及回流時才刷新屏幕此時,需要來自瀏覽器的某種回調函數,他會告訴我們下一次屏幕刷新的時間,或者更準確的說,是下一次繪製操作將在何時執行。