重學(xué)css(9)——那些年騙過你的float和“清浮動”

1.探究圖片環(huán)繞文字的傳說

在深入了解float之前,相信大家都聽過一個傳說涂炎,就是float被設(shè)計出來的目的是為了實(shí)現(xiàn)文字環(huán)繞圖片的效果忠聚,可能是初學(xué)的時候忘了,還是受了“清浮動”的毒璧尸,我自己都忘了有沒有用float去實(shí)現(xiàn)過這個效果咒林。因此下面我們先來實(shí)現(xiàn)一下float的設(shè)計初衷熬拒,文字環(huán)繞圖片效果爷光。

<div style="width: 200px">
    <div style="float: left;">
        <img width="100" height="100" src="../小和尚.jpg">
    </div>
    <p>我想實(shí)現(xiàn)文字環(huán)繞,因此需要多一些文字看一下效果我想實(shí)現(xiàn)文字環(huán)繞澎粟,因此需要多一些文字看一下效果</p>
</div>

非常簡單的一段代碼蛀序,也不需要什么牛逼哄哄的操作,float就幫助我們實(shí)現(xiàn)了文字環(huán)繞圖片的效果活烙。為了實(shí)現(xiàn)這種效果徐裸,CSS設(shè)計師在設(shè)計float屬性的時候定義了float的兩個特性。

(1)“破壞文檔流”啸盏,使得父元素得高度塌陷重贺。

(2)禁止行框盒子與浮動元素發(fā)生重疊。

下面我們結(jié)合這兩個特性回懦,來說說圖片是如何環(huán)繞文字的气笙。第一點(diǎn),破壞文檔流怯晕,使得父元素高度塌陷潜圃,這個時候,我們的p標(biāo)簽作為一個block元素舟茶,肯定是想著我要填滿父容器的寬度谭期,而事實(shí)上堵第,塊級元素也是不辱使命的完成了自己的任務(wù),我們可以給塊級標(biāo)簽加個背景色隧出,然后把圖片搞成小透明踏志,看一下是不是這樣。

果然鸳劳,第一個條件生效了狰贯,然而高度塌陷只是讓浮動元素和塊級元素在一個水平線上了,如何實(shí)現(xiàn)文字環(huán)繞效果呢赏廓?這個時候就需要我們的第二個屬性出場了涵紊,就是float元素禁止與行框盒子發(fā)生重疊(個人認(rèn)為這是float和絕對定位的最大區(qū)別之一),對“行框盒子”還不理解的童鞋請轉(zhuǎn)內(nèi)聯(lián)元素那章幔摸。注意摸柄,我特意強(qiáng)調(diào)了行框盒子,也就是本例中匿名內(nèi)聯(lián)元素生成的每一行既忆,這個跟塊級元素的盒子沒有半毛錢關(guān)系驱负。為了驗(yàn)證這個想法,我們可以把p標(biāo)簽轉(zhuǎn)化成內(nèi)聯(lián)元素(display:inline)看下效果患雇。為了看上去更明顯跃脊,我把圖片的透明度設(shè)成了0,可以看到苛吱,浮動元素確實(shí)是和行框盒子發(fā)生了不重疊的關(guān)系酪术。-

至此,我們已經(jīng)完全了解了那個float的傳說翠储。

2.浮動錨點(diǎn)和浮動參考绘雁?聽都沒聽過!

我估計在座的各位和我一樣(是個辣雞)援所,都是第一次聽說浮動錨點(diǎn)和浮動參考庐舟,更別說去了解特么的概念了。干巴巴的講概念在CSS世界里根本行不通住拭,很多東西都要通過實(shí)踐挪略,確認(rèn)過眼神才能夠去猜測其內(nèi)部的原理雷蹂。那么我們就通過一個例子來了解一下這兩個概念游岳。

<!-- 測試浮動參考 -->
<div style="width: 200px;text-align: justify;background: yellow">
    <span>這里有很多文字,且要超出一行且要超出一行且要超出一行</span>
    <span style="float: right;color:blue">更多</span>
</div>

首先上面這個例子伶氢,文字超出一行的時候澈蟆,浮動元素會浮在哪兒墨辛?是文字的第一行?還是文字的最后一行趴俘?還是隨便付么亍奏赘?答案是,最后一行太惠,看一下具體效果就知道了磨淌。

由于markdown編輯器支持標(biāo)簽語言,因此我們可以直接預(yù)覽最終效果如下(小提示:你可以通過瀏覽器直接檢查下面的元素看到CSS樣式)

結(jié)果已經(jīng)出來了凿渊,那么梁只,為什么呢?

這個時候就要邀請我們的浮動參考出場了埃脏。浮動參考搪锣,顧名思義,就是指float元素要對齊參考的實(shí)體是誰彩掐?

在CSS世界中构舟,float元素的浮動參考是“行框盒子”,這個行框盒子特么又出來了堵幽,怎么感覺哪兒都有它狗超。注意是行框盒子,跟其父容器子元素等等等等都沒半毛錢關(guān)系朴下。這里作者溫馨提示努咐,在新的標(biāo)準(zhǔn)中,float的浮動參考不僅僅是行框盒子殴胧,但他沒有展開渗稍,我也懶得查閱,就當(dāng)留個懸念溃肪。知道了浮動參考的概念后免胃,我們就可以解釋上面這個例子了音五,由于float元素是參考行框盒子對齊的惫撰,因此,float可能在第一行躺涝,也可能在第二行厨钻,為什么在第三行呢?

這里其實(shí)作者沒有說明坚嗜,我提出一個假設(shè)夯膀,就是浮動元素參考的是離他最近的行框盒子,這個觀點(diǎn)由本人提出苍蔬,由本人驗(yàn)證后發(fā)現(xiàn)事實(shí)就是這樣诱建,所以有時候CSS的世界就是瞎猜一通然后驗(yàn)證。下面我來簡單驗(yàn)證一下這個觀點(diǎn)碟绑,其實(shí)很簡單俺猿,只要把浮動元素放到span標(biāo)簽前面就可以了茎匠。如下所示

<!-- 驗(yàn)證浮動參考是離他最近的行框盒子 -->
<div style="width: 200px;text-align: justify;background: yellow">
    <span style="float: right;color:blue">更多</span>
    <span>這里有很多文字,且要超出一行且要超出一行且要超出一行</span>
</div>

由于markdown編輯器支持標(biāo)簽語言押袍,因此我們可以直接預(yù)覽最終效果如下(小提示:你可以通過瀏覽器直接檢查下面的元素看到CSS樣式)

image.png

結(jié)果完全印證了我的想法是正確的诵冒,我吹爆我自己!

說完了浮動參考谊惭,那么什么是浮動錨點(diǎn)汽馋?浮動錨點(diǎn)是float元素所在流中的一個點(diǎn),你可以理解為是一個空的內(nèi)聯(lián)元素圈盔,為什么要有這個點(diǎn)呢豹芯?道理很簡單,有時候我們的浮動元素沒有可以參考的行框盒子驱敲,也就是他的四周都被一群block大漢包圍的時候該怎么辦告组?往哪里定位?沒有關(guān)系癌佩,他自己帶一個可以參考的浮動錨點(diǎn)木缝。由于這個屬性沒什么特殊之處,這里就不過多介紹了围辙,了解一下就好我碟。

3.那些年你被騙過的clear“清浮動”

相信我們初學(xué)浮動的第一課便被灌輸了“浮動”破壞文檔流是個禍害的思想,為了解決浮動元素導(dǎo)致高度坍塌的“bug”姚建,我們被要求清浮動矫俺。然后給了一大堆清浮動的方法,最后提出最好用的是after偽類清浮動掸冤,當(dāng)時還真覺得煞有其是厘托,現(xiàn)在看來真的是人言可畏。如果CSS自家制定的標(biāo)準(zhǔn)都被當(dāng)作了bug稿湿,那還有什么不是bug呢铅匹?

看完這一章后,你應(yīng)該可以明白兩個概念:第一饺藤,浮動引起的高度坍塌是為了解決圖文環(huán)繞效果而被制定的標(biāo)準(zhǔn)包斑,并不是所謂的bug。第二涕俗,所謂的clear清浮動罗丰,并沒有清除掉浮動。

為什么說clear沒有清除掉浮動呢再姑?從字面意思上理解萌抵,clear確實(shí)是清除的意思,然而官方對于clear的解釋是:元素盒子的邊不能和前面的浮動元素相鄰。

這句話聽起來很拗口绍填,但可以明確的知道萎坷,clear并沒有改變?nèi)魏胃釉氐奶匦裕釉匾琅f是那個浮動元素沐兰,不管你清不清哆档,他還是在那邊,浮著住闯。

那么這句話的涵義是什么呢瓜浸?仔細(xì)剖析一下,你會發(fā)現(xiàn)比原,“清浮動”的奧秘就在于這個不能相鄰的標(biāo)準(zhǔn)插佛。事實(shí)上,clear被制定出來就是為了解決口耳相傳的“高度坍塌bug”量窘,因此浮動元素本身的特性被完美保留雇寇。概念講的干了,來看一個例子吧

<!-- 清浮動原理探究 -->
<div>
    <div class="li"></div>
    <div class="li"></div>
    <div class="li"></div>
    <div class="li"></div>
    <div class="li"></div>
    <div class="li"></div>
    <div class="li"></div>
    <div class="li"></div>
    <div class="li"></div>
    <div class="li"></div>
</div>
<style>
.li{
    float: left;
    margin: 10px;
    width: 40px;
    height: 40px;
    background: yellow
}
.li:nth-of-type(3){
    clear: both;
}
</style>

上面這個例子蚌铜,最終li會被清浮動分割成幾行锨侯?

最終結(jié)果是:兩行。由于markdown編輯器支持標(biāo)簽語言冬殃,因此我們可以直接預(yù)覽最終效果如下(小提示:你可以通過瀏覽器直接檢查下面的元素看到CSS樣式)


image.png

我們用所學(xué)的理論知識來解釋下為什么是兩行囚痴,在樣式表中,第三個浮動元素使用了清浮動的屬性审葬,此時深滚,根據(jù)標(biāo)準(zhǔn),當(dāng)前元素不能和前面的浮動元素相鄰涣觉,也就是第三個元素不能和第二個元素做朋友了痴荐,那只能換行了,然而標(biāo)準(zhǔn)沒有規(guī)定第三個元素不能和后面的元素做朋友官册,因此第三個元素以及之后的元素依舊保持左浮動的特性規(guī)則排列生兆。由于第一行和第二行都保持了浮動的特性,因此高度全部坍塌攀隔,此時父級容器div的高度依舊是0皂贩,不會因?yàn)榍辶烁悠苷ィ溉萜鞯母叨染妥兂傻谝恍械母叨攘死バ冢溉萜鞲叨纫琅f是0!注意是0婴栽!(由于我直接用了標(biāo)簽去展示結(jié)果满粗,父元素高度坍塌會導(dǎo)致文章排版出問題,因此F12檢查元素的時候會發(fā)現(xiàn)父元素高度不是0愚争,是因?yàn)槔昧薆FC特性加了overflow映皆,這個在下一章會詳細(xì)探討)

看完了上面的例子挤聘,再來簡單了解下clear的四個屬性,分別是none(默認(rèn)捅彻,就是沒有)组去,left(清左浮動),right(清右浮動)以及我們最常用的both(全清)步淹。作者這里給出了clear的基本使用方式就是clear:both从隆。left和right屬性根本沒有軟用,讓CSS自己判斷就好了缭裆,因?yàn)椴豢赡苡幸粋€元素既是left又是right浮動的键闺,因此無需考慮是清左浮動還是右浮動,全清就完事了澈驼。

由于clear只能確保和前面的元素發(fā)生關(guān)系辛燥,因此我們最常使用的是after偽類清浮動,而不是before缝其,因?yàn)閎efore生成的元素根本沒法和后面的元素交流clear的事情挎塌。最后我們放上我們最喜歡使用的after偽類清浮動的方法,注意clear屬性只有塊級元素才有效内边,而偽類的默認(rèn)屬性是內(nèi)聯(lián)值勃蜘,不要忘了display:block申明。

<div class="clearfix">
    <div class="li"></div>
    <div class="li"></div>
    <div class="li"></div>
    <div class="li"></div>
    <div class="li"></div>
    <div class="li"></div>
    <div class="li"></div>
    <div class="li"></div>
    <div class="li"></div>
    <div class="li"></div>
</div>
<style>
.li{
    float: left;
    margin: 10px;
    width: 40px;
    height: 40px;
    background: yellow
}
.li:nth-of-type(3){
    clear: both;
}
.clearfix::after{
    content: '';
    display: block;
    clear: both;
}
</style>
復(fù)制代碼
image.png

本章到這里其實(shí)還沒有結(jié)束假残,下一章的內(nèi)容會繼續(xù)探討float的BFC特性缭贡,以及如何用overflow真正的清除浮動。

最后辉懒,給大家推薦一個前端學(xué)習(xí)進(jìn)階內(nèi)推交流群685910553前端資料分享)阳惹,不管你在地球哪個方位,
不管你參加工作幾年都?xì)g迎你的入駐?袅(群內(nèi)會定期免費(fèi)提供一些群主收藏的免費(fèi)學(xué)習(xí)書籍資料以及整理好的面試題和答案文檔Sㄌ馈)

如果您對這個文章有任何異議,那么請在文章評論處寫上你的評論颠印。

如果您覺得這個文章有意思纲岭,那么請分享并轉(zhuǎn)發(fā),或者也可以關(guān)注一下表示您對我們文章的認(rèn)可與鼓勵线罕。

愿大家都能在編程這條路止潮,越走越遠(yuǎn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钞楼,一起剝皮案震驚了整個濱河市喇闸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖燃乍,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唆樊,死亡現(xiàn)場離奇詭異,居然都是意外死亡刻蟹,警方通過查閱死者的電腦和手機(jī)逗旁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舆瘪,“玉大人痢艺,你說我怎么就攤上這事〗樘眨” “怎么了堤舒?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長哺呜。 經(jīng)常有香客問我舌缤,道長,這世上最難降的妖魔是什么某残? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任国撵,我火速辦了婚禮,結(jié)果婚禮上玻墅,老公的妹妹穿的比我還像新娘介牙。我一直安慰自己,他們只是感情好澳厢,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布环础。 她就那樣靜靜地躺著,像睡著了一般剩拢。 火紅的嫁衣襯著肌膚如雪线得。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天徐伐,我揣著相機(jī)與錄音贯钩,去河邊找鬼。 笑死办素,一個胖子當(dāng)著我的面吹牛角雷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播性穿,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼勺三,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了季二?” 一聲冷哼從身側(cè)響起檩咱,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤揭措,失蹤者是張志新(化名)和其女友劉穎胯舷,沒想到半個月后刻蚯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡桑嘶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年炊汹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逃顶。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡讨便,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出以政,到底是詐尸還是另有隱情霸褒,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布盈蛮,位于F島的核電站废菱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏抖誉。R本人自食惡果不足惜殊轴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望袒炉。 院中可真熱鬧旁理,春花似錦、人聲如沸我磁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夺艰。三九已至叛溢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間劲适,已是汗流浹背楷掉。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留霞势,地道東北人烹植。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像愕贡,于是被迫代替她去往敵國和親草雕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案固以? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,737評論 1 92
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5墩虹? 答:HTML5是最新的HTML標(biāo)準(zhǔn)嘱巾。 注意:講述HT...
    kismetajun閱讀 27,449評論 1 45
  • CSS里浮動float是個概念比較曖昧的屬性,擼主最早對浮動float的認(rèn)識是基于布局的诫钓,認(rèn)為float元素就是用...
    gurlan閱讀 443評論 0 3
  • CSS里浮動float是個概念比較曖昧的屬性旬昭,擼主最早對浮動float的認(rèn)識是基于布局的,認(rèn)為float元素就是用...
    張歆琳閱讀 39,957評論 23 153
  • 一菌湃、CSS入門 1问拘、css選擇器 選擇器的作用是“用于確定(選定)要進(jìn)行樣式設(shè)定的標(biāo)簽(元素)”。 有若干種形式的...
    寵辱不驚丶?xì)q月靜好閱讀 1,589評論 0 6