一文詳解三個 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##pp8#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工具
Undress AI Tool
免費脫衣圖片
Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片
AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。
Clothoff.io
AI脫衣器
Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!
熱門文章
熱工具
記事本++7.3.1
好用且免費的程式碼編輯器
SublimeText3漢化版
中文版,非常好用
禪工作室 13.0.1
強大的PHP整合開發環境
Dreamweaver CS6
視覺化網頁開發工具
SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)
CSS教程,用於創建加載旋轉器和動畫
Jul 07, 2025 am 12:07 AM
創建CSS加載旋轉器的方法有三種:1.使用邊框的基本旋轉器,通過HTML和CSS實現簡單動畫;2.使用多個點的自定義旋轉器,通過不同延遲時間實現跳動效果;3.在按鈕中添加旋轉器,通過JavaScript切換類來顯示加載狀態。每種方法都強調了設計細節如顏色、大小、可訪問性和性能優化的重要性,以提升用戶體驗。
歐洲虛擬幣交易平台排行榜2025年最新榜單TOP10盤點(最近更新)
Jul 11, 2025 pm 08:57 PM
2025年歐洲十大虛擬貨幣交易平台包括Binance、OKX、Coinbase等,依據合規性、安全性、費用、資產種類和用戶體驗評選。 1. Binance:全球交易量最大,費率低,已獲多國牌照;2. OKX:產品全面,技術強,已在法國註冊;3. Coinbase:合規安全,適合初學者,在多國獲許可;4. Gate.io:歷史悠久,安全性高,在歐洲多國註冊;5. Bitstamp:成立早,合規性強,受盧森堡監管;6. eToro:支持社交交易,多元化投資,受CySEC監管;7. Bitpanda:界
將CSS和JavaScript與HTML5結構有效整合。
Jul 12, 2025 am 03:01 AM
HTML5、CSS和JavaScript應通過語義化標籤、合理加載順序與解耦設計高效結合。 1.使用HTML5語義化標籤如、提升結構清晰度與可維護性,利於SEO和無障礙訪問;2.CSS應置於中,使用外部文件並按模塊拆分,避免內聯樣式與延遲加載問題;3.JavaScript推薦放在前引入,使用defer或async異步加載以避免阻塞渲染;4.減少三者間強依賴,通過data-*屬性驅動行為、類名控制狀態,統一命名規範提升協作效率。這些方法能有效優化頁面性能與團隊協作。
JavaScript時間對象,某人構建了一個eactexe,在Google Chrome上更快的網站等等
Jul 08, 2025 pm 02:27 PM
JavaScript開發者們,大家好!歡迎閱讀本週的JavaScript新聞!本週我們將重點關注:Oracle與Deno的商標糾紛、新的JavaScript時間對象獲得瀏覽器支持、GoogleChrome的更新以及一些強大的開發者工具。讓我們開始吧! Oracle與Deno的商標之爭Oracle試圖註冊“JavaScript”商標的舉動引發爭議。 Node.js和Deno的創建者RyanDahl已提交請願書,要求取消該商標,他認為JavaScript是一個開放標準,不應由Oracle
造型與CSS不同訪問的鏈接
Jul 11, 2025 am 03:26 AM
設置訪問過鏈接的樣式能提升用戶體驗,尤其在內容密集型網站中幫助用戶更好導航。 1.使用CSS的:visited偽類可定義已訪問鏈接樣式,如顏色變化;2.注意瀏覽器出於隱私限制僅允許修改部分屬性;3.顏色選擇應與整體風格協調,避免突兀;4.移動端可能不顯示該效果,建議結合其他視覺提示如icon輔助標識。
什麼是CSS,它代表什麼?
Jul 03, 2025 am 01:48 AM
CSS,orcascadingstylesheets,isthepartofwevelvermentThatControlsawebpage’svisualAppearance,包括colors,fonts,fonts,spacing,and spacing and layout
顯示:內聯,顯示:塊和顯示:內聯塊之間有什麼區別?
Jul 11, 2025 am 03:25 AM
Themaindifferencesbetweendisplay:inline,block,andinline-blockinHTML/CSSarelayoutbehavior,spaceusage,andstylingcontrol.1.Inlineelementsflowwithtext,don’tstartonnewlines,ignorewidth/height,andonlyapplyhorizontalpadding/margins—idealforinlinetextstyling
如何使用CSS創建響應式圖像?
Jul 15, 2025 am 01:10 AM
要使用CSS創建響應式圖片,主要可通過以下方法實現:1.使用max-width:100%和height:auto讓圖片在保持比例的同時自適應容器寬度;2.結合HTML的srcset和sizes屬性智能加載適配不同屏幕的圖片源;3.利用object-fit和object-position控製圖片裁剪與焦點展示。這些方法共同確保圖片在不同設備上清晰、美觀地呈現。


