學習 Flex 佈局

来源:https://www.cnblogs.com/xyzhanjiang/archive/2020/04/10/12675815.html
-Advertisement-
Play Games

Flex 是 CSS3 推出的一種佈局方式,至今有超過十年時間了 要實現 Flex 佈局很容易,只需要給一個元素的 屬性設置為 就行 咋看之下好像沒什麼變化,那是因為受到影響的其實是其內部的元素,給這個容器內添加幾個元素就可以看到效果 可以看到的是預設情況下應該獨占一行的 `` 元素現在全部擠在了一 ...


Flex 是 CSS3 推出的一種佈局方式,至今有超過十年時間了

要實現 Flex 佈局很容易,只需要給一個元素的 display 屬性設置為 flex 就行

.box {
  display: flex;
}

咋看之下好像沒什麼變化,那是因為受到影響的其實是其內部的元素,給這個容器內添加幾個元素就可以看到效果

<div class="box">
  <div class="item-1">1</div>
  <div class="item-2">2</div>
  <div class="item-3">3</div>
</div>

可以看到的是預設情況下應該獨占一行的 <div> 元素現在全部擠在了一行,這就是 flex 的效果,也就是說只要一行代碼就實現了 flex 佈局,不愧為大神級理解

flex-direction

簡單的說,佈局其實就是一個怎麼擺放的問題,內部那些元素既然可以擺成一行,當然也可以擺成一列,只需要向容器添加一個 flex-direction 屬性,就能改變內部元素的擺放方向

.box {
  flex-direction: column;
}

當其值為 column 的時候即為按列,而之前的預設值是 row,一旦確定了擺放方向後,則該方向成為 flex 的主軸,用箭頭來表示就像這樣

flex-direction: row

row

flex-direction: column

column

另外還有兩個擺放方向,就是這兩者相反的方向

flex-direction: column-reverse

column-reverse

flex-direction: column-reverse

column-reverse

justify-content

有了方向之後,就有了起點和終點,前面這些元素都是擠在主軸的起點位置,我們可以通過添加一個 justify-content 屬性改變這些元素在主軸上的位置

.box {
  justify-content: flex-end;
}

這樣就全部跑到主軸的終點位置去了

justify-content: flex-end

flex-end

也能擺在中間

justify-content: center

center

理所當然的預設值就應該是起點了 flex-start,除了這種一鍋端式的對齊方式外,還能讓這些元素均勻地分佈於主軸上,有3種方式

1種是兩端不留空,兩端的元素和容器之間無間隔

justify-content: space-between

space-between

1種是兩端留空,兩端的元素和容器之間也有同等的間隔

justify-content: space-evenly

space-evenly

還有1種是每個元素兩邊留相等的間距,這種情況下兩端的元素和容器之間的距離是元素之間距離的一半

justify-content: space-around

space-around

align-items

另外和主軸垂直的一個方向稱為交叉軸,不同於主軸,元素也可以在交叉軸上挪動位置,只需要給容器添加一個 align-items 屬性

.box {
  align-items: stretch;
}

這是預設值,也就是說預設情況下元素在交叉軸上是拉伸的

align-items: stretch

stretch

此外還有3種普通對齊方式,即起點(flex-start),終點(flex-end)和居中(center)

align-items: flex-start|center|flex-end

flex-start

另外還有一個值是 baseline,這是根據文字的基線對齊,改變每一項文字的大小可以看出效果

align-items: baseline

baseline

在主軸上對齊使用 justify-content,在交叉軸上對齊使用 align-items,這個一定要記清,因為它喵的還有個 align-content 屬性!

flex-wrap

前面在容器中一直都只有3個元素,假如我們給添加到30個會怎樣?

nowrap

會傻傻地擠在一堆,哪怕容器已經放不下了,因為預設是不會自動換行的,需要給容器添加一個 flex-wrap 屬性

.box {
  flex-wrap: wrap;
}

flex-wrap: wrap

wrap

除了這種理所當然的換行方式外,還有一種意想不到的反方向換行方式

flex-wrap: wrap-reverse

wrap-reverse

為什麼會有這麼一種奇葩的換行方式呢,因為前面 flex 的主軸由 flex-direction 屬性定義,總共有4個方向,而交叉軸是垂直於主軸的,但其方向是固定的,如果主軸橫向的話,無論向左還是向右,交叉軸都是自上而下;而如果主軸是縱向的話,那麼交叉軸就是從左至右。但是這個 flex-wrap: wrap-reverse 屬性設置之後就會改變交叉軸的方向,原本的起點和終點的位置就交換了

align-items: flex-start; flex-wrap: wrap-reverse

wrap-reverse & flex-start

可以看到,交叉軸的起點跑到容器下沿去了,說明這時候交叉軸是自下而上的。不過如果經常使用的是居中對齊或者均勻分佈的話根本不用關心什麼起點終點的

align-content

說到均勻分佈,前面只提到可以在主軸上均勻分佈,但當參與佈局的元素多到已經一行或是一列裝不下的時候,在交叉軸上也是可以均勻分佈的,這就需要前面提到的 align-content 屬性,其值和 justify-content 一樣,這兩個屬性才是對應的,同樣有3種均勻分佈方式

align-content: space-between|space-evenly|space-around

space-between|space-evenly|space-around

以及起點,終點和居中對齊等等

align-content: flex-start|flex-end|center

flex-start|flex-end|center

其預設值是 stretch

order

一直以來容器里的元素都是按順序擺放的,那麼可不可以自由調整元素的擺放順序呢,比如將第2個元素擺到最前面呢,當然,只需要添加一個 order 屬性即可,需要註意的是前面添加的所有屬性都是針對容器內的所有元素的,因而那些屬性都是設置在容器上的,而這時只是想改變第2個元素的順序,因此 order 屬性需要添加到對應的元素上

.item-2 {
  order: -1;
}

因為 order 的預設值是 0,只需要給個比 0 小的值就可以擺到前面,同理,給個比 0 大的值就可以擺到末尾去,給每個元素設置一個不一樣的 order 的值就會按照從小到大的順序依次擺放

order

align-self

既然可以單獨改變某個元素的順序,那麼是不是也可以單獨改變某個元素的對齊方式呢,讓這個元素不跟著大部隊一起走,特立獨行一點,這當然是可以的,需要用到 align-self 屬性,它的值和 align-items 基本一樣,同樣是 align- 首碼,那就意味著是在交叉軸上使用自己的對齊方式

.item-2 {
  align-self: flex-end;
}

align-self: flex-end

flex-end

那麼在主軸上能不能使用特立獨行的對齊方式呢,比如有沒有一個 justify-self 屬性,目前來看好像貌似不得行。

flex

雖然在交叉軸上元素會預設拉伸,但是在主軸上當元素比較少的時候會留有很多空間,這時候就要祭出可能是 Flex 的最後一個屬性了,那就是 flex,給每個元素都添加一個值為 1 的 flex 屬性

.item {
  flex: 1;
}

這樣所有元素就會平分容器的空間

flex

而給每個元素設置不同的值,則會按比例分配空間

.item-1 {
  flex: 2;
}

.item-2 {
  flex: 1;
}

.item-3 {
  flex: 3;
}

flex

由於 2 + 1 + 3 = 6,根據比例第 1 項分得 1/3,第 2 項得到 1/6,第 3 項得到一半

這個數值越大,分得越多,預設值是 0,那就相當於是凈身出戶,一點都不要了,當只給一個元素設置值為 1 的時候,這個元素就會獨享主軸上的剩餘空間,當值小於 1 的時候會按這個小數的比例來分配

flex 屬性還有第 2 個值,第 2 個值和第 1 個值剛好相反,第 1 個值規定容器空間太多的時候每個元素怎麼分,第 2 個值則是規定當元素空間不足以容納這所有元素的時候,每個元素應該如何縮小來騰出足夠的空間,其預設值是 1,表示預設情況下所有元素都會自行縮小,這個數值越大,表示責任就越大,需要為騰出空間出更多力,為 0 則表示這是只鐵公雞一毛不拔,只能讓其它不為 0 的元素來縮小以騰出空間

.item {
  flex: 0 1;
}

flex 屬性還有第三個值,規定某個元素在主軸上占據的空間,預設值是 auto,表示元素占據的空間由其自身決定,其值可以是各種長度單位

.item {
  flex: 0 1 60px;
}

由此 flex 的完整預設值就是 0 1 auto,這是個簡寫屬性,由 flex-growflex-shrinkflex-basis 這 3 個屬性組成,如果只想單獨設置其中某個值的時候可以用到

.item {
  flex-grow: 0;
  flex-shrink: 1;
  flex-basis: 60px;
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 摘要:通過學習快速認識JavaScript,熟悉JavaScript基本語法、視窗交互方法和通過DOM進行網頁元素的操作,學會如何編寫JS代碼,如何運用JavaScript去操作HTML元素和CSS樣式,JavaScript入門篇分為四個章節,能夠讓你快速入門,為JavaScript深入學習打下基礎 ...
  • 第3章 你也有控制權(DOM操作) 如何用JavaScript去操作HTML元素和CSS樣式,實現簡單的動態操作。 3-1 認識DOM 3-2 通過ID獲取元素 3-3 innerHTML 屬性 3-4 改變 HTML 樣式 3-5 顯示和隱藏(display屬性) 3-6 控制類名(classNa ...
  • 佈局的常用方法有幾下幾種 一,float佈局 float 屬性定義元素在哪個方向浮動。以往這個屬性總應用於圖像,使文本圍繞在圖像周圍,不過在 CSS 中,任何元素都可以浮動。 浮動元素會生成一個塊級框,而不論它本身是何種元素。 屬性值: float:left 元素向左浮動。 float:reght ...
  • JavaScript中 沒有 塊級作用域,“塊級作用域”中聲明的變數將被添加到 當前 的執行環境中 在JavaScript中,由for語句創建的變數,即使在for迴圈執行結束後,也依舊會存在於迴圈外部的執行環境中。 javascript function add(num1, num2) { var ...
  • 項目構建打包--webpack cnpm run build 打包完成後會提示你,不能在本地打開,必須啟用伺服器才能打開 而且生成了一個dist目錄 這個目錄就是可以發佈的目錄,只要放到伺服器上去即可 ...
  • 完整效果演示 首先完成這個偽搜索框 src/components/search/index.vue (通用搜索框組件) <template> <div class="mine-search-box-wrapper"> <i class="iconfont icon-search"></i> <div ...
  • 使用背景圖,製作雪碧圖效果: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> < ...
  • 相容性 相容性如下圖所示 ( "摘自 mdn" ) 解決方法 由於getComputedStyle方法在IE瀏覽器中只相容IE9及其以上,而IE8和它之前的瀏覽器則需要使用currentStyle方法來獲取樣式,所以我們就可以自定義一個getStyle方法來解決相容性的問題 代碼 自定義getSty ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...