一文詳解三個 flex 屬性對元素的影響
在開發的時候常用flex 這個屬性作用於彈性盒子的子元素,例如:flex:1
或flex: 1 1 auto
,那麼這個屬性到底控制了元素怎麼的行為呢? flex:1
又究竟是什麼意義呢?讓這篇文章帶你徹底了解 flex 屬性吧! 【推薦學習:css影片教學】
首先我們需要了解,flex 是三個屬性flex-grow
、flex-shrink
、 flex-basis
的簡寫,可以使用一個、兩個、或三個值來指定flex 屬性。具體語法可以參考MDN-flex
接下來我們逐一拆解這三個屬性對元素的影響
flex-basis
flex-basis 定義了空間分配發生之前初始化flex 子元素的尺寸,屬性預設值auto
; flex 子元素未伸張和收縮之前,它的大小是多少。
如果 flex-basis 設定為 auto , 瀏覽器會先檢查 flex 子元素的主尺寸是否設定了 flex 子元素的初始值。
比如說你已經給你的 flex 子元素設定了 150px 的寬,則 150px 就是這個 flex 子元素的 flex-basis;如果沒有設置,則 auto 會解析為其內容的大小。這個例子中,給第一個元素設定寬度150px,第二、三個元素不設定寬度。
:first-child { width: 150px; }
效果如下:
如果你想 flexbox 完全忽略 flex 子元素的尺寸就設定 flex-basis 為 0。這樣就算元素一設定了寬度,它最終的寬度也是內容寬度。
正負自由空間
#在介紹剩下兩個屬性前先看兩個概念positive free space
正向自由空間與negative free space
反向自由空間:
-
#正向自由空間
比如說,現在有500px寬的flex 容器,flex-direction 屬性值為row, 三個100px 寬的flex 子元素, 那麼沒有被填充的200px 的就是正向自由空間(positive free space)。
-
反向自由空間
當子元素的寬度總和大於容器寬度時,溢出的尺寸100px就是反向自由空間。
那麼用什麼屬性來指派正負自由空間呢?
flex-grow
-
flex-grow
預設值0
,若被賦值為正整數, flex 元素會以flex-basis 為基礎,沿著主軸方向增長尺寸,並佔據可用空間。 flex-grow 按比例分配成長空間。
初始狀態:我們給三個元素都設定寬度,且總和不大於主軸寬度
.flex-grow-father { width: 500px; div:nth-child(1) { width: 50px; } div:nth-child(2) { width: 100px; } div:nth-child(3) { width: 150px; } }
增加的宽度计算方法:假设元素的 flex-grow
值为 x
,正向自由空间宽度为l,则每个元素增加的宽度=,元素最终宽度 = ;
- 相同比例增长:当给每个子元素的都设定相同的 flex-grow 值,每个元素就会增长相同的宽度
.with-same-flex-grow { * { flex-grow: 1; } }
效果如下:
本例中第一個元素寬度的計算x
#5######0######## ####=########################1######1######6####### .######6######7######p######x##############;###第二个元素宽度宽度计算 ;
第三个同理为
- 不同比例增长:给每个子元素的都设定不同的 flex-grow 值
.with-different-flex-grow { div:nth-child(1) { flex-grow: 2; } div:nth-child(2) { flex-grow: 1; } div:nth-child(3) { flex-grow: 1; } }
效果如下:
本例中第一個元素寬度的計算0
### ###=########################1#######5######0#######p ######x###############;###第二个元素宽度的计算;
第三个同理是
- 如果想让开始时尺寸不同的元素内容宽度相等(平分容器宽度),可以将 flex-basis 设置为 0(完全忽略 flex 子元素的尺寸) flex-grow 为 1(等比例分配)
.average { * { /* flex: 1 1 0; */ flex-basis: 0; flex-grow: 1; } }
效果如下:
flex-shrink
flex-shrink 属性指定了 flex 元素的缩小值,默认值为 1
; 它确定在分配 negative free space 时,flex 子元素相对于 flex 容器中其余 flex 子元素收缩的程度。默认值 1。用于减少盒子空间使盒子适应容器而不溢出(为了避免 border 干扰去掉边框)
我们给三个元素都设定宽度,并且总和大于主轴宽度;这里我们将元素的flex-shrink值设置为 0 (元素宽度不变,不需要吸收溢出的宽度),目的是观察一下反向自由空间。
.flex-shrink-wrapper { display: flex; div:nth-child(1) { width: 100px; background: gold; } div:nth-child(2) { width: 200px; background: tan; } div:nth-child(3) { width: 300px; background: gold; } } .zero { * { flex-shrink: 0; } }
吸收的寬度計算:假設每個flex-shrink 的值為l
- 给子元素相同的 flex-shrink 值,这里以默认值 1 为例
.with-same-flex-shrink { * { flex-shrink: 1; } }
這時第一個元素的吸收寬度為:0==
######################8#####3### ###.######3######7######p######x##################這時第一個元素的吸收寬度為:#10p #3
######=########################1#####6#### ###6######.######6######7######p#####x################################### ######这时第一个元素的吸收宽度为:,最终元素宽度为
- 给子元素不同的 flex-shrink 值
.with-different-flex-shrink { div:nth-child(1) { flex-shrink: 1; } div:nth-child(2) { flex-shrink: 2; } div:nth-child(3) { flex-shrink: 0; } }
這時第一個元素的吸收寬度為: #20##pp 8#0
###p#####x###### #############這時第二個元素的吸收寬度為:#8##0##p#x#p ##0##p
#xxp
# x##################flex 的简写值
一般我们很少见上述属性单独使用,都是用flex这一个简写属性来表述元素的伸缩。
Flex
简写形式允许你把三个数值按这个顺序书写 flex-grow
,flex-shrink
,flex-basis
。以下是常见的几种取值:
-
flex: initial
的扩展为 0 1 auto (不可放大、可缩小、大小与容器元素大小一致) -
flex: auto
的扩展为 1 1 auto (可放大、可缩小、大小与容器元素大小一致) -
flex: none
的扩展为 0 0 auto (不可放大、不可缩小、大小与容器元素大小一致) -
flex: <positive-number></positive-number>
的扩展为<positive-number> 1 0</positive-number>
flex: <positive-number></positive-number>
的应用:
两栏布局
.two-grid-wrapper { display: flex; margin-top: 20px; height: 200px; .left { width: 200px; background-color: gold; } .right { flex: 1; background-color: tan; } }
效果如下:左侧宽度不变,右侧自适应
三栏布局
.three-grid-wrapper { display: flex; margin-top: 20px; height: 200px; .left { width: 200px; background-color: gold; } .right { width: 200px; background-color: gold; } .center { flex: 1; background-color: tan; } }
效果如下:左右宽度不变,中间自适应
PS.flex 子元素没有 positive free space 就不会增长;没有 negative free space 就不会缩小。
结束语
学习八股文的时候发现自己对flex布局很不熟悉,基本概念都说不上来,只会无脑用,于是去学习,然后就诞生了这篇文章。欢迎指正。
(学习视频分享:web前端)
以上是一文詳解三個 flex 屬性對元素的影響的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

要調整 Bootstrap 中元素大小,可以使用尺寸類,具體包括:調整寬度:.col-、.w-、.mw-調整高度:.h-、.min-h-、.max-h-

在 Bootstrap 中插入圖片有以下幾種方法:直接插入圖片,使用 HTML 的 img 標籤。使用 Bootstrap 圖像組件,可以提供響應式圖片和更多樣式。設置圖片大小,使用 img-fluid 類可以使圖片自適應。設置邊框,使用 img-bordered 類。設置圓角,使用 img-rounded 類。設置陰影,使用 shadow 類。調整圖片大小和位置,使用 CSS 樣式。使用背景圖片,使用 background-image CSS 屬性。

要設置 Bootstrap 框架,需要按照以下步驟:1. 通過 CDN 引用 Bootstrap 文件;2. 下載文件並將其託管在自己的服務器上;3. 在 HTML 中包含 Bootstrap 文件;4. 根據需要編譯 Sass/Less;5. 導入定製文件(可選)。設置完成後,即可使用 Bootstrap 的網格系統、組件和样式創建響應式網站和應用程序。

如何使用 Bootstrap 按鈕?引入 Bootstrap CSS創建按鈕元素並添加 Bootstrap 按鈕類添加按鈕文本

HTML定義網頁結構,CSS負責樣式和佈局,JavaScript賦予動態交互。三者在網頁開發中各司其職,共同構建豐富多彩的網站。

創建 Bootstrap 分割線有兩種方法:使用 標籤,可創建水平分割線。使用 CSS border 屬性,可創建自定義樣式的分割線。

答案:可以使用 Bootstrap 的日期選擇器組件在頁面中查看日期。步驟:引入 Bootstrap 框架。在 HTML 中創建日期選擇器輸入框。 Bootstrap 將自動為選擇器添加樣式。使用 JavaScript 獲取選定的日期。

在 Vue.js 中使用 Bootstrap 分為五個步驟:安裝 Bootstrap。在 main.js 中導入 Bootstrap。直接在模板中使用 Bootstrap 組件。可選:自定義樣式。可選:使用插件。
