全面解析 CSS Flex 布局:從入門到精通的所有屬性詳解

1. Flex 容器屬性

通過 display: flexdisplay: inline-flex 將元素設置為 Flex 容器。以下是所有容器屬性。

1.1 display: flex | inline-flex

  • 作用:定義一個 Flex 容器。
  • 可選值
    • flex:塊級容器,占據整行。
    • inline-flex:行內塊容器,寬度隨內容自適應。
  • 示例
    .container {display: flex;
    }
    .inline-container {display: inline-flex;
    }
    
    效果flex 使容器占滿整行,inline-flex 寬度隨內容變化。

1.2 flex-direction

  • 作用:定義主軸方向。
  • 可選值
    • row(默認):水平從左到右。
    • row-reverse:水平從右到左。
    • column:垂直從上到下。
    • column-reverse:垂直從下到上。
  • 示例
    .container {display: flex;flex-direction: column;
    }
    
    效果:子項垂直排列,從上到下。

1.3 flex-wrap

  • 作用:控制子項是否換行。
  • 可選值
    • nowrap(默認):單行排列,可能壓縮子項。
    • wrap:多行排列,子項超出容器時換行。
    • wrap-reverse:多行排列,行順序反轉。
  • 示例
    .container {display: flex;flex-wrap: wrap;
    }
    
    效果:子項超出容器寬度時自動換行。

1.4 flex-flow

  • 作用flex-directionflex-wrap 的簡寫。
  • 語法flex-flow: <flex-direction> <flex-wrap>;
  • 示例
    .container {display: flex;flex-flow: row wrap;
    }
    
    效果:子項水平排列,支持換行。

1.5 justify-content

  • 作用:控制主軸上子項的對齊方式。
  • 可選值
    • flex-start(默認):靠主軸起點。
    • flex-end:靠主軸終點。
    • center:居中對齊。
    • space-between:兩端對齊,間距均分。
    • space-around:子項周圍間距相等。
    • space-evenly:間距完全均等。
  • 示例
    .container {display: flex;justify-content: space-between;
    }
    
    效果:子項兩端對齊,剩余空間均分。

1.6 align-items

  • 作用:控制交叉軸上子項的對齊方式(單行)。
  • 可選值
    • stretch(默認):子項拉伸填滿交叉軸。
    • flex-start:靠交叉軸起點。
    • flex-end:靠交叉軸終點。
    • center:居中對齊。
    • baseline:按文本基線對齊。
  • 示例
    .container {display: flex;align-items: center;
    }
    
    效果:子項在交叉軸上居中。

1.7 align-content

  • 作用:控制多行子項在交叉軸上的對齊方式(需 flex-wrap: wrap)。
  • 可選值
    • stretch(默認):行拉伸填滿交叉軸。
    • flex-start:靠交叉軸起點。
    • flex-end:靠交叉軸終點。
    • center:居中對齊。
    • space-between:兩端對齊,間距均分。
    • space-around:行周圍間距相等。
    • space-evenly:行間距完全均等。
  • 示例
    .container {display: flex;flex-wrap: wrap;align-content: space-around;
    }
    
    效果:多行子項在交叉軸上均勻分布。

1.8 gap, row-gap, column-gap

  • 作用:設置子項間距。
  • 可選值:長度值(如 10px1rem)。
  • 說明
    • gap:同時設置行間距和列間距。
    • row-gap:單獨設置行間距。
    • column-gap:單獨設置列間距。
  • 示例
    .container {display: flex;gap: 20px;
    }
    
    效果:子項間水平和垂直間距為 20px。

2. Flex 子項屬性

Flex 子項(容器的直接子元素)通過以下屬性控制自身行為。

2.1 flex-grow

  • 作用:定義子項分配主軸剩余空間的比例。
  • 可選值:非負整數(默認 0)。
  • 說明:值越大,子項占用剩余空間越多。
  • 示例
    .item1 {flex-grow: 1;
    }
    .item2 {flex-grow: 2;
    }
    
    效果item2 占用剩余空間是 item1 的兩倍。

2.2 flex-shrink

  • 作用:定義子項在主軸上壓縮的比例。
  • 可選值:非負整數(默認 1)。
  • 說明:值越大,空間不足時子項壓縮越多。
  • 示例
    .item1 {flex-shrink: 0;
    }
    .item2 {flex-shrink: 2;
    }
    
    效果:空間不足時,item1 不壓縮,item2 壓縮更多。

2.3 flex-basis

  • 作用:定義子項在主軸上的初始大小。
  • 可選值:長度值(如 100px20%)或 auto(默認)。
  • 說明:優先級高于 widthheight
  • 示例
    .item {flex-basis: 200px;
    }
    
    效果:子項初始寬度為 200px。

2.4 flex

  • 作用flex-growflex-shrinkflex-basis 的簡寫。
  • 語法flex: <flex-grow> <flex-shrink> <flex-basis>;
  • 常用值
    • flex: 1:等同于 flex: 1 1 0%
    • flex: auto:等同于 flex: 1 1 auto
    • flex: none:等同于 flex: 0 0 auto
  • 示例
    .item {flex: 1 1 200px;
    }
    
    效果:子項初始寬度 200px,可伸縮。

2.5 align-self

  • 作用:單獨控制子項在交叉軸上的對齊,覆蓋 align-items
  • 可選值auto(默認,繼承 align-items)、flex-startflex-endcenterbaselinestretch
  • 示例
    .item {align-self: flex-end;
    }
    
    效果:該子項靠交叉軸終點對齊。

2.6 order

  • 作用:控制子項排列順序。
  • 可選值:整數(默認 0)。
  • 說明:值越小,子項越靠前。
  • 示例
    .item1 {order: 2;
    }
    .item2 {order: 1;
    }
    
    效果item2 排在 item1 之前。

3. 常見問題:flex: 1 導致無法固定寬度或高度

3.1 問題描述

使用 flex: 1(等同于 flex: 1 1 0%)時,子項會忽略顯式設置的 widthheight,導致無法固定寬度或高度。這是因為:

  • flex: 1 設置了 flex-basis: 0%,使子項的初始主軸尺寸為 0,優先級高于 widthheight
  • flex-grow: 1 使子項盡可能占用剩余空間。
  • 當主軸為水平方向(flex-direction: row),width 被忽略;當主軸為垂直方向(flex-direction: column),height 被忽略。

示例(問題重現):

.container {display: flex;
}
.item {flex: 1;width: 200px; /* 被忽略 */height: 100px;
}

效果:子項寬度由剩余空間決定,width: 200px 無效。

3.2 解決方案

要固定寬度或高度,可以通過以下方式解決:

  1. 使用 flex-basis 明確指定初始尺寸

    .item {flex: 1 1 200px; /* flex-basis 設置為 200px */height: 100px;
    }
    

    效果:子項寬度固定為 200px,同時保持伸縮能力。

  2. 設置 flex: noneflex: 0 0 200px

    .item {flex: none; /* 等同于 flex: 0 0 auto */width: 200px;height: 100px;
    }
    

    效果:子項寬度固定為 200px,不伸縮。

  3. 使用 min-widthmax-width 限制尺寸

    .item {flex: 1;min-width: 200px;max-width: 200px;height: 100px;
    }
    

    效果:子項寬度固定為 200px,防止被拉伸或壓縮。

  4. flex-direction: column 中固定高度

    .container {display: flex;flex-direction: column;
    }
    .item {flex: 0 0 100px; /* 固定高度 */width: 200px;
    }
    

    效果:子項高度固定為 100px。

3.3 注意事項

  • 優先級flex-basis 優先級高于 widthheight,但 min-width/max-widthmin-height/max-height 優先級更高。
  • 場景選擇:根據需求選擇 flex: none(完全固定)或 flex: 1 1 200px(固定初始尺寸但允許伸縮)。
  • 調試技巧:使用瀏覽器的開發者工具檢查子項的計算尺寸,確認是否被 flex-basis 覆蓋。

4. 實戰示例:居中布局與響應式卡片

以下是一個綜合示例,展示如何使用 Flex 布局實現居中和響應式卡片,并解決 flex: 1 的尺寸問題。

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>Flex 布局示例</title><style>.container {display: flex;flex-flow: row wrap;justify-content: space-around;align-items: center;gap: 20px;min-height: 100vh;background: #f0f0f0;}.card {flex: 0 0 200px; /* 固定寬度 200px */background: white;padding: 20px;border-radius: 8px;box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);text-align: center;height: 100px; /* 固定高度 */}.card:nth-child(2) {align-self: flex-end;order: -1;}</style>
</head>
<body><div class="container"><div class="card">卡片 1</div><div class="card">卡片 2</div><div class="card">卡片 3</div></div>
</body>
</html>

效果說明

  • 使用 flex: 0 0 200px 確保卡片寬度固定為 200px,不會被拉伸或壓縮。
  • height: 100px 固定卡片高度。
  • flex-flow: row wrap 支持換行,justify-content: space-aroundgap: 20px 確保間距均勻。
  • 第二個卡片通過 align-selforder 調整位置和順序。

5. 常見問題與解決方案

  1. 為什么子項沒有拉伸?
    • 檢查 align-items 是否為 stretch,且子項沒有固定高度。
  2. 為什么子項不換行?
    • 確保 flex-wrap 設置為 wrapwrap-reverse
  3. 為什么 flex: 1 導致寬度/高度失效?
    • 參考第 3 節,使用 flex-basismin-width/max-width 固定尺寸。
  4. 如何實現完美居中?
    • 使用 justify-content: centeralign-items: center

6. 總結

Flex 布局通過其強大的容器和子項屬性,為開發者提供了靈活的布局控制能力。特別需要注意的是,flex: 1 會導致 flex-basis: 0%,從而覆蓋顯式設置的 widthheight。通過合理設置 flex-basismin-width/max-widthflex: none,可以輕松解決尺寸固定問題。希望這篇教程能幫助你從入門到精通 Flex 布局,快速應用到實際項目中!

點個收藏,關注前端結城,一起用代碼點亮前端世界!🚀

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93274.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93274.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93274.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據結構:對角矩陣(Diagonal Matrix)

目錄 矩陣的傳統表示&#xff1a;二維數組 &#x1f50d; 真正有用的數據是哪些&#xff1f; 從二維數組轉為一維數組 用 C 類實現對角矩陣 1. 對角矩陣真正需要存什么&#xff1f; 2. 對角矩陣允許哪些行為&#xff1f; 3. 為什么要動態分配數組&#xff1f; 接下來推…

Leetcode_349.兩個數組的交集

這道題的意思很明確&#xff0c;就是讓尋找兩個數組中的共同元素&#xff0c;并去重&#xff0c;由此可以聯想到哈希表的特性&#xff0c;注意到題目給的數據范圍&#xff0c;在1000以內&#xff0c;所以本題可以使用 STL 的庫函數&#xff0c;也可以使用數組進行模擬。 本題要…

STM32——寄存器映射

總 &#xff1a;STM32——HAL庫總結-CSDN博客 芯片資料&#xff1a; STM32F1系列參考手冊-V10&#xff08;中&#xff09; STM32F103ZET6(English) 一、寄存器基礎 1.1 簡介 單片機內部的控制機構。 像空氣開關控制電路一樣的原理&#xff0c;打開關閉某個開關&#xff0…

Java響應式編程

Java 響應式編程是一種基于異步數據流處理的編程范式&#xff0c;它強調數據流的聲明式構建和傳播變化的自動響應。Java 9 引入的Flow API為響應式編程提供了標準接口&#xff0c;而 Reactor 和 RxJava 等第三方庫則提供了更豐富的操作符和工具。核心概念Publisher&#xff08;…

【重學數據結構】二叉搜索樹 Binary Search Tree

目錄 二叉搜索樹的數據結構 手寫實現二叉搜索樹 樹節點定義 插入節點 源碼 流程圖 二叉樹插入步驟圖解 第一步: 插入 20 第二步: 插入 10 第三步: 插入 30 第四步: 插入 5 查找節點 源碼 場景一: 查找成功 (search for 25) 第一步: 從根節點開始 第二步:…

四、計算機組成原理——第1章:計算機系統概述

目錄 1.1計算機發展歷程 1.1.1計算機硬件的發展 1.計算機的四代變化 2.計算機元件的更新換代 1.1.2計算機軟件的發展 1.2計算機系統層次結構 1.2.1計算機系統的組成 1.2.2計算機硬件 1.馮諾依曼機基本思想 2.計算機的功能部件 (1)輸入設備 (2)輸出設備 (3)存儲器 (4)運算器 (5)…

flutter TextField 失去焦點事件

在 Flutter 中&#xff0c;處理 TextField 的失去焦點事件&#xff08;即失去焦點時觸發的操作&#xff09;通常有兩種常用方式&#xff1a;使用 FocusNode 或 onEditingComplete 回調。以下是具體實現&#xff1a; import package:flutter/material.dart;class MyTextField e…

Moonlight for ChromeOS 常見問題解決方案

Moonlight for ChromeOS 常見問題解決方案 項目基礎介紹 Moonlight for ChromeOS 是一個開源的 NVIDIA GameStream 客戶端&#xff0c;允許用戶將他們的游戲從高性能的桌面電腦流式傳輸到運行 ChromeOS 的設備上。該項目還支持 Android 和 iOS/tvOS 平臺。Moonlight for Chrome…

SQL語句:讀操作、寫操作、視圖

文章目錄讀操作分類基礎查詢語句示例高級查詢--分組查詢、子查詢、表連接、聯合查詢分組查詢&#xff1a;子查詢&#xff08;嵌套查詢&#xff09;表連接聯合查詢寫操作視圖SQL&#xff1a;結構化查詢語言讀操作 重點是where查詢&#xff0c;即高級查詢部分 分類 DML &#…

Python 機器學習實戰:基于 Scikit-learn

本文圍繞《Python 機器學習實戰&#xff1a;基于 Scikit-learn 的項目開發》展開&#xff0c;先介紹 Scikit-learn 庫的基礎特性與優勢&#xff0c;再闡述機器學習項目開發的完整流程&#xff0c;包括數據收集與預處理、模型選擇與訓練、評估與優化等。通過具體實戰案例&#x…

java里List鏈式編程

java里對list的操作&#xff0c;我們一遍使用for遍歷&#xff0c;輸出或改變里面的內容。單經常在代碼里面我們發現&#xff0c;也可以使用這樣的代碼結構daPaymentActionVo.setApnolist(paymentActionVo.getApnolist().stream().map(PaymentActionVo.Voucher::getApno).collec…

【esp32s3】7 - VSCode + PlatformIO + Arduino + 構建項目

一、PlatformIO 1.1. 概述 官方文檔&#xff1a;What is PlatformIO? PlatformIO 是一個跨平臺的物聯網開發生態系統&#xff0c;專門為嵌入式系統開發設計&#xff0c;支持多種開發板和框架。 1.1.1. 主要特點 跨平臺&#xff1a;支持 Windows、macOS 和 Linux多框架支持&…

LE AUDIO CIS/BIS音頻傳輸時延的計算

LE AUDIO音頻總時延計算方法 按照BAP的規范,LE AUDIO音頻總延時包括三個部分:Audio Processing Time,Transport Latency,Presentation Delay。如下圖所示是播放音樂的示例圖: 這里還有一個麥克風錄音的總時延示例圖: Audio Processing Time:這個就是音頻DSP獲取音頻數…

git 修改 更新

git 修改 更新先更新&#xff0c;后修改# 暫存當前修改 git add . git stash# 獲取最新的 main 分支 git checkout main git pull# 新建開發分支 git checkout -b lbg_0727# ?? 先把 main 的最新代碼合并/變基到當前分支&#xff08;用于消除沖突&#xff09; # 方法1&#x…

飛鶴困局:增長神話的裂痕

增長天花板已然逼近&#xff0c;飛鶴需要探尋新方向。作者|安德魯編輯|文昌龍“飛鶴&#xff0c;更適合中國寶寶體質”——這句曾讓無數媽媽點頭的廣告語&#xff0c;幫飛鶴坐上了中國奶粉市場的頭把交椅。可多年后&#xff0c;時代紅利退潮&#xff0c;故事不好講了。飛鶴的利…

Java設計模式之<建造者模式>

目錄 1、建造者模式 2、建造者模式結構 3、實現 4、工廠模式對比 5、適用場景差異 前言 建造者模式是一種創建型設計模式。用于封裝復雜對象的構建過程&#xff0c;通過步驟構建產品類。它包括產品類、抽象建造者、具體建造者和指揮者角色。 優點在于靈活性、解耦和易擴展…

fchown/fchownat系統調用及示例

55. fchmod - 通過文件描述符改變文件權限 函數介紹 fchmod是一個Linux系統調用&#xff0c;用于通過文件描述符來改變文件的訪問權限。它是chmod函數的文件描述符版本&#xff0c;避免了路徑名解析。 函數原型 #include <sys/stat.h> #include <unistd.h>int fchm…

20250726-5-Kubernetes 網絡-Service 代理模式詳解(iptables與ipvs)_筆記

一、服務三種常用類型 ?? 1. LoadBalancer類型 工作原理:與NodePort類似,在每個節點上啟用端口暴露服務,同時Kubernetes會請求底層云平臺(如阿里云、騰訊云、AWS等)的負載均衡器,將每個Node([NodeIP]:[NodePort])作為后端添加。 自動化實現:云廠商通過官方實現的控制…

horizon置備出錯

報錯內容如下&#xff1a; [2025/7/28 19:15] 置備 Customization failure: Customization of the guest operating system is not supported due to the given reason: 期間出錯 解決方法&#xff1a;將模板轉換為虛擬機&#xff0c;安裝vmtools&#xff1b;再安裝vmtools之后…

【unitrix】 6.19 Ord特質(ord.rs)

一、源碼 這段代碼定義了一個標記特征&#xff08;marker trait&#xff09;Ord 和三個實現&#xff0c;用于將類型標記與 Rust 標準庫中的 Ordering 枚舉關聯起來。 use crate::sealed::Sealed; use core::cmp::Ordering; use crate::number::{Greater, Equal, Less}; /// 用于…