BFC-float-position

浮動定位 BFC 邊距合并

浮動元素

div的順序是HTML代碼中div的順序決定的。

浮動可以理解為讓某個div元素脫離標準流,漂浮在標準流之上,和標準流不是一個層次。使元素脫離文檔流,按照指定方向發生移動,遇到父級邊界或者相鄰的浮動元素停了下來。

假如某個div元素A是浮動的,如果A元素上一個元素也是浮動的,那么A元素會跟隨在上一個元素的后邊
(如果一行放不下這兩個元素,那么A元素會被擠到下一行);如果A元素上一個元素是標準流中的元素,那么A的相對垂直位置不會改變,也就是說A的頂部總是和上一個元素的底部對齊。

對父元素的影響

對于父元素來說,元素浮動之后脫離當前的文檔流,所以無法撐開父元素,造成父元素的塌陷。

對其兄弟元素(非浮動)的影響:

如果兄弟元素為塊級元素,元素會占據它的位置,元素會處在浮動元素的下層(無法通過z-index屬性改變他們的層疊位置),但它的內部文字和其他行內元素都會環繞浮動元素。

對文字的影響

如果兄弟元素為內聯元素,則元素會環繞浮動元素排列。

對其兄弟元素(浮動)的影響

同一個方向的浮動元素:

當一個浮動元素在浮動過程中碰到同一個方向的浮動元素時,它會緊跟在它們后面。

反方向的浮動元素:

互不影響,位于同一條水平線上,當空間不夠時會被擠下。

float對自身元素的影響

float對象將被視作塊對象(block-level),即display屬性等于block。

對子元素的影響

浮動元素, 其高度或寬度取浮動子元素和非浮動子元素高度或寬度的最大值。

對父元素非浮動兄弟元素的影響

父元素之外的非浮動元素將會無視該浮動元素, 他們只會相對父元素按照正常文檔流去排列。

對父元素浮動兄弟元素的影響

父元素之外的浮動兄弟元素, 會挨著該浮動元素。

清除浮動

清除浮動:

清除對應的單詞是 clear,對應CSS中的屬性是 clear:left | right | both | none。

元素浮動之前,也就是在標準流中,是豎向排列的,而浮動之后可以理解為橫向排列。

浮動會影響后面的元素,清除浮動可以理解為打破橫向排列。

如何清除浮動:

1.在浮動元素后添加一個空元素,div class="clear",然后在css中添加.clear{clear:both}即可。

2.利用浮動元素的容器的::after偽元素來清楚浮動,由于::after偽元素只對塊級元素有用,因此要設置display:block,通過::after偽元素在浮動結束之后,向其中添加看不見的空格“\20”或者是點'.',可以使用 content:""。IE6,IE7不支持after偽元素,因此要添加.clearfix{zoom:1}。

3.直接給浮動元素的下一個元素添加一個clear:both;這個元素和浮動元素是在一層container中,如果在浮動元素的下一層的話,用::after偽元素。

4.給浮動元素的容器添加overflow:hidden;(overflow:auto)。 在使用float之后,元素會飄上去,但是使用overflow:hidden;之后,浮動元素又回到了容器中,把容器高度撐起,達到了清理浮動的作用。

定位方式

position的屬性值共有四個static、relative、absolute、fixed。

static
指定元素使用正常的布局行為,即元素在文檔流中當前的布局位置。此時 top, right, bottom, left 和 z-index 屬性無效。

relative
元素先放置在未添加定位時的位置,再在不改變頁面布局的前提下調整元素位置(因此會在此元素未添加定位時所在位置留下空白)。position:relative 未定義對 table-*-group, table-row, table-column, table-cell, table-caption 元素應用的效果。

相對定位就是將元素偏離元素的默認位置,但普通流中依然保持著原有的默認位置,并沒有脫離普通流,只是視覺上發生的偏移。

absolute
不為元素預留空間,通過指定元素相對于最近的非 static 定位祖先元素的偏移,來確定元素位置。絕對定位的元素可以設置外邊距(margin),且不會與其他邊距合并。

應用了position: absolute的元素會循著節點樹中的父(祖)元素來確定“根”,然后相對這個“根”元素來偏移。如果在其節點樹中所有父(祖)元素都沒有設置position屬性值為relative或者absolute則該元素最終將對body進行位置偏移。應用了position: absolute的元素會脫離頁面中的普通流并改變display屬性。

fixed
不為元素預留空間,而是通過指定元素相對于屏幕視口(viewport)的位置來指定元素位置。元素的位置在屏幕滾動時不會改變。打印時,元素會出現在的每頁的固定位置。fixed 屬性會創建新的棧上下文。當元素祖先的 transform 屬性非 none 時,容器由視口改為該祖先。

一個固定定位(position屬性的值為fixed)元素會相對于視窗來定位,這意味著即便頁面滾動,它還是會停留在相同的位置。和 relative 一樣, top 、 right 、 bottom 和 left 屬性都可用。

MDN

CSS布局

z-index

z-index 屬性指定了一個元素及其子元素的 z-order。 當元素之間重疊的時候,z-order 決定哪一個元素覆蓋在其余元素的上方顯示。 通常來說 z-index 較大的元素會覆蓋較小的一個。

對于一個已經定位的元素(即position屬性值是非static的元素),z-index 屬性指定:

元素在當前堆疊上下文中的堆疊層級。

元素是否創建一個新的本地堆疊上下文。

背景和邊框 —— 形成層疊上下文的元素的背景和邊框。 層疊上下文中的最低等級。

負z-index值 —— 層疊上下文內有著負z-index值的子元素。

塊級盒 —— 文檔流中非行內非定位子元素。

浮動盒 —— 非定位浮動元素。

行內盒 —— 文檔流中行內級別非定位子元素。

z-index: 0 —— 定位元素。 這些元素形成了新的層疊上下文。

正z-index值 —— 定位元素。 層疊上下文中的最高等級。

z-index不為auto,opacity小于1的元素會構建堆疊上下文。

堆疊上下文可以嵌入其他堆疊上下文。

每個堆疊上下文和它的同級上下文是獨立的。

每個堆疊上下文是自包含的。

MDN

margin 負值與 position:relative

當margin-bottom、margin-right設為負值的時候,元素本身沒有位置變化,后面的元素會下移、右移。

position:relative的元素設置top、left后元素還占據原來位置,相對的是它原本在文檔流中的位置而進行的偏移。

設置了這個屬性后,元素會根據top,left,bottom,right進行偏移,關鍵點是它原本的空間仍然保留。

占據的文檔空間不會隨 top / right / left / bottom 等屬性的偏移而發生變動。

BFC

BFC,塊級格式化上下文,是一個獨立的渲染區域,只有block-level-box級別參與,規定了內部如何布局并且和外部毫不相干。

如何觸發 BFC

根元素;float屬性不為none;position為absolute或fixed;
display為inline-block, table-cell, table-caption, flex, inline-flex
overflow不為visible。

BFC 作用

阻止外邊距折疊

當兩個塊級元素相鄰并且在同一個塊級格式化上下文時,它們垂直方向之間的外邊距會疊加。也就是說,即便兩個塊級元素相鄰,但當它們不在同一個塊級格式化上下文時它們的邊距也不會折疊。產生新的 BFC 就可以阻止外邊距折疊 。

BFC-1

BFC 可以包含浮動的元素

用 overflow: hidden 或 overflow: auto 觸發浮動元素的父元素的 BFC 特性,從而可以包含浮動元素,閉合浮動。

BFC 會根據子元素的情況自動適應高度,即使其子元素中包括浮動元素。

BFC-2

BFC 可以阻止元素被浮動元素覆蓋

使用 overflow: hidden 觸發了 BFC ,它并不會被它的兄弟浮動元素覆蓋,而是處于它的旁邊。假設浮動元素寬度和它的非浮動兄弟元素寬度都沒有超過父元素寬度,但兩個元素的寬度加起來超出了父元素寬度的時候,非浮動元素會下降到下一行,即處于浮動元素下方。

BFC-3

外邊距合并

塊的頂部外邊距和底部外邊距有時被組合(折疊)為單個外邊距,其大小是組合到其中的最大外邊距,這種行為稱為外邊距塌陷(margin collapsing)。

外邊距合并是CSS中一個特殊的概念。當兩個外邊距相鄰時,它們會合并為較大的那一個。 無論是相鄰元素的上下邊距,還是父子元素的上邊距,甚至是同一元素的上下邊距。

發生外邊距塌陷的三種基本情況:

相鄰的兄弟姐妹元素

不是 ”上面段落的下邊距“ 與 ”下面段落的上邊距“ 的求和 ,而是兩者中的較大者。

塊級父元素與其第一個/最后一個子元素

如果塊級父元素中,不存在上邊框、上內補、inline content、 清除浮動 這四條屬性(對于上邊框和上內補,也可以說,當上邊距及上內補寬度為0時),那么這個塊級元素和其第一個子元素的上邊距就可以說”挨到了一起“。此時這個塊級父元素和其第一個子元素就會發生 上外邊距合并 現象,換句話說,此時這個父元素對外展現出來的外邊距將直接變成這個父元素和其第一個子元素的margin-top的較大者。

空塊元素

如果存在一個空的塊級元素,其 border、padding、inline content、height、min-height 都不存在。那么此時它的上下邊距中間將沒有任何阻隔,此時它的上下外邊距將會合并。

MDN

拒絕外邊距合并

給父級元素添加 border-top 或 padding-top。

父元素的第一個子元素的上邊距margin-top如果碰不到有效的border或者padding就會不斷一層一層的找自己的祖先元素。只要給祖先元素設置個有效的 border 或者 padding 就好了。

BFC-4

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,801評論 1 92
  • 一,浮動元素有什么特征?對父容器、其他浮動元素、普通元素、文字分別有什么影響? 浮動模型是一種可視化格式模型,浮動...
    DeeJay_Y閱讀 901評論 0 4
  • relative:生成相對定位的元素,通過top,bottom,left,right的位置相對于其正常位置進行定位...
    zx9426閱讀 965評論 0 2
  • 1.浮動元素有什么特征?對父容器、其他浮動元素、普通元素、文字分別有什么影響? 浮動模型也是一種可視化格式模型,浮...
    zhaonu閱讀 401評論 0 0
  • 1. 浮動元素有什么特征?對父容器、其他浮動元素、普通元素、文字分別有什么影響? 特征:浮動元素不在普通的文檔流中...
    在乎者也閱讀 1,205評論 0 1