主頁 > 企業開發 > CSS之Flex詳解

CSS之Flex詳解

2022-04-28 07:11:43 企業開發

目錄
  • flex是什么
  • 容器的屬性
  • item 的屬性
  • 一些疑惑和解答

flex是什么

根據規范中的描述可知道,Flexbox 模塊提供了一個有效的布局方式,即使不知道視窗大小或者未知元素情況之下都可以智能的,靈活的調整和分配元素和空間兩者之關的關系,簡單的理解,就是可以自動調整,計算元素在容器空間中的大小,

flex分為兩個部分,即容器(Container)和專案(item),一旦將一個元素設定為 flex container,那么其子元素默認全部變為flex item,然后我們就可以通過在 container 設定一些屬性來控制其 item 的布局,當然,item 自身也有一些 flex 屬性,是只針對自己的屬性,

要將一個元素設定為容器,只要在其 css 里添加 display:flex 或者 display:flex-inline 即可

在介紹 flex 的屬性前,還有一些基本概念需要介紹,這里就借用網上的一幅圖來說明
Flex

如圖,其實已經很清晰明了了,容器內有兩條軸,分別叫主軸(main axis)和交叉軸(cross axis),一般情況下 item 沿主軸方向排列,flex默認主軸為橫向,交叉軸為縱向,還有 main start、main end、cross start、cross end 這四個分別表示主軸和交叉軸的起始位置和結束位置,

容器的屬性

容器有六個屬性,flex-direction、flex-wrap、flex-flow、justify-content、align-items、align-content,

  1. flex-direction
    flex-direction 有四個值:row、column、row-reverse、column-reverse,這個屬性用于設定主軸方向,row 為默認值,表示主軸為橫軸,方向從左到右;column 表示主軸為縱軸,方向從上到下;后兩個分別表示從右到左和從下到上的主軸,
  2. flex-wrap
    flex-wrap 有三個值:nowrap、wrap、wrap-reverse,這個屬性設定如何換行,nowrap(默認)表示不換行,此時若主軸方向item總長度超過容器長度,則壓縮 item 主軸方向長度,wrap 表示換行,當 item 總長度超過容器長度時就換行,wrap-reverse 表示反向換行,換行后最靠近 cross end 的為第一行、然后是第二行......
  3. flex-flow
    flex-flow 為前面兩個的簡寫版本,即可以同時在此屬性里設定前面兩個屬性的值,如:flex-flow: nowrap row;
  4. justify-content
    justify-content 有五個值:flex-start、flex-end、center、space-between、space-around,此屬性用于調整主軸方向上 item 的對齊方式,flex-start 和 flex-end 分別表示向 main start 和 main end 對齊;center 為主軸方向上的居中對齊;space-between 表示同時向 main start 和 main end 對齊,即兩端對齊,并且兩個 item 之間主軸方向上的間距相等;space-around 表示每個專案兩側之間的距離相等
  5. align-items
    align-items 有五個值:flex-start、flex-end、center、stretch、baseline,此屬性用于調整交叉軸方向上專案的對齊方式,前面三個值和 justify-content 對應的值效果是一樣的,只是方向換成了交叉軸,stretch 為默認值,當 item 交叉軸方向的長度沒有設定或為auto時就會在交叉軸方向填滿容器,baseline 則表示文字對齊,即以 item 中的第一行文字為基準對齊
  6. align-content
    align-content 有六個值:flex-start、flex-end、center、space-around、space-between、stretch,此屬性定義了多根軸線的對齊方式,當只有一根軸線時此屬性無效,此屬性主要針對交叉軸方向,其值在上面都有提到,這里就不贅述了

item 的屬性

item 有六個屬性:order、flex-grow、flex-shrink、flex-basis、flex、align-self

  1. order,order 設定同一容器里沿主軸方向的排列順序,可以利用此屬性做交換的影片
  2. flex-grow,此屬性設定該 item 在主軸方向有剩余空間時的放大比例,默認為0,即不放大,注意:這里的放大計算原理是先計算主軸上的剩余空間 rest_space,然后計算這條軸上所有 item 的 flex-grow 之和 grow_sum,最后給每個專案 item[i] 的主軸長度增加 rest_space * ( grow[i] / grow_sum ),即先計算出該 item 放大比例占所有 item 放大比例的百分比,然后該 item 增加 該百分比乘以主軸剩余長度,需要注意的是,當主軸方向沒有剩余空間時,該屬性無效
  3. flex-shrink,此屬性和 flex-grow 正好相反,此屬性設定該 item 在主軸方向沒有剩余空間時的縮小比例,默認值為1,即空間不足時縮小,如果設定為0,則空間不足時會超出容器,我原本以為計算原理和 flex-grow基本相同,后來發現有一點不對,經過網上查詢資料發現,flex- shrink 的計算公式略有區別,flex-shrink 首先要計算權重 TW = E(basis[i] * shrink[i]),也就是所有 item 的 basis * shrink 之和,然后每個 item 的實際長度為 basis[i] - [ (basis[i] * shrink[i] ) / TW ] * need_space,其中,basis 為專案設定長度(見下面的4),shrink 為縮放值,need_space 為需要所有 item 減少的總長度,需要注意的是:flex-shrink 為0的 item 是不會縮放的,通常這會導致 item 超出容器,
  4. flex-basis,此屬性指示在分配多余空間前 item 占的長度,默認情況下為 auto,即設定的width,需要注意的是,如果沒有多余空間的話,會按照上面第3條的規則縮放;是否有多余空間是根據主軸上所有 item 的flex-basis 之和來計算的,不是按照 width 來計算的!
  5. flex,此屬性為 flex-grow、flex-shrink、flex-basis 三個屬性的簡寫,有兩個快捷值:auto( 1 1 auto) 和 none( 0 0 auto ),
  6. align-self,此屬性可取六個值:flex-start、flex-end、center、baseline、stretch、auto,此屬性設定單獨的排列行為,此屬性的值的含義前面容器屬性部分都有提到,此處不贅述,

一些疑惑和解答

在學習flex的時候,不自覺產生了一些使用方面的疑惑,下面就是我的一些疑惑和結果

  1. justify-content 是針對主軸方向的排列,一開始想當然認為是多個 item 的情況,后面突然想起,如果是一個 item 的話,其排序規則又是怎樣的呢?
    首先 flex-start、flex-end 和 center 還比較好理解,只有一個專案的時候會貼著 main start、main end 或者在 main start 和 main end 的中間,那么其值為 space-between 和 space-around的時候呢,前者表示兩端對齊,后者表示等間距對齊,在只有一個專案的情況下會怎么出現什么結果呢?結果如下
    result1-1 result1-2
    左邊表示 space-around 的結果,右邊表示 space-between 的結果,可以看出,由于 space-around 要求專案兩側的距離相等,因此只有一個專案時左右距離各占一半,和center的效果是一致的;而 space-between在只有一個專案不能同時對齊左右端的情況下,選擇了左對齊,
    結論:當只有一個專案時,space-around 的效果等同于 center,space-between 的效果等同于 flex-start
  2. align-items值為 stretch 時,假如 item 在交叉軸方向的長度沒有設定,并且在交叉軸方向不止一個 item (即在主軸方向有換行),這時會出現什么結果呢?
    這個問題的結果非常有趣,我原以為只要交叉軸方向上只有一個 item 的會直接填滿整個容器,而有兩個 item 的就平分容器,然后結果卻如下圖
    result2
    原因大概是因為 stretch 的拉伸針對的是整個軸,而上圖是雙軸線,實際上 stretch 的效果是正確的
    結論:只要交叉軸方向有大于2個 item,即使交叉軸方向只有一個 item,這個 item 依然不會充滿容器,而是和主軸方向上的 item 長度一致
  3. align-items值為 baseline 時,若 item 沒有文字會出現什么結果?
    這個問題的結果也很有趣,直接上結果
    result3-1 result3-2 result3-3
    可以看出,沒有文字的 item 可以認為是文字在最底部的 item
    結論:沒有文字的 item 可以認為是文字在最底部的 item
  4. align-content 說明為單軸線時無效,那么什么時候為單軸線,什么時候為多軸線?
    經過我的實驗,所謂的單軸線應該就是說沒有換行的情況下,只有一行有 item ,此時 align-content 無效,那么由此反推,交叉軸方向上 item 的最大個數即主軸數,主軸方向上 item 的最大個數即交叉軸數,如下圖,這就是雙軸線
    result4
  5. justify-content、align-items 和 align-content 似乎差不多?
    首先就他們可以取的值而言, align-content 似乎是 align-items 和 justify-content 的大雜燴,后面兩個屬性可以取得值 align-content 都可以取,更為巧合的是,取 align-items 的 align 和 justify-content 的 content 就組成了 align-content,這倒是挺有趣的,
    但是三者之間還是區別比較明顯的,justify-content 就不說了,它的區別最明顯,它是針對主軸的,而其他兩個是針對交叉軸的,那么同樣針對交叉軸的 align-content 和 align-items 有什么區別呢?
    首先看看定義,align-content 相較于 align-items 有一個明顯的不同,那就是它不支持單軸線的操作,下圖是單軸線情況下 align-items 和 align-content 的區別
    result5-1 result5-2 resukt5-3
    可以看出,單軸線情況下 align-content 根本沒起作用,而此時 align-items 就起到了非常關鍵的作用,接下來再看看多軸線情況下會發生什么
    result5-4 result5-5 result5-6

于是兩者之間的區別已經躍然紙上了,首先,align-content 單軸線無效,而 align-items 單軸線和多軸線都有效(但多線軸情況下其本質還是對單線軸的設定),當兩者同時使用且發生沖突時,align-content 的優先級別更高,也就是說,沖突時 align-content 的操作會覆寫掉 align-items 的操作
結論

  1. justify-content 是針對主軸的,而 align-content 和 align-items 是針對交叉軸的
  2. align-content 不支持單軸線,align-items 本質就是對每條軸線的操作
  3. 操作沖突時,align-items 的操作會被 align-content 覆寫掉

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/466034.html

標籤:其他

上一篇:聊聊 node 如何優雅地獲取 mac 系統版本

下一篇:【筆記】【JavaScript】JSchallenger-Arrays物件-練習筆記

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more