理解CSS的浮動Float
當前位置:點晴教程→點晴OA辦公管理信息系統
→『 經驗分享&問題答疑 』
前言提到浮動,前端的小伙伴肯定都不陌生,但是隨著彈性布局等等一些更好用的標準出來后,用在布局方面少了很多,當初我剛開始接觸前端的時候,很習慣用浮動來給元素改變定位,當時還并不是很流行flexbox布局,很多布局會通過浮動來實現,但是使用浮動來布局會產生一些副作用,比如雖然使用浮動可以使元素向左或向右靠齊,但會造成高度坍塌,當時的我并不太了解其中的緣由,只是機械地從網上搜索到一些解決高度坍塌的代碼,到現在也不能算是了解的很透徹,只能算是比剛開始做前端的時候多了解了一點。 脫離文檔流在說到浮動的時候,很多地方都會說,它們脫離了文檔流,那么正常情況下文檔流是怎么樣的呢? 寫過HTML的小伙伴應該都了解,HTML中的元素應用的是默認的流式布局;假設頁面上有一個 應用了浮動的元素就不受流式布局的控制了。比如應用了 那么浮動有什么特點,清除浮動又是什么意思呢? 浮動前端有幾個較為有名的布局方式,比如圣杯布局、雙飛翼布局等等,使用 我們可以把文檔想象成一個水面,而浮動元素就好比是浮在水面上的船。水波環繞船體,就像浮動元素被其他內容環繞一樣。比如下面這張圖: 設計
這里流動的內容就可以比作流動的水,所以我們經常能看到使用 只能說早些時候的CSS還不夠完善,不能滿足一些特殊的布局需求,而 當使用
float會影響所在行的行方框,也就是 清除浮動在使用浮動用于布局之后,我們常常需要清除浮動,那么清除浮動是什么意思呢?這里可以繼續用前面浮在水面上的船來舉例子,雖然可能不算很貼切。 船在水面上是浮動著的,隨著水流的作用會飄移,那么就有可能飄移到其他的水域,清除浮動就類似于阻止這艘船飄移,比如安裝一道閘門,防止船飄進來或飄出去。通過設置特定的css屬性來清除浮動,就類似于這里的安裝閘門。 創建BFC容器之前在《對BFC的理解》中我們有提到過,可以通過創建BFC容器的方式來清除浮動,比如設置 假設有以下一段HTML: <div style="width: 100px; height: 100px; border: 1px solid orange; float: left;"> <span>文本文本111文本文本111文本文本111</span> </div> <div style="width: 100px; height: 100px; background: pink; "> <span>文本文本222</span> </div> 在未清除浮動前是這樣的: 可以看到, 將第一個div用BFC容器包裹后(類似于閘門的作用): <div style="display: flow-root;"> <div style="width: 100px; height: 100px; border: 1px solid orange; float: left;"> <span>文本文本111文本文本111文本文本111</span> </div> </div> <div style="width: 100px; height: 100px; background: pink;"> <span>文本文本222</span> </div> 頁面就變成了下面這個樣子: 使用clear屬性可以看到在規范文檔中,還直接提供了一個
創建BFC的方式可以類比為上游水域在下游口安裝了閘門,使用 <div style="width: 100px; height: 100px; border: 1px solid orange; float: left;"> <span>文本文本111文本文本111文本文本111</span> </div> <div style="width: 100px; height: 100px; background: pink; clear: left;"> <span>文本文本222</span> </div> 可以看到,最終效果和上面創建BFC的效果是一樣的。但實際我之前看到的解決浮動的方案中,比較推薦的做法是由浮動的元素這邊來處理清除,比如創建BFC容器,或者加在偽元素 <div id="float-box"> <div style="width: 100px; height: 100px; border: 1px solid orange; float: left;"> <span>文本文本111文本文本111文本文本111</span> </div> </div> <style> #float-box::after { content: ''; display: block; clear: left; } </style> <div style="width: 100px; height: 100px; background: pink;"> <span>文本文本222</span> </div> 上面的代碼中使用
根據文檔里的描述, 但是規范文檔中也提示我們,使用
在《對BFC的理解》中,我們提到過,在BFC容器中,相鄰塊級盒子之間的垂直'margin'會折疊。這里的意思應該就是指,設置了 文檔中給出了間隙的值是怎么計算得出的:
光從描述上看,有點抽象,尤其是第二種計算,這里所謂的假設位置是哪里呢?第一種似乎好理解一些,就是讓兩個邊緣對齊的一個間隔的量。所以文檔中也舉了例子來配合解說。
從名稱就可以看出,F是個浮動塊高度為H,此時B1有個bottom margin值為M1,B2有個top margin值為M2,在B2未設置clear屬性之前,B1和B2之間的間距為M1和M2中的較大值,也就是產生了垂直 假設B1的底部邊框在y=0這個位置,就如上圖所示,此時浮動框F的頂部位置就在y=M1的位置,而B2的頂部邊框就在y=max(M1,M2)的位置,浮動框F的底部位置在y=M1+H的位置。 在這個例子中,B2不在F下面,這個例子所描述的就是需要添加間隙的場景。也就是說:
根據文檔中描述的計算方式,這里需要計算兩次間隙量,C1和C2,然后取兩者中的較大值:C = 第一種方法是使 B2 的頂部與 F 的底部齊平,即 y(top of B2) = M1 + H。這意味著margin不再折疊(B1和B2的間距肯定大于M1和M2),它們之間有了間隙: 此時它們的等式關系為: F的底部 = B2的頂部邊框 M1 + H = M1 + C1 + M2 C1 = M1 + H - M1 - M2 = H - M2 第二中計算是保持 B2 的頂部位置,即 y(top of B2) = max(M1,M2)。也就是B2邊框在其假設位置,按照預期保持垂直 max(M1, M2) = M1 + C2 + M2 C2 = max(M1, M2) - M1 - M2 因為假設了 C2 = max(M1, M2) - M1 - M2 < M1 + H - M1 - M2 = H - M2 C2 < H1 - M2 又因為
<p style="margin-bottom: 4em"> First paragraph.</p> <p style="float: left; height: 2em; margin: 0"> Floating paragraph.</p> <p style="clear: left; margin-top: 3em"> Last paragraph.</p> 在最后一個 當我們設置 c + m-t = 2em c = 2em - m-t = 2em - 3em = -1em 第一種方式計算C1 = H - M2 = 2em - 3em = -1em 第二種計算方式,也就是保持 最后一個 所以最后C=max(C1,C2)=-1em。 從上面兩個例子可以看出,間隙量的兩種計算方式的區別就在于,是否改變浮動框后續元素的頂部位置。 總結隨著彈性布局、網格布局等一系列新的布局方式引入后,浮動的使用少了很多,但它仍然能實現特殊的網頁效果,因此我們還是需要對它進行必要的了解。 本文來自博客園,作者:beckyye,轉載請注明原文鏈接:https://www.cnblogs.com/beckyyyy/p/18032321 該文章在 2024/2/27 9:19:10 編輯過 |
關鍵字查詢
相關文章
正在查詢... |