摘要:為了實現(xiàn)這個效果,我們需要清除浮動。元素被向下移動用于清除之前的左右浮動。塊格式化上下文對浮動定位與清除浮動都很重要。浮動定位和清除浮動時只會應用于同一個內(nèi)的元素。且為了不影響接下來的文檔標準流,往往也要收尾做出清除浮動。
以下從浮動到BFC的段落 摘自MDN 網(wǎng)絡開發(fā)者
float CSS屬性指定一個元素應沿其容器的左側(cè)或右側(cè)放置,允許文本和內(nèi)聯(lián)元素環(huán)繞它。該元素從網(wǎng)頁的正常流動中移除,盡管仍然保持部分的流動性(與絕對定位相反)。
一個浮動元素是float的值不為none的元素。
/* Keyword values */ float: left; float: right; float: none; float: inline-start; float: inline-end; /* Global values */ float: inherit; float: initial; float: unset;
由于float意味著使用塊布局,它在某些情況下修改display 值的計算值:
指定值 | 計算值 |
---|---|
inline | block |
inline-block | block |
inline-table | table |
table-row | block |
table-row-group | block |
table-column | block |
table-column-group | block |
table-cell | block |
table-caption | block |
table-header-group | block |
table-footer-group | block |
flex | flex, 但是float對這樣的元素不起作用 |
inline-flex | inline-flex, 但是float對這樣的元素不起作用 |
other | unchanged |
備注:如果要在 JavaScript 中把float屬性當作element.style對象的一個成員來操作,那么在Firefox 34 和更老的版本中,你必須拼寫成cssFloat。另外還要注意到在 Internet Explorer 8 和更老的IE當中,要使用styleFloat屬性。這是DOM駝峰命名和CSS所用的連字符分隔命名法對應關系中的一個特例(這是因為在 JavaScript 中"float"是一個保留字,因為同樣的原因,"class"被改成了"className" 、"for"被改成了"htmlFor")。
float 屬性的值被指定為單一的關鍵字,值從下面的值列表中選擇。
left
表明元素必須浮動在其所在的塊容器左側(cè)的關鍵字。
right
表明元素必須浮動在其所在的塊容器右側(cè)的關鍵字。
none
表明元素不進行浮動的關鍵字。
inline-start
關鍵字,表明元素必須浮動在其所在塊容器的開始一側(cè),在ltr腳本中是左側(cè),在rtl腳本中是右側(cè)。
inline-end
關鍵字,表明元素必須浮動在其所在塊容器的結束一側(cè),在ltr腳本中是右側(cè),在rtl腳本中是左側(cè)。
left | right | none | inline-start | inline-end
例子
HELLO!
This is some text. This is some text. This is some text. This is some text. This is some text. This is some text. This is some text. This is some text. This is some text. This is some text. This is some text. This is some text.
正如我們前面提到的那樣,當一個元素浮動之后,它會被移出正常的文檔流,然后向左或者向右平移,一直平移直到碰到了所處的容器的邊框,或者碰到另外一個浮動的元素。
在下面的圖片中,有三個紅色的正方形。其中有兩個向左浮動,一個向右浮動。要注意到第二個向左浮動的正方形被放在第一個向左浮動的正方形的右邊。如果還有更多的正方形這樣浮動,它們會繼續(xù)向右堆放,直到填滿容器一整行,之后換行至下一行。
在前面的例子當中,浮動的元素的高度比它們所在的容器元素(是塊元素)的高度小。然而如果塊元素內(nèi)的文本太短,不足以把塊元素的大小撐到高度大于所有浮動元素的高度,我們可能會看到意想不到的效果。例如,如果上面圖片中的文字只有"Lorem ipsum dolor sit amet,",并且接下來是另外一個和"Floats Example"這個標題一樣風格的標題元素,那么第二個標題元素會出現(xiàn)在紅色的正方形之間。然而在大多數(shù)這種情況下,我們希望這個標題元素是靠左對齊的。為了實現(xiàn)這個效果,我們需要清除浮動。
這個例子中,最簡單的清除浮動方式就是給我們想要確保左對齊的新標題元素添加clear屬性:
h2.secondHeading { clear: both; }
然而這個方法只是在同一塊級格式化上下文(block formatting context)中沒有其他元素的時候才是有效的。如果我們的 H2 有兄弟元素是向左浮動和向右浮動的邊欄,那么使用clear 會導致這個標題元素出現(xiàn)在邊欄的下方,這顯然不是我們期望的結果。
如果不能使用清除浮動,另一種做法是浮動容器的限制塊級格式化上下文。再次列舉上面的例子,有三個紅色的正方形和一個P元素。我們可以設置P元素的overflow屬性值變成hidden或者auto,因為這樣可以讓容器元素伸展到能夠包含紅色正方形,而不是讓他們超出塊元素的底部。
p.withRedBoxes { overflow: hidden; height: auto; }
Note: 設置overflow為scroll 也可以讓塊元素撐大來包含所有的浮動子元素,但是這樣不論內(nèi)容有多少都會顯示出一個滾動條。即使 height 默認值為 auto,我們還是設置了,是為了表明容器應該增大高度以便包裹住里面的內(nèi)容。
clear CSS 屬性指定一個元素是否可以在它之前的浮動元素旁邊,或者必須向下移動(清除浮動) 在它的下面。clear 屬性適用于浮動和非浮動元素。
clear: none; clear: left; clear: right; clear: both; clear: inline-start; clear: inline-end; clear: inherit;
當應用于非浮動塊時,它將非浮動塊的邊框邊界移動到所有相關浮動元素外邊界的下方。這個行為作用時會導致margin collapsing不起作用。
當應用于浮動元素時,它將元素的外邊界移動到所有相關的浮動元素外邊界的下方。這會影響后面浮動元素的布局,后面的浮動元素的位置無法高于它之前的元素。
要被清除的相關浮動元素指 在相同塊級格式化上下文中的前置浮動。
注釋:如果你想要一個元素將所有浮動元素包含在內(nèi),你既可以將這個容器設置為浮動,又可以通過 ::after 偽元素設置clear屬性作為替代。
/* best practical*/ /* old */ .clearfix:before, .clearfix:after{ overflow: hidden; display: table; visibility: hidden; content: ''; clear: both; } /* new */ .clearfix::before, .clearfix::after{ overflow: hidden; display: table; visibility: hidden; content: ''; clear: both; } /* new clearfix */ .clearfix::after { content: ""; display: table; clear: both; overflow: hidden; visibility: hidden; } /* old clearfix */ .clearfix:after { content: ""; display: block; clear: both; }
clear: none clear: left clear: right clear: both clear: inherit
none
元素不會向下移動清除之前的浮動。
left
元素被向下移動用于清除之前的左浮動。
right
元素被向下移動用于清除之前的右浮動。
both
元素被向下移動用于清除之前的左右浮動。
inline-start
inline-start是一個關鍵字,表示該元素向下移動以清除其包含塊的起始側(cè)上的浮動。即在某個區(qū)域的左側(cè)浮動或右側(cè)浮動。
inline-end
inline-end是一個關鍵字,表示該元素向下移動以清除其包含塊的末端的浮點,`即在某個區(qū)域的右側(cè)浮動或左側(cè)浮動。
注意: 給div添加wrapper類,使其添加一個邊框,以便更好觀察到實體的此屬性被清除。
HTML Content
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Phasellus sit amet diam. Duis mattis varius dui. Suspendisse eget dolor.
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
This paragraph clears left.
CSS Content
.wrapper{ border:1px solid black; padding:10px; } .left { border: 1px solid black; clear: left; } .black { float: left; margin: 0; background-color: black; color: #fff; width: 20%; } .red { float: left; margin: 0; background-color: red; width:20%; } p { width: 50%; }
如果上例中,樣式中的float: left 都改為了float:right的話,則相應clear: right。
而如果左浮動和右浮動都有的樣式,則clear: both。(both:兩者)
塊格式化上下文(Block Formatting Context,BFC) 是Web頁面的可視化CSS渲染的一部分,是布局過程中生成塊級盒子的區(qū)域,也是浮動元素與其他元素的交互限定區(qū)域。
下列方式會創(chuàng)建塊格式化上下文:
根元素或包含根元素的元素。
浮動元素(元素的 float值不是 none)。
絕對定位元素(元素的 position(position屬性用于指定一個元素在文檔中的定位方式。top,right,bottom 和 left 屬性則決定了該元素的最終位置。) 為 absolute (絕對定位)或 fixed(固定定位)。
行內(nèi)塊元素(元素的 display 為 inline-block。
表格單元格(元素的 display為 table-cell,HTML表格單元格默認為該值)
表格標題(元素的 display為 table-caption,HTML表格標題默認為該值)
匿名表格單元格元素(元素的 display為 table、``table-row、 table-row-group、``table-header-group、``table-footer-group(分別是HTML table、row、tbody、thead、tfoot的默認屬性)或 inline-table)
overflow值不為 visible 的塊元素。
display值為 flow-root 的元素。
contain 值為 layout、content或 strict 的元素。
彈性元素(display為 flex 或 inline-flex元素的直接子元素)
網(wǎng)格元素(display為 grid 或 inline-grid 元素的直接子元素)
多列容器(元素的 column-count或 column-width 不為 auto,包括 ``column-count 為 1)
column-span 為 all 的元素始終會創(chuàng)建一個新的BFC,即使該元素沒有包裹在一個多列容器中( 標準變更,Chrome bug)。
創(chuàng)建了塊格式化上下文的元素中的所有內(nèi)容都會被包含到該BFC中。
塊格式化上下文對浮動定位與清除浮動都很重要。浮動定位和清除浮動時只會應用于同一個BFC內(nèi)的元素。浮動不會影響其它BFC中元素的布局,而清除浮動只能清除同一BFC中在它前面的元素的浮動。外邊距折疊(Margin collapsing)也只會發(fā)生在屬于同一BFC的塊級元素之間。
以下開始,就不是摘自MDN,而是換成摘自博客園小馬哥&的相關博文,再加以整理和添加自己的一點思路而成。
級別 | 元素 |
---|---|
行內(nèi)元素 | a,b,strong,span,img,label,button,input,select,textarea |
塊級元素 | header,form,ul,ol,table,article,div,hr,aside,figure,canvas,video,audio,footer |
web網(wǎng)頁的制作,就像是一個“流”,從上而下,像“織毛衣”。
標準文檔流下的微觀現(xiàn)象:
標準流里面的限制非常多,導致很多頁面效果無法實現(xiàn)。如果我們現(xiàn)在就要并排、并且就要設置寬高,那該怎么辦呢?辦法是:移民!脫離標準流!
css中一共有三種手段,使一個元素脫離標準文檔流:
按布局來說,一般都不會是一個盒子多帶帶浮動起來,往往是橫向區(qū)域的盒子一起浮動。且為了不影響接下來的文檔標準流,往往也要收尾做出清除浮動。
在頁面布局的時候,每個結構中的父元素的高度,我們一般不會設置。(為什么?)
試想想,如果我第一版的頁面的寫完了,感覺非常爽,突然隔了一個月,產(chǎn)品經(jīng)理說頁面某一塊的區(qū)域,需要加點內(nèi)容,或者覺得圖片要縮小一下。這樣的需求在工作中非常常見的。真想打他啊。那么此時作為一個前端小白,肯定是去每個地方加內(nèi)容,改圖片,然后修改父盒子的高度。那問題來了,這樣不影響開發(fā)效率嗎?答案是肯定的。
所以父盒子我們一般不設置高度,而由子元素的內(nèi)容去撐起父盒子的高度。那么當這個子元素是浮動的時候,父盒子沒有高度,浮動子元素是不會填充父盒子的高度的,這個時候就會有下一欄的盒子跑過來到浮動子元素的下面被覆蓋摭擋了,非常影響頁面布局。
浮動元素確實能實現(xiàn)我們頁面元素并排的效果,這是它的好處,但同時它還帶來了頁面布局極大的錯亂!!!所以我們要在浮動完之后再做一步清除浮動的操作(并不影響浮動子元素之前的布局,只是為了下排的布局不亂。)
.clearfix:after{ /*要寫這三句話去實現(xiàn)*/ content: '.'; clear: both; display: block; }
值 | 描述 |
---|---|
visible | 默認值。內(nèi)容不會被修剪,會呈現(xiàn)在元素框之外。 |
hidden | 內(nèi)容會被修剪,并且其余內(nèi)容是不可見的。 |
scroll | 內(nèi)容會被修剪,但是瀏覽器會顯示滾動條以便查看其余的內(nèi)容。 |
auto | 如果內(nèi)容被修剪,則瀏覽器會顯示滾動條以便查看其余的內(nèi)容。 |
inherit | 規(guī)定應該從父元素繼承 overflow 屬性的值。 |
逐漸演變成overflow:hidden清除法。其實它是一個BFC區(qū)域。
end
2018-06-01
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/2190.html
摘要:深入布局定位與浮動在知識體系中,除了選擇器,樣式屬性等基礎知識外,布局相關的知識才是比較核心和重要的點。定位后,原來在文檔流中占據(jù)的位置,會被其他元素所占據(jù)。清除浮動的特殊應用清除浮動可以解決父元素高度塌陷問題。? 深入css布局(2) — 定位與浮動 ? ???? 在css知識體系中,除了css選擇器,樣式屬性等基礎知識外,css布局相關的知識才是css比較核心和重要的點。今天我們來深...
摘要:那我們舉個栗子當先聲明一個元素向左浮動時,由于脫離文檔流,這個元素的右邊就會空出一片空間,空間的長寬與浮動元素長寬相同。總結總結下來,浮動與清除浮動的順序關系如下設置元素浮動,元素脫離文檔流,不計算高度。 本文主要探討兩個問題: 為什么CSS設置浮動會引起父元素塌陷 為什么設置clear:both能清除浮動,并撐開父元素。 起因 CSS的浮動,算是我在寫網(wǎng)頁時用的最多的屬性之一。但...
摘要:注全文摘自介紹布局頁面布局技術允許我們拾取網(wǎng)頁中的元素,并且控制它們相對正常布局流周邊元素父容器或者主視口窗口的位置。添加此代碼將給出以下結果絕對定位絕對定位絕對定位用于將元素移動到頁面的任何位置,以創(chuàng)建復雜的布局。注:全文摘自MDN-介紹CSS布局 CSS頁面布局技術允許我們拾取網(wǎng)頁中的元素,并且控制它們相對正常布局流、周邊元素、父容器或者主視口/窗口的位置。在這個模塊中將涉及更多關于頁面...
摘要:前端技術之詳解第四天一第三天的小總結盒模型,什么是盒子所有的標簽都是盒子。如果不在標準流,比如盒子都浮動了,那么兩個盒子之間是沒有塌陷現(xiàn)象的盒子居中的值可以為,表示自動。前端技術之_CSS詳解第四天 一、第三天的小總結 盒模型box model,什么是盒子? 所有的標簽都是盒子。無論是div、span、a都是盒子。圖片、表單元素一律看做文本。 盒模型有哪些組成: width、hei...
摘要:清除浮動,為何要清除浮動浮動效果會帶來不好的影響子元素浮動會帶來父元素高度塌陷。,清除浮動的兩大基本方式,運用清除浮動。元素流入頁面時,在這個元素左邊右邊或兩邊不允許有浮動內(nèi)容。除了是用來清除浮動的,其它代碼都是為了隱藏掉生成的內(nèi)容。 清除浮動 1,為何要清除浮動 浮動效果會帶來不好的影響: 子元素浮動會帶來父元素高度塌陷。具體解釋:當浮動框高度超出包含框時,包含框不會 自動伸高 來閉...
閱讀 739·2023-04-25 19:43
閱讀 3983·2021-11-30 14:52
閱讀 3811·2021-11-30 14:52
閱讀 3872·2021-11-29 11:00
閱讀 3806·2021-11-29 11:00
閱讀 3905·2021-11-29 11:00
閱讀 3584·2021-11-29 11:00
閱讀 6192·2021-11-29 11:00