目錄
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工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

bootstrap怎麼調整大小 bootstrap怎麼調整大小 Apr 07, 2025 pm 03:18 PM

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

bootstrap怎麼插入圖片 bootstrap怎麼插入圖片 Apr 07, 2025 pm 03:30 PM

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

bootstrap怎麼設置框架 bootstrap怎麼設置框架 Apr 07, 2025 pm 03:27 PM

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

bootstrap按鈕怎麼用 bootstrap按鈕怎麼用 Apr 07, 2025 pm 03:09 PM

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

HTML,CSS和JavaScript的角色:核心職責 HTML,CSS和JavaScript的角色:核心職責 Apr 08, 2025 pm 07:05 PM

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

bootstrap怎麼寫分割線 bootstrap怎麼寫分割線 Apr 07, 2025 pm 03:12 PM

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

bootstrap怎麼看日期 bootstrap怎麼看日期 Apr 07, 2025 pm 03:03 PM

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

vue中怎麼用bootstrap vue中怎麼用bootstrap Apr 07, 2025 pm 11:33 PM

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

See all articles