摘要:原因是因為沒有預先設置高度,所以高度由其包含的子元素高度決定。而浮動脫離文檔流,所以子元素并不會被計算高度。此時的中,相當于中子元素高度為,所以發生了父元素高度塌陷現象。因為凡是能創建一個,就能達到包裹浮動子元素的效果。
浮動具有以下特性:
蓋不住的文本
浮動元素后面不是塊級元素,后面的元素將會和它并排(除非設置了元素的寬度,并且屏幕放不下時將會換行)
浮動元素的上一個元素如果沒有浮動,浮動只在當前行浮動;當浮動遇到浮動,它們將在一行排序,除非沒有位置了
當元素設置定位值為absolute、fixed時,浮動將被忽略
float引起父元素高度塌陷
浮動元素會被后一個元素的margin-top影響
蓋不住的文本item1item2
可以看到,item2的div除了文本,其他的內容都看不見了,因為它跑到item1下面了。為什么文字不會被浮動的元素蓋住呢?因為浮動的本質就是用來實現文字環繞的。
從上面也可以得出:浮動元素后面的塊級元素會占據浮動元素的位置,并且浮動元素總是在標準流元素上面。
浮動元素后面不是塊級元素,后面的元素將會和它并排(除非設置了元素的寬度,并且屏幕放不下時將不會換行)浮動元素的上一個元素如果沒有浮動,浮動只在當前行浮動;當浮動遇到浮動,它們將在一行排序,除非沒有位置了item1item2
item1item2item3
item1item2item3item4
可以設置width為百分比來實現自適應
div{ width:25%; height:100px; float: left; }當元素設置定位值為absolute、fixed時,浮動將被忽略
行內元素使用浮動以后生成一個塊框,因此它就可以使用width,height,margin,padding等屬性了浮動遇上定位
item1float引起父元素高度塌陷item2
在網頁設計中,很常見的一種情況是給內容一個div作為包裹容器,而這個包裹容器不設置高度,而是讓里面的內容撐開包裹容器的高度。如果不給子元素設置浮動的話,并不會出現什么問題,而一旦給子元素設置了浮動,父元素會無法自適應浮動元素的高度,會出現父元素高度為0,從而背景色什么的都不能展示了。原因是:
因為沒有預先設置div高度,所以div高度由其包含的子元素高度決定。而浮動脫離文檔流,所以子元素并不會被計算高度。此時的div中,相當于div中子元素高度為0,所以發生了父元素高度塌陷現象。
解決辦法,
1.給父元素增加“overflow:hidden"
當然也可以是"overflow:auto"。但為了兼容IE最好用overflow:hidden。
.box{ overflow:hidden; }
那么為什么“overflow:hidden"會解決這個問題呢?
是因為“overflow:hidden”會觸發BFC,BFC反過來決定了"height:auto"是如何計算的
,即計算BFC的高度時,浮動元素也參與計算,因此此時父元素會自適應浮動元素的高度。
所以呢,也可以設置"display:inline-block"、"position:absolute"、"float:left"來解決父元素高度坍塌的問題。因為凡是能創建一個BFC,就能達到包裹浮動子元素的效果。因此網上都說成“BFC能包裹浮動元素”.
2.在父元素內容的后面或者前面增加偽元素+清除浮動
可以給父元素的內容添加一個偽元素,可以用::before或者::after,然后內容為空,這樣就不會占據位置,最后為偽元素加上“clear:both"來清除浮動。
為什么這樣可以呢?
弄清原因需要知道兩點:一是偽元素的實際作用,二是css的清除浮動(clear)只能影響使用清除的元素本身,不能影響其他元素,并且清除浮動可以理解為打破橫向排列。
首先需要搞清除::after和::before起的作用,它們不是在一個元素的后面或者前面插入一個偽元素,而是會在元素內容后面或者前面插入一個偽元素(是在元素里面),之前我一直以為:before和:after偽元素 插入的內容會被注入到目標元素的前或后注入,其實注入的內容將是有關聯的目標元素的子元素,但它會被置于這個元素的任何內容的“前”或“后”。我們來舉個例子,可以看到.box的高度為300px,說明兩個偽元素已經插入到.box內容里了。
綜上,所以我們常用下列方式來清除浮動
.box::after{ content:""; display:block; clear:both; } 或者 .box::before{ content:""; display:block; clear:both; } 或者 .box::before,.box::after{ content:""; display:block; clear:both; } //::before和::after必須配合content屬性來使用,content用來定義插入的內容,content必須有值,至少是空。默認情況下,偽類元素的display是默認值inline,可以通過設置display:block來改變其顯示。
在父元素的內容前后插入一個偽元素,content為空可以保證不占據位置(高度為0)。"clear:both"可以清除父元素左右的浮動,導致.box::before和.box::after遇到浮動元素會換行,從而會撐開高度,父元素會自適應這個高度從而不會出現高度坍陷。
其他解決高度坍塌的方法都是基于這兩個思想的,一個是觸發BFC,一個是添加元素+清除浮動(clear)。
浮動元素會被后一個元素的margin-top影響div1div2
可以看到第一個div也跟著下來了,解決辦法是給后一個元素設置clear,此時后一個元素的margin-top將無效
div1div2
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/113398.html
摘要:它是頁面中的一塊渲染區域,并且有一套渲染規則,它決定了其子元素將如何定位,以及和其他元素的關系和相互作用。而,塊級格式化上下文,就是一個塊級元素的渲染顯示規則。定位和清除浮動的樣式規則只適用于處于同一塊格式化上下文內的元素。 什么是BFC(Block Formatting Context) Formatting context(格式化上下文) 是 W3C CSS2.1 規范中的一個概念...
摘要:它是頁面中的一塊渲染區域,并且有一套渲染規則,它決定了其子元素將如何定位,以及和其他元素的關系和相互作用。而,塊級格式化上下文,就是一個塊級元素的渲染顯示規則。定位和清除浮動的樣式規則只適用于處于同一塊格式化上下文內的元素。 什么是BFC(Block Formatting Context) Formatting context(格式化上下文) 是 W3C CSS2.1 規范中的一個概念...
摘要:在正常情況下,頁面總是從左到右,從上到下布局,這種被稱為正常的流。破壞文檔流這是最本質的特性,因此設計的初衷就是破壞文檔流。但是也有一種情況是,浮動元素前后并沒有內聯元素,因此也就不存在行框盒子,這時候就是浮動錨點在起作用。 前幾天有小伙伴說對float的學習云里霧里的,下面我就給大家說一下關于float的一些問題。 在css中,是存在流的概念的。在正常情況下,頁面總是從左到右,從上到...
摘要:破壞文檔流這是最本質的特性,因此設計的初衷就是破壞文檔流。但是也有一種情況是,浮動元素前后并沒有內聯元素,因此也就不存在行框盒子,這時候就是浮動錨點在起作用。 前言 在css中,是存在流的概念的。在正常情況下,頁面總是從左到右,從上到下布局,這種被稱為正常的流。但是有很多情況,正常流是沒辦法實現的,因此我們需要一些手段來破壞流,從而實現一些特殊的布局,而本節的主角float就具備破壞流...
閱讀 2624·2021-11-18 10:07
閱讀 1083·2021-08-03 14:04
閱讀 726·2019-08-30 13:08
閱讀 2579·2019-08-29 15:33
閱讀 1086·2019-08-29 14:07
閱讀 2985·2019-08-29 14:04
閱讀 1435·2019-08-29 11:19
閱讀 1143·2019-08-29 10:59