AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

CSS_Flex 那些鮮為人知的內(nèi)幕

來(lái)源: 責(zé)編: 時(shí)間:2023-12-06 09:19:00 257觀看
導(dǎo)讀前言Flex想必大家都很熟悉,也是大家平時(shí)在進(jìn)行頁(yè)面布局的首選方案。(反正我是!)。不知道大家平時(shí)在遇到Flex布局屬性問(wèn)題時(shí),是如何查閱并解決的。反正,我每次記不住哪些屬性或者對(duì)哪些屬性的用法忘記時(shí)。我總是求助于阮

前言

Flex想必大家都很熟悉,也是大家平時(shí)在進(jìn)行頁(yè)面布局的首選方案。(反正我是!)。不知道大家平時(shí)在遇到Flex布局屬性問(wèn)題時(shí),是如何查閱并解決的。反正,我每次記不住哪些屬性或者對(duì)哪些屬性的用法忘記時(shí)。我總是求助于阮一峰老師寫的Flex 布局教程:語(yǔ)法篇[1]。BaB28資訊網(wǎng)——每日最新資訊28at.com

其實(shí),對(duì)于CSS來(lái)講,大家都抱著一種「死記硬背」的東西來(lái)對(duì)待它。久而久之,就會(huì)出現(xiàn)上述我說(shuō)的問(wèn)題,一個(gè)屬性或者一個(gè)使用案例,需要去指定的網(wǎng)站去查詢。這算是好的呢,有些同學(xué)沒(méi)有自己的知識(shí)體系或者收藏資料。 每次遇到問(wèn)題,都是baidu/google一下,然后CV大發(fā)一通。BaB28資訊網(wǎng)——每日最新資訊28at.com

其實(shí),我們應(yīng)該把將 CSS 視為一組布局模式。每種布局模式都是一個(gè)可以實(shí)現(xiàn)或重新定義每個(gè) CSS 屬性的「算法」。我們使用 CSS 聲明(鍵/值對(duì))提供算法,算法決定如何使用它們。BaB28資訊網(wǎng)——每日最新資訊28at.com

換句話說(shuō),我們編寫的 CSS 是這些算法的輸入,就像傳遞給函數(shù)的參數(shù)一樣。如果我們想真正熟悉 CSS,僅僅學(xué)習(xí)屬性是不夠的;我們必須學(xué)習(xí)算法如何使用這些屬性。BaB28資訊網(wǎng)——每日最新資訊28at.com

只有,我們?cè)趯?duì)一些布局模式有了一定的掌握之后,我們才會(huì)在遇到類似的問(wèn)題,游刃有余的處理問(wèn)題。或者說(shuō)像調(diào)用函數(shù)一樣,輸入特定的參數(shù),得到特定的結(jié)果。BaB28資訊網(wǎng)——每日最新資訊28at.com

所以,今天我們來(lái)?yè)Q一種對(duì)Flex的思考角度,對(duì)它來(lái)一次深度解析。BaB28資訊網(wǎng)——每日最新資訊28at.com

還有一點(diǎn),需要說(shuō)明,下文中不會(huì)設(shè)計(jì)到特有屬性的介紹,并且還需要大家對(duì)Flex布局有一點(diǎn)的知識(shí)儲(chǔ)備。BaB28資訊網(wǎng)——每日最新資訊28at.com

比方說(shuō),下圖中標(biāo)注的一些概念下文中就不會(huì)過(guò)多介紹了。推薦大家先把阮老師的那個(gè)文章通讀幾遍,對(duì)Flex有一個(gè)大體的了解在閱讀下文。BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

好了,天不早了,干點(diǎn)正事哇。BaB28資訊網(wǎng)——每日最新資訊28at.com

我們能所學(xué)到的知識(shí)點(diǎn)BaB28資訊網(wǎng)——每日最新資訊28at.com

前置知識(shí)點(diǎn)BaB28資訊網(wǎng)——每日最新資訊28at.com

Flexbox 是個(gè)啥?BaB28資訊網(wǎng)——每日最新資訊28at.com

Flex DirectionBaB28資訊網(wǎng)——每日最新資訊28at.com

對(duì)齊(Alignment)BaB28資訊網(wǎng)——每日最新資訊28at.com

假設(shè)大小(Hypothetical size)BaB28資訊網(wǎng)——每日最新資訊28at.com

增長(zhǎng)(Grow)和萎縮(Shrink)BaB28資訊網(wǎng)——每日最新資訊28at.com

最小尺寸的陷阱BaB28資訊網(wǎng)——每日最新資訊28at.com

間距BaB28資訊網(wǎng)——每日最新資訊28at.com

包裹BaB28資訊網(wǎng)——每日最新資訊28at.com

1. 前置知識(shí)點(diǎn)

「前置知識(shí)點(diǎn)」,只是做一個(gè)概念的介紹,不會(huì)做深度解釋。因?yàn)椋@些概念在下面文章中會(huì)有出現(xiàn),為了讓行文更加的順暢,所以將本該在文內(nèi)的概念解釋放到前面來(lái)。「如果大家對(duì)這些概念熟悉,可以直接忽略」同時(shí),由于閱讀我文章的群體有很多,所以有些知識(shí)點(diǎn)可能「我視之若珍寶,爾視只如草芥,棄之如敝履」。以下知識(shí)點(diǎn),請(qǐng)「酌情使用」。BaB28資訊網(wǎng)——每日最新資訊28at.com

CSS 布局算法

CSS 有不同的模式,確定它如何在頁(yè)面上布局元素。這些模式通常被稱為布局算法或布局模式。BaB28資訊網(wǎng)——每日最新資訊28at.com

在 CSS 中有七種布局模式,下圖是MDN_CSS_Layout_Mode[2]的描述BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

其中Multi-column layout估計(jì)大家沒(méi)咋接觸過(guò),剩余的或多或少在我們平時(shí)開(kāi)發(fā)中都有接觸過(guò)。BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

其中四種被使用最多。流動(dòng)、定位、flex和grid。BaB28資訊網(wǎng)——每日最新資訊28at.com

流動(dòng)布局(Flow Layout)

默認(rèn)情況下,CSS 使用所謂的流動(dòng)布局算法(也稱Normal flow)。流動(dòng)將頁(yè)面上的每個(gè)元素都視為屬于文本文檔。BaB28資訊網(wǎng)——每日最新資訊28at.com

塊級(jí)元素以垂直方式在頁(yè)面上重疊顯示。它們會(huì)盡量占用盡可能多的水平空間,同時(shí)盡量減少垂直空間的占用。BaB28資訊網(wǎng)——每日最新資訊28at.com

內(nèi)聯(lián)元素在水平方向上像段落中的文本一樣顯示在一起。它們通常具有固定的寬度和高度,這就是為什么許多其他我們可能想要使用的屬性在這些元素上不起作用的原因。我們可以通過(guò)將它們的顯示屬性更改為inline-block來(lái)更改此行為。BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

定位布局

如果在元素上使用 position 屬性,我們現(xiàn)在正在要求 CSS 根據(jù)定位布局算法顯示該元素。在此布局模式中,我們可以請(qǐng)求幾種不同類型的行為:BaB28資訊網(wǎng)——每日最新資訊28at.com

  • 靜態(tài)(Static)
  • 相對(duì)(Relative)
  • 絕對(duì)(Absolute)
  • 固定(Fixed)
  • 粘性(Sticky)

絕對(duì)定位元素往往因?yàn)樵谄渌胤綗o(wú)法正常工作而被認(rèn)為是一種hacky的解決方案。BaB28資訊網(wǎng)——每日最新資訊28at.com

還有一點(diǎn)需要注意,根據(jù)我們使用的值的不同,我們可能需要「考慮元素的父級(jí)」。例如,在絕對(duì)定位元素中,該元素相對(duì)于其最近的定位布局祖先定位。這意味著 CSS 將查找 HTML 樹并找到最近的一個(gè)祖先,「該祖先也使用了這些值之一」。如果找不到,則絕對(duì)定位元素將相對(duì)于視口定位。BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

彈性盒布局

當(dāng) display 屬性設(shè)置為 flex 時(shí),元素將根據(jù)彈性盒布局算法布置其子元素。BaB28資訊網(wǎng)——每日最新資訊28at.com

而它就是我們今天要講的重點(diǎn),下文中有更多的介紹。BaB28資訊網(wǎng)——每日最新資訊28at.com

如果想了解更多的Flex的細(xì)節(jié),可以參考w3c_flexbox[3]。BaB28資訊網(wǎng)——每日最新資訊28at.com

網(wǎng)格布局

網(wǎng)格與彈性盒類似,只要在元素上使用了 display: grid,就會(huì)開(kāi)始使用網(wǎng)格布局算法。此布局算法將根據(jù)網(wǎng)格布局算法顯示所有子元素。BaB28資訊網(wǎng)——每日最新資訊28at.com

Grid 和 Flexbox 的區(qū)別在于,Grid 適用于布局具有列和行的二維內(nèi)容,而 Flexbox 適用于布局具有「一維內(nèi)容」,即單個(gè)列或行。BaB28資訊網(wǎng)——每日最新資訊28at.com

我們后面也會(huì)有針對(duì)Grid的文章,預(yù)估在 12 月份或者明年 1 月份。BaB28資訊網(wǎng)——每日最新資訊28at.com

替換元素

在 CSS 中,替換元素(Replaced Element)是指一個(gè)由瀏覽器根據(jù)元素的標(biāo)簽和屬性創(chuàng)建的、在渲染時(shí)展示的元素,而「不是由文檔中的內(nèi)容決定其顯示的元素」。這些元素通常是具有外部資源(如圖像或嵌入式框架)的元素,其內(nèi)容由瀏覽器根據(jù)其屬性和上下文動(dòng)態(tài)生成。BaB28資訊網(wǎng)——每日最新資訊28at.com

以下是一些常見(jiàn)的替換元素:BaB28資訊網(wǎng)——每日最新資訊28at.com

「<img> 元素:」通過(guò)src屬性引用外部圖像。BaB28資訊網(wǎng)——每日最新資訊28at.com

<img src="image.jpg" alt="Description" />

「<audio> 和 <video> 元素:」通過(guò)src屬性引用外部音頻或視頻文件。BaB28資訊網(wǎng)——每日最新資訊28at.com

<audio controls>  <source src="audio.mp3" type="audio/mp3" /></audio><video width="320" height="240" controls>  <source src="movie.mp4" type="video/mp4" /></video>

「<iframe> 元素:」通過(guò)src屬性引用外部網(wǎng)頁(yè)或嵌入式內(nèi)容。BaB28資訊網(wǎng)——每日最新資訊28at.com

<iframe src="https://example.com"></iframe>

「<object> 元素:」用于嵌入外部資源,如 Flash 動(dòng)畫。BaB28資訊網(wǎng)——每日最新資訊28at.com

<object data="flash.swf" type="application/x-shockwave-flash">  <!-- fallback content or alternate content --></object>

「<canvas> 元素:」通過(guò) JavaScript 繪制圖形。BaB28資訊網(wǎng)——每日最新資訊28at.com

<canvas width="200" height="200"></canvas>

替換元素與非替換元素的主要區(qū)別在于,替換元素的渲染不依賴于文檔的其他部分。它們的外觀和尺寸通常由其屬性和外部資源決定。替換元素具有一定的固有尺寸,不受文本或子元素的影響。BaB28資訊網(wǎng)——每日最新資訊28at.com

在 CSS 中,替換元素還可以通過(guò) object-fit 和 object-position 這樣的屬性進(jìn)行進(jìn)一步控制,以指定元素的替換內(nèi)容的顯示方式。例如:BaB28資訊網(wǎng)——每日最新資訊28at.com

img {  object-fit: cover; /* 圖片按比例縮放并覆蓋整個(gè)容器 */  object-position: center; /* 圖片在容器中居中顯示 */}

2. Flexbox 是個(gè)啥?

CSS 由許多不同的布局算法組成,官方稱之為布局模式。「每種布局模式都是 CSS 中的一種小型子語(yǔ)言」。默認(rèn)布局模式是流式布局,但我們可以通過(guò)更改父容器上的display屬性來(lái)選擇使用Flexbox:BaB28資訊網(wǎng)——每日最新資訊28at.com

display:blockdisplay:blockBaB28資訊網(wǎng)——每日最新資訊28at.com

display:flexdisplay:flexBaB28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)我們將 display 設(shè)置為 flex 時(shí),我們創(chuàng)建了一個(gè)flex格式化上下文。這意味著,默認(rèn)情況下,「所有子元素將根據(jù) Flexbox 布局算法定位」。BaB28資訊網(wǎng)——每日最新資訊28at.com

每種布局算法都是為解決特定問(wèn)題而設(shè)計(jì)的。默認(rèn)的Flow布局旨在創(chuàng)建數(shù)字文檔;它本質(zhì)上是Microsoft Word的布局算法。「標(biāo)題和段落以塊的形式垂直堆疊,而文本、鏈接和圖像等元素則不顯眼地位于這些塊內(nèi)部」。BaB28資訊網(wǎng)——每日最新資訊28at.com

Flexbox專注于在行或列中排列一組項(xiàng)目,并提供對(duì)這些項(xiàng)目的分布和對(duì)齊具有極大控制權(quán)。正如其名稱所示,F(xiàn)lexbox關(guān)注的是靈活性。我們可以控制項(xiàng)目是增長(zhǎng)還是收縮,額外空間如何分配等。BaB28資訊網(wǎng)——每日最新資訊28at.com

3. Flex Direction

如前所述,F(xiàn)lexbox的關(guān)鍵在于「控制在行或列中元素的分布」。默認(rèn)情況下,項(xiàng)目將在「一行中側(cè)邊堆疊」,但我們可以通過(guò)使用flex-direction屬性切換到列:BaB28資訊網(wǎng)——每日最新資訊28at.com

flex-direction:rowflex-direction:rowBaB28資訊網(wǎng)——每日最新資訊28at.com

flex-direction:columnflex-direction:columnBaB28資訊網(wǎng)——每日最新資訊28at.com

使用flex-direction: row時(shí),「主軸水平運(yùn)行,從左到右」。當(dāng)我們切換到flex-direction: column時(shí),「主軸垂直運(yùn)行,從上到下」。BaB28資訊網(wǎng)——每日最新資訊28at.com

在Flexbox中,一切都「基于主軸」。算法不關(guān)心垂直/水平,甚至不關(guān)心行/列。所有規(guī)則都圍繞這個(gè)主軸以及垂直運(yùn)行的交叉軸結(jié)構(gòu)。BaB28資訊網(wǎng)——每日最新資訊28at.com

我們可以輕松切換水平布局到垂直布局。所有規(guī)則都會(huì)「自動(dòng)適應(yīng)」。這個(gè)特性是 Flexbox 布局模式獨(dú)有的。BaB28資訊網(wǎng)——每日最新資訊28at.com

子元素將「默認(rèn)」根據(jù)以下兩個(gè)規(guī)則定位:BaB28資訊網(wǎng)——每日最新資訊28at.com

  1. 主軸(Primary Axis):子元素將「緊密」排列在容器的「起始位置」。
  2. 交叉軸(Cross Axis):子元素將「伸展」以「填充整個(gè)容器」。

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

在Flexbox中,我們決定主軸是水平運(yùn)行還是垂直運(yùn)行。這是「所有 Flexbox 計(jì)算的基準(zhǔn)」。BaB28資訊網(wǎng)——每日最新資訊28at.com

4. 對(duì)齊(Alignment)

我們可以使用justify-content屬性來(lái)改變「子元素沿主軸」的分布方式:BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

由于主軸是row和column的情況很類似,下文中我們都按主軸為row來(lái)講解BaB28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)涉及到主軸時(shí),我們通常不考慮對(duì)齊單個(gè)子元素。相反,重點(diǎn)是關(guān)于整個(gè)組的分布。BaB28資訊網(wǎng)——每日最新資訊28at.com

我們可以將所有項(xiàng)目緊密堆疊在特定位置(使用flex-start、center和flex-end),或者我們可以將它們分開(kāi)(使用space-between、space-around和space-evenly)。BaB28資訊網(wǎng)——每日最新資訊28at.com

對(duì)于交叉軸,情況有些不同。我們使用align-items屬性:BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

在align-items中,有一些與justify-content相同的選項(xiàng),但并「沒(méi)有完全的重疊」。BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

為什么它們不共享相同的選項(xiàng)呢?我們將很快揭開(kāi)這個(gè)謎團(tuán),但首先,我需要分享另一個(gè)對(duì)齊屬性:align-self。BaB28資訊網(wǎng)——每日最新資訊28at.com

與justify-content和align-items不同,align-self應(yīng)用于子元素,而不是容器。它允許我們沿著交叉軸改變特定子元素的對(duì)齊方式:BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

align-self具有與align-items完全相同的值。實(shí)際上,它們改變的是完全相同的內(nèi)容。BaB28資訊網(wǎng)——每日最新資訊28at.com

align-items是一種語(yǔ)法糖,是一種方便的簡(jiǎn)寫,可以「一次性自動(dòng)設(shè)置所有子元素的對(duì)齊方式」。BaB28資訊網(wǎng)——每日最新資訊28at.com

Content VS items

在 Flexbox 中,項(xiàng)目沿著主軸分布。「默認(rèn)情況下,它們很好地排列在一起,側(cè)邊相鄰」。我可以畫一條直線,將所有子元素串起來(lái),就像烤肉一樣:BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

然而,交叉軸是不同的。「一條垂直的直線只會(huì)與其中一個(gè)子元素相交」。BaB28資訊網(wǎng)——每日最新資訊28at.com

這更像是垂直方向用牙簽串的烤腸,而不是烤肉串:BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

這里有一個(gè)顯著的區(qū)別。對(duì)于烤腸而言,「每個(gè)項(xiàng)目都可以沿著它的棍子移動(dòng),而不會(huì)干擾其他項(xiàng)目」:BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

相比之下,通過(guò)我們的主軸串聯(lián)每個(gè)兄弟元素,一個(gè)單獨(dú)的項(xiàng)目如果要移動(dòng)位置,那勢(shì)必會(huì)影響周圍兄弟元素的。BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

這是主軸和交叉軸之間的基本區(qū)別。當(dāng)我們討論交叉軸上的對(duì)齊時(shí),每個(gè)項(xiàng)目都可以隨心所欲。然而,在主軸上,我們「只能考慮如何分配整個(gè)組」。BaB28資訊網(wǎng)——每日最新資訊28at.com

針對(duì)上面的內(nèi)容,我們可以給出一個(gè)正確的定義:BaB28資訊網(wǎng)——每日最新資訊28at.com

  • justify — 沿「主軸定位」某物。
  • align — 沿「交叉軸定位」某物。
  • content — 「一組」可以被分配的“東西”。
  • items — 可以「單獨(dú)定位」的單個(gè)項(xiàng)目。

因此:我們有justify-content來(lái)控制沿主軸分配整個(gè)組,我們有align-items來(lái)沿交叉軸單獨(dú)定位每個(gè)項(xiàng)目。這是我們用來(lái)管理 Flexbox 布局的兩個(gè)主要屬性。BaB28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)涉及到主軸時(shí),我們必須將項(xiàng)目視為一個(gè)組,作為可以分配的內(nèi)容。BaB28資訊網(wǎng)——每日最新資訊28at.com

5. 假設(shè)大小(Hypothetical size)

假設(shè)我有以下的 CSS:BaB28資訊網(wǎng)——每日最新資訊28at.com

.item {  width: 2000px;}

我們第一直覺(jué)就是「我們將得到一個(gè)寬度為 2000 像素的項(xiàng)目」。其實(shí)這句話是不對(duì)的!BaB28資訊網(wǎng)——每日最新資訊28at.com

讓我們用一個(gè)例子來(lái)說(shuō)明。BaB28資訊網(wǎng)——每日最新資訊28at.com

<style>  .flex-wrapper {    display: flex;  }  .item {    width: 2000px;  }</style><div class="item"></div><div class="flex-wrapper">  <div class="item"></div></div>

結(jié)果缺不一樣。BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

兩個(gè)項(xiàng)目都應(yīng)用了完全相同的 CSS。它們都有width: 2000px。然而,第一個(gè)項(xiàng)目比第二個(gè)項(xiàng)目寬得多!BaB28資訊網(wǎng)——每日最新資訊28at.com

差異在于「布局模式」。第一個(gè)項(xiàng)目是使用流式布局(flow)渲染的,在流式布局中,width是一個(gè)「硬性約束」。當(dāng)我們?cè)O(shè)置width: 2000px時(shí),我們肯定能到一個(gè)寬度為 2000 像素的元素,即使它已經(jīng)超過(guò)當(dāng)前視口的寬度。BaB28資訊網(wǎng)——每日最新資訊28at.com

然而,在 Flexbox 中,width屬性的實(shí)現(xiàn)方式不同。這「更像是一個(gè)建議而不是硬性約束」。BaB28資訊網(wǎng)——每日最新資訊28at.com

規(guī)范對(duì)此有一個(gè)名字:「假設(shè)大小」(Hypothetical size)。BaB28資訊網(wǎng)——每日最新資訊28at.com

在這種情況下,限制因素是父元素沒(méi)有足夠的空間容納一個(gè)寬度為 2000px 的子元素。因此,子元素的大小被縮小,以「適應(yīng)空間」。BaB28資訊網(wǎng)——每日最新資訊28at.com

這是 Flexbox 哲學(xué)的核心部分。「事物是流動(dòng)和靈活的,可以根據(jù)世界的限制進(jìn)行調(diào)整」。BaB28資訊網(wǎng)——每日最新資訊28at.com

6. 增長(zhǎng)(Grow)和萎縮(Shrink)

要真正了解 Flexbox 的流動(dòng)性,我們需要討論三個(gè)屬性:flex-grow、flex-shrink和flex-basis。BaB28資訊網(wǎng)——每日最新資訊28at.com

flex-basis

在 Flex行中,flex-basis的作用與width相同。在 Flex 列中,flex-basis的作用與height相同。BaB28資訊網(wǎng)——每日最新資訊28at.com

「Flexbox 中的一切都與主/交叉軸有關(guān)」。例如,justify-content將沿主軸分布子元素,無(wú)論主軸是水平還是垂直,它的工作方式都完全相同。BaB28資訊網(wǎng)——每日最新資訊28at.com

然而,width和height不遵循此規(guī)則!width「始終會(huì)影響水平尺寸」。當(dāng)我們將flex-direction從row切換到column時(shí),它不會(huì)突然變成height。BaB28資訊網(wǎng)——每日最新資訊28at.com

因此,F(xiàn)lexbox 創(chuàng)建了一個(gè)通用的“大小”屬性,稱為flex-basis。它就像width或height,但與其他所有屬性一樣,「與主軸相關(guān)聯(lián)」。它允許我們?cè)O(shè)置元素在主軸方向上的假設(shè)大小,無(wú)論這是水平還是垂直。BaB28資訊網(wǎng)——每日最新資訊28at.com

下圖集中,每個(gè)子元素都被賦予了flex-basis: 50px,但可以調(diào)整第一個(gè)子元素的flex-basis。BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

就像我們?cè)趙idth中看到的那樣,flex-basis更像「是一個(gè)建議而不是一個(gè)硬性約束」。在某個(gè)時(shí)候,所有元素都沒(méi)有足夠的空間來(lái)保持它們被分配的大小,因此「它們必須妥協(xié),以避免溢出」。BaB28資訊網(wǎng)——每日最新資訊28at.com

一般來(lái)說(shuō),在 Flex 行中,我們可以互換使用width和flex-basis,但也有一些例外情況。例如,width屬性對(duì)替換元素(如圖像)的影響與flex-basis不同。此外,width可以將項(xiàng)目減小到其最小尺寸以下,而flex-basis則不能。BaB28資訊網(wǎng)——每日最新資訊28at.com

flex-grow

默認(rèn)情況下,F(xiàn)lex 上下文中的元素將縮小到它們?cè)谥鬏S上的「最小舒適尺寸」。這通常「會(huì)創(chuàng)建額外的空間」。BaB28資訊網(wǎng)——每日最新資訊28at.com

我們可以使用flex-grow屬性指定如何使用該空間:BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

flex-grow的「默認(rèn)值是 0」,這意味著增長(zhǎng)是可選的。如果我們希望「子元素吞并容器中的任何額外空間」,我們需要明確告訴它。BaB28資訊網(wǎng)——每日最新資訊28at.com

如果多個(gè)子元素設(shè)置了flex-grow怎么辦?在這種情況下,「額外的空間將根據(jù)它們的flex-grow值成比例地分配給子元素」。BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)單個(gè)子元素被賦予正的flex-grow值時(shí),它將「吞并所有額外的空間」。在這種情況下,數(shù)字是無(wú)關(guān)緊要的:1 和 1000 具有相同的效果。BaB28資訊網(wǎng)——每日最新資訊28at.com

flex-shrink

在我們迄今為止看到的大多數(shù)示例中,我們有額外的空間可以使用。如果我們的子元素太大而父容器無(wú)法容納怎么辦?BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

<<< 左右滑動(dòng)見(jiàn)更多 >>>BaB28資訊網(wǎng)——每日最新資訊28at.com

兩個(gè)項(xiàng)目都會(huì)收縮,但它們會(huì)「按比例收縮」。第一個(gè)子元素始終是第二個(gè)子元素寬度的 2 倍。BaB28資訊網(wǎng)——每日最新資訊28at.com

flex-basis和width設(shè)置了元素的假設(shè)大小。Flexbox算法可能會(huì)「將元素收縮到低于這個(gè)期望大小」,但「默認(rèn)情況下,它們將始終按比例縮放,保持兩個(gè)元素之間的比例」。BaB28資訊網(wǎng)——每日最新資訊28at.com

如果我們不希望元素按比例縮小,可以使用flex-shrink屬性。BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)在我們有兩個(gè)子元素,每個(gè)都有一個(gè)假設(shè)大小為 250px。容器至少需要 500px 寬度,以便將這些子元素以其假設(shè)大小容納其中。BaB28資訊網(wǎng)——每日最新資訊28at.com

假設(shè)我們將容器縮小到 400px。嗯,我們不能把 500px 的內(nèi)容塞進(jìn)一個(gè) 400px 的袋子里!我們有 100px 的虧空。為了使它們適應(yīng),我們的元素將需要放棄總共 100px。BaB28資訊網(wǎng)——每日最新資訊28at.com

flex-shrink屬性讓我們決定如何處理這個(gè)虧空。BaB28資訊網(wǎng)——每日最新資訊28at.com

與flex-grow類似,它是一個(gè)比例。「默認(rèn)情況下,兩個(gè)子元素的flex-shrink都是 1,因此每個(gè)子元素消化虧空的一半」。它們各自放棄 50px,它們的實(shí)際大小從 250px 縮小到 200px。BaB28資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)在,假設(shè)我們將第一個(gè)子元素提高到flex-shrink: 3:BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

我們總的虧空是 100px。通常,每個(gè)子元素將支付 1/2,但由于我們已經(jīng)調(diào)整了flex-shrink,第一個(gè)元素最終支付了 3/4(75px),第二個(gè)元素支付了 1/4(25px)。BaB28資訊網(wǎng)——每日最新資訊28at.com

「絕對(duì)值并不重要,一切都取決于比例」。如果兩個(gè)子元素都具有flex-shrink: 1,每個(gè)子元素將支付總虧空的 1/2。如果兩個(gè)子元素都增加到flex-shrink: 1000,每個(gè)子元素將支付總虧空的 1000/2000。無(wú)論如何,最終效果都是相同的。BaB28資訊網(wǎng)——每日最新資訊28at.com

對(duì)flex-shrink:我們可以將其視為flex-grow的“反面”。它們是同一硬幣的兩面:BaB28資訊網(wǎng)——每日最新資訊28at.com

  • flex-grow 控制當(dāng)項(xiàng)目小于其容器時(shí)額外空間的「分配方式」。
  • flex-shrink 控制項(xiàng)目大于其容器時(shí)空間的「移除方式」。

這意味著這兩個(gè)屬性中只能有一個(gè)生效。如果有額外的空間,flex-shrink沒(méi)有影響,因?yàn)轫?xiàng)目不需要縮小。如果子元素太大而無(wú)法容納,flex-grow沒(méi)有影響,因?yàn)闆](méi)有額外的空間可分配。BaB28資訊網(wǎng)——每日最新資訊28at.com

防止縮小

有時(shí),我們不希望 Flex 子元素縮小。BaB28資訊網(wǎng)——每日最新資訊28at.com

讓我們看一個(gè)例子:BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)容器變窄時(shí),我們的兩個(gè)圓形被擠變形了。如果我們希望它們保持圓形怎么辦?BaB28資訊網(wǎng)——每日最新資訊28at.com

我們可以通過(guò)設(shè)置flex-shrink: 0來(lái)實(shí)現(xiàn):BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)我們將flex-shrink設(shè)置為 0 時(shí),實(shí)質(zhì)上我們「完全退出了縮小過(guò)程」。Flexbox 算法將flex-basis(或width)視為硬最小限制。BaB28資訊網(wǎng)——每日最新資訊28at.com

7. 最小尺寸的陷阱

假設(shè)我們正在構(gòu)建一個(gè)搜索表單:BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)容器縮小到一定程度以下時(shí),內(nèi)容溢出!BaB28資訊網(wǎng)——每日最新資訊28at.com

「根本原因是flex-shrink 的默認(rèn)值是 1」,我們?cè)谑纠性O(shè)置了該屬性,按道理輸入框應(yīng)該能夠縮小到它需要的程度!但是卻事與愿違。BaB28資訊網(wǎng)——每日最新資訊28at.com

原因是:除了假設(shè)大小之外,F(xiàn)lexbox 算法還關(guān)心另一個(gè)重要的大小:「最小大小」。BaB28資訊網(wǎng)——每日最新資訊28at.com

Flexbox算法拒絕將子元素縮小到其最小大小以下。無(wú)論我們?nèi)绾卧黾觙lex-shrink,內(nèi)容將溢出而不是繼續(xù)縮小!BaB28資訊網(wǎng)——每日最新資訊28at.com

文本輸入框的默認(rèn)最小大小為 170px-200px(在不同的瀏覽器之間有所變化)。BaB28資訊網(wǎng)——每日最新資訊28at.com

在其他情況下,限制因素可能是元素的內(nèi)容。BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

對(duì)于包含文本的元素,最小寬度是最長(zhǎng)不可斷開(kāi)的字符串的長(zhǎng)度。BaB28資訊網(wǎng)——每日最新資訊28at.com

好消息是:我們可以「使用min-width屬性重新定義最小大小」。BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

通過(guò)直接在 Flex 子元素上設(shè)置min-width: 0px,我們告訴 Flexbox 算法覆蓋內(nèi)置的最小寬度。因?yàn)槲覀儗⑵湓O(shè)置為 0px,所以元素可以縮小到必要的程度。BaB28資訊網(wǎng)——每日最新資訊28at.com

8. 間距

gap允許我們?cè)诿總€(gè) Flex 子元素之間創(chuàng)建空間。BaB28資訊網(wǎng)——每日最新資訊28at.com

這對(duì)于諸如導(dǎo)航標(biāo)題之類的東西非常有用:BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

自動(dòng)邊距

margin屬性用于在特定元素周圍添加空間。在某些布局模式中,如 Flow 和Positioned(前面都有過(guò)介紹),它甚至可以用于通過(guò)margin: auto將元素居中。BaB28資訊網(wǎng)——每日最新資訊28at.com

在 Flexbox 中,自動(dòng)邊距變得更加有趣:BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

「自動(dòng)邊距將吞噬額外的空間,并將其應(yīng)用于元素的邊距」。它使我們能夠精確控制在哪里分配額外的空間。BaB28資訊網(wǎng)——每日最新資訊28at.com

一個(gè)常見(jiàn)的頁(yè)眉布局特點(diǎn)是在一側(cè)放置標(biāo)志,而在另一側(cè)放置一些導(dǎo)航鏈接。BaB28資訊網(wǎng)——每日最新資訊28at.com

<style>  ul {    display: flex;    gap: 12px;  }  li.logo {    margin-right: auto;  }</style><nav>  <ul>    <li class="logo">      <a href="/"> 首頁(yè) </a>    </li>    <li>      <a href=""> 語(yǔ)言 </a>    </li>    <li>      <a href=""> 個(gè)人中心 </a>    </li>  </ul></nav>
ul {  list-style-type: none;}ul a {  text-decoration: none;}

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

列表中的第一項(xiàng)通過(guò)給它設(shè)置margin-right: auto,我們「聚集了所有額外的空間,并強(qiáng)制將其放在第一項(xiàng)和第二項(xiàng)之間」。BaB28資訊網(wǎng)——每日最新資訊28at.com

使用瀏覽器devtool來(lái)查看元素信息。BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

9. 包裹

到目前為止,我們的所有項(xiàng)目都是并排或縱列的。flex-wrap屬性允許我們改變這一點(diǎn)。BaB28資訊網(wǎng)——每日最新資訊28at.com

如果容器寬度不能包含子元素的話,子元素會(huì)被隱藏。BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

我們可以通過(guò)設(shè)置flex-wrap:wrap來(lái)讓子元素自動(dòng)換行。BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)我們?cè)O(shè)置flex-wrap: wrap時(shí),項(xiàng)目不會(huì)收縮到其假設(shè)大小以下。BaB28資訊網(wǎng)——每日最新資訊28at.com

使用flex-wrap: wrap,我們「不再有一個(gè)可以穿過(guò)每個(gè)項(xiàng)目的單一主軸線」。實(shí)際上,「每一行都充當(dāng)其自己的小型 Flex 容器」。BaB28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)我們有多行時(shí),交叉軸現(xiàn)在可能與多個(gè)項(xiàng)目相交!BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

每一行都是其自己的小型 Flexbox 環(huán)境。align-items將在包圍每一行的無(wú)形框內(nèi)上下移動(dòng)每個(gè)項(xiàng)目。BaB28資訊網(wǎng)——每日最新資訊28at.com

但如果我們想對(duì)齊行本身怎么辦?我們可以使用align-content屬性:BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片BaB28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)一下這里發(fā)生的情況:BaB28資訊網(wǎng)——每日最新資訊28at.com

  • flex-wrap: wrap給我們兩行東西。
  • 在每一行內(nèi),align-items允許我們將每個(gè)單獨(dú)的子項(xiàng)上下滑動(dòng)。
  • 然而,在整體上,我們有兩行在一個(gè)單一的 Flex 上下文內(nèi)!現(xiàn)在,交叉軸將與兩行相交,而不是一行。因此,我們不能單獨(dú)移動(dòng)行,我們需要將它們作為一個(gè)組進(jìn)行分配。
  • 使用我們上面的定義,我們正在處理內(nèi)容,而不是項(xiàng)目。但我們?nèi)匀辉谡務(wù)摻徊孑S!因此,我們想要的屬性是align-content。

Reference

[1]Flex 布局教程:語(yǔ)法篇:https://www.ruanyifeng.com/blog/2015/07/flex-grammar.htmlBaB28資訊網(wǎng)——每日最新資訊28at.com

[2]MDN_CSS_Layout_Mode:https://developer.mozilla.org/en-US/docs/Web/CSS/Layout_modeBaB28資訊網(wǎng)——每日最新資訊28at.com

[3]w3c_flexbox:https://www.w3.org/TR/css-flexbox-1/BaB28資訊網(wǎng)——每日最新資訊28at.com

BaB28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-38512-0.htmlCSS_Flex 那些鮮為人知的內(nèi)幕

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: Vitest 1.0 正式發(fā)布:Vue 團(tuán)隊(duì)打造的下一代測(cè)試框架!

下一篇: 理解 Wasm 基礎(chǔ)概念,了解 Wasm 是如何被加載運(yùn)行的?

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 6月iOS設(shè)備好評(píng)榜:第一蟬聯(lián)榜首近一年

    作為安兔兔各種榜單里變化最小的那個(gè),2023年6月的iOS好評(píng)榜和上個(gè)月相比沒(méi)有任何排名上的變化,僅僅是部分設(shè)備好評(píng)率的下降,長(zhǎng)年累月的用戶評(píng)價(jià)和逐漸退出市場(chǎng)的老款機(jī)器讓這
  • 三言兩語(yǔ)說(shuō)透設(shè)計(jì)模式的藝術(shù)-簡(jiǎn)單工廠模式

    一、寫在前面工廠模式是最常見(jiàn)的一種創(chuàng)建型設(shè)計(jì)模式,通常說(shuō)的工廠模式指的是工廠方法模式,是使用頻率最高的工廠模式。簡(jiǎn)單工廠模式又稱為靜態(tài)工廠方法模式,不屬于GoF 23種設(shè)計(jì)
  • 三言兩語(yǔ)說(shuō)透設(shè)計(jì)模式的藝術(shù)-單例模式

    寫在前面單例模式是一種常用的軟件設(shè)計(jì)模式,它所創(chuàng)建的對(duì)象只有一個(gè)實(shí)例,且該實(shí)例易于被外界訪問(wèn)。單例對(duì)象由于只有一個(gè)實(shí)例,所以它可以方便地被系統(tǒng)中的其他對(duì)象共享,從而減少
  • 學(xué)習(xí)JavaScript的10個(gè)理由...

    作者 | Simplilearn編譯 | 王瑞平當(dāng)你決心學(xué)習(xí)一門語(yǔ)言的時(shí)候,很難選擇到底應(yīng)該學(xué)習(xí)哪一門,常用的語(yǔ)言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 三言兩語(yǔ)說(shuō)透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是兩種很有用的技術(shù),可以幫助我們寫出更加優(yōu)雅、泛用的函數(shù)。本文將首先介紹柯里化和反柯里化的概念、實(shí)現(xiàn)原理和應(yīng)用
  • “又被陳思誠(chéng)騙了”

    作者|張思齊 出品|眾面(ID:ZhongMian_ZM)如今的國(guó)產(chǎn)懸疑電影,成了陳思誠(chéng)的天下。最近大爆電影《消失的她》票房突破30億斷層奪魁暑期檔,陳思誠(chéng)再度風(fēng)頭無(wú)兩。你可以說(shuō)陳思誠(chéng)的
  • 阿里大調(diào)整

    來(lái)源:產(chǎn)品劉有媒體報(bào)道稱,近期淘寶天貓集團(tuán)啟動(dòng)了近年來(lái)最大的人力制度改革,涉及員工績(jī)效、層級(jí)體系等多個(gè)核心事項(xiàng),目前已形成一個(gè)初步的&ldquo;征求意見(jiàn)版&rdquo;:1、取消P序列
  • 三星Galaxy Z Fold5今日亮相:厚度縮減但仍略顯厚重

    據(jù)官方此前宣布,三星將于7月26日也就是今天在韓國(guó)首爾舉辦Unpacked活動(dòng),屆時(shí)將帶來(lái)帶來(lái)包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • 中關(guān)村論壇11月25日開(kāi)幕,15位諾獎(jiǎng)級(jí)大咖將發(fā)表演講

    11月18日,記者從2022中關(guān)村論壇新聞發(fā)布會(huì)上獲悉,中關(guān)村論壇將于11月25至30日在京舉行。本屆中關(guān)村論壇由科學(xué)技術(shù)部、國(guó)家發(fā)展改革委、工業(yè)和信息化部、國(guó)務(wù)
Top