目錄
flex-basis
正負自由空間
flex-grow
flex-shrink
flex 的简写值
flex: 的应用:
两栏布局
三栏布局
结束语
首頁 web前端 css教學 一文詳解三個 flex 屬性對元素的影響

一文詳解三個 flex 屬性對元素的影響

Aug 30, 2022 pm 07:50 PM
css flex

一文詳解三個 flex 屬性對元素的影響

在開發的時候常用flex 這個屬性作用於彈性盒子的子元素,例如:flex:1flex: 1 1 auto,那麼這個屬性到底控制了元素怎麼的行為呢? flex:1又究竟是什麼意義呢?讓這篇文章帶你徹底了解 flex 屬性吧! 【推薦學習:css影片教學

首先我們需要了解,flex 是三個屬性flex-growflex-shrinkflex-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;
}

效果如下:

一文詳解三個 flex 屬性對元素的影響

如果你想 flexbox 完全忽略 flex 子元素的尺寸就設定 flex-basis 為 0。這樣就算元素一設定了寬度,它最終的寬度也是內容寬度。

一文詳解三個 flex 屬性對元素的影響

正負自由空間

#在介紹剩下兩個屬性前先看兩個概念positive free space 正向自由空間與negative free space反向自由空間:

  • #正向自由空間

    比如說,現在有500px寬的flex 容器,flex-direction 屬性值為row, 三個100px 寬的flex 子元素, 那麼沒有被填充的200px 的就是正向自由空間(positive free space)。

一文詳解三個 flex 屬性對元素的影響

  • 反向自由空間

    當子元素的寬度總和大於容器寬度時,溢出的尺寸100px就是反向自由空間。

一文詳解三個 flex 屬性對元素的影響

那麼用什麼屬性來指派正負自由空間呢?

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 屬性對元素的影響

增加的宽度计算方法:假设元素的 flex-grow 值为 x,正向自由空间宽度为l,则每个元素增加的宽度=xx的总和l\frac{x}{x的总和}*l,元素最终宽度 = 元素初始宽度+增加的宽度元素初始宽度 + 增加的宽度

  • 相同比例增长:当给每个子元素的都设定相同的 flex-grow 值,每个元素就会增长相同的宽度
.with-same-flex-grow {
  * {
    flex-grow: 1;
  }
}

效果如下:

一文詳解三個 flex 屬性對元素的影響

本例中第一個元素寬度的計算#1##1#1##1 #1 1#∗200 50=116.67#px

#5######0######## ####=########################1######1######6####### .######6######7######p######x##############;###

第二个元素宽度宽度计算 11+1+1200+100=166.67px\frac{1}{1+1+1}*200 + 100 = 166.67px

第三个同理为216.67px216.67px

  • 不同比例增长:给每个子元素的都设定不同的 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;
  }
}

效果如下:

一文詳解三個 flex 屬性對元素的影響

本例中第一個元素寬度的計算#2##2 1 1#∗200 50=150px\frac{2}{2 1 1}*200 50 = 150px0

### ###=########################1#######5######0#######p ######x###############;###

第二个元素宽度的计算12+1+1200+100=150px\frac{1}{2+1+1}*200 + 100 = 150px

第三个同理是200px200px

  • 如果想让开始时尺寸不同的元素内容宽度相等(平分容器宽度),可以将 flex-basis 设置为 0(完全忽略 flex 子元素的尺寸) flex-grow 为 1(等比例分配)
.average {
  * {
    /* flex: 1 1 0; */
    flex-basis: 0;
    flex-grow: 1;
  }
}

效果如下:

一文詳解三個 flex 屬性對元素的影響

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 屬性對元素的影響

吸收的寬度計算:假設每個flex-shrink 的值為x#nx_n#,元素的初始寬度為ln,反向自由空間為LLL那麼每個元素吸收的寬度為: xnln x1l#1 .######.######.###### #########x####### n#########∗#########l######n###############∗####### L#########\frac{x_n*l_n}{x_1*l_1 ... x_n*l_n}*L

  • 给子元素相同的 flex-shrink 值,这里以默认值 1 为例
.with-same-flex-shrink {
  * {
    flex-shrink: 1;
  }
}

一文詳解三個 flex 屬性對元素的影響

這時第一個元素的吸收寬度為:#1##∗1001#100 #1200 1300##∗ 100=16.67px\frac{1*100} {1*100 1*200 1*300}*100 = 16.67px0=16.6#7p##x=

######################8#####3### ###.######3######7######p######x##################

這時第一個元素的吸收寬度為:#1##∗2001#100 #1200 1300##∗ 100=33.33px\frac{1*200} {1*100 1*200 1*300}*100 = 33.33px#100=33.3#3p #3

######=########################1#####6#### ###6######.######6######7######p#####x################################### ######

这时第一个元素的吸收宽度为:13001100+1200+1300100=50px\frac{1*300}{1*100+1*200+1*300}*100 = 50px,最终元素宽度为 30050=250px300-50=250px

  • 给子元素不同的 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;
  }
}

1一文詳解三個 flex 屬性對元素的影響

這時第一個元素的吸收寬度為: #11001#100 #2200#100#=20## px\frac{1*100}{1*100 2*200}*100 = 20px#20##p#x,最終元素寬度為10020=#80p8#0

###p#####x###### #############

這時第二個元素的吸收寬度為:#22001#100 #2200#100#=80## px\frac{2*200}{1*100 2*200}*100 = 80px#8##0##p#x,最終元素寬度為20080=#120#p##0##p

#x

這時第三個元素的flex-shrink 值為0,不吸收寬度,最終元素寬度即為元素本身的寬度300pxp

# x##################

flex 的简写值

一般我们很少见上述属性单独使用,都是用flex这一个简写属性来表述元素的伸缩。

Flex 简写形式允许你把三个数值按这个顺序书写 flex-growflex-shrinkflex-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;
  }
}

效果如下:左侧宽度不变,右侧自适应

1一文詳解三個 flex 屬性對元素的影響

三栏布局

.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;
  }
}

效果如下:左右宽度不变,中间自适应

1一文詳解三個 flex 屬性對元素的影響

PS.flex 子元素没有 positive free space 就不会增长;没有 negative free space 就不会缩小。

结束语

学习八股文的时候发现自己对flex布局很不熟悉,基本概念都说不上来,只会无脑用,于是去学习,然后就诞生了这篇文章。欢迎指正。

(学习视频分享:web前端

以上是一文詳解三個 flex 屬性對元素的影響的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

CSS教程,用於創建加載旋轉器和動畫 CSS教程,用於創建加載旋轉器和動畫 Jul 07, 2025 am 12:07 AM

創建CSS加載旋轉器的方法有三種:1.使用邊框的基本旋轉器,通過HTML和CSS實現簡單動畫;2.使用多個點的自定義旋轉器,通過不同延遲時間實現跳動效果;3.在按鈕中添加旋轉器,通過JavaScript切換類來顯示加載狀態。每種方法都強調了設計細節如顏色、大小、可訪問性和性能優化的重要性,以提升用戶體驗。

歐洲虛擬幣交易平台排行榜2025年最新榜單TOP10盤點(最近更新) 歐洲虛擬幣交易平台排行榜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結構有效整合。 將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上更快的網站等等 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不同訪問的鏈接 造型與CSS不同訪問的鏈接 Jul 11, 2025 am 03:26 AM

設置訪問過鏈接的樣式能提升用戶體驗,尤其在內容密集型網站中幫助用戶更好導航。 1.使用CSS的:visited偽類可定義已訪問鏈接樣式,如顏色變化;2.注意瀏覽器出於隱私限制僅允許修改部分屬性;3.顏色選擇應與整體風格協調,避免突兀;4.移動端可能不顯示該效果,建議結合其他視覺提示如icon輔助標識。

什麼是CSS,它代表什麼? 什麼是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,andonlyapplyhorizo​​​​ntalpadding/margins—idealforinlinetextstyling

如何使用CSS創建響應式圖像? 如何使用CSS創建響應式圖像? Jul 15, 2025 am 01:10 AM

要使用CSS創建響應式圖片,主要可通過以下方法實現:1.使用max-width:100%和height:auto讓圖片在保持比例的同時自適應容器寬度;2.結合HTML的srcset和sizes屬性智能加載適配不同屏幕的圖片源;3.利用object-fit和object-position控製圖片裁剪與焦點展示。這些方法共同確保圖片在不同設備上清晰、美觀地呈現。

See all articles