四年前端在CSS面試上跪了/(ㄒoㄒ)/~~

2021-02-19 程式設計師前端

作者:紅塵煉心

https://juejin.im/post/5ea45801e51d4546d4399055

四年前端跪在CSS面試上,不可思議! CSS面試不是初級前端才會跪的嗎?

在面試最後,面試官突然問了我最後一個問題。怎麼清除浮動。當然我很快給出最常用的方法。

.clearfix::after {    content: '';    display: block;    clear: both;    visibility: hidden;    height: 0;}

本來我以為,面試官還會問,還有那些方法,我腦中已經構思了好幾種方法。沒想到,面試官竟然問我,這個方法清除浮動的原理。

原理!當時我就有點懵逼,這個方法很常見,也經常在用,但是就沒去理解過其原理。腦子在飛快的運轉。

首先::after是元素的偽元素,在元素後面;

content是偽元素的內容,為空,應該只是讓偽元素不顯示,而display:block;height:0保證偽元素高度為零不顯示,應該跟清除浮動沒多大關係。

另外visibility: hidden,是讓偽元素瀏覽器渲染但不顯示,也應該跟清除浮動沒多大關係。

那麼就剩下clear: both,我也不清楚它的含義,但是用排除法,這應該就是清除浮動的關鍵。

於是,我就含糊的回答,是clear: both這個屬性起了作用。但是面試官的表情告訴我,我的回答他很不滿意。

後面他又叫我,簡單講一下什麼是BFC,它有什麼作用。我只聽過KFC,哪裡聽過BFC,這下徹底懵逼了。平時在工作中大多數都是在寫JS代碼,很少去操作CSS。

雖然後來還是被錄取了,但是薪資下降了2K,達不到預期。只能很遺憾了。

回到家中,上網查一下資料,做個總結,分享一下。

CSS還是前端的基本功,不管你有多年工作經驗!!!別認為只有在初級前端面試中才會問CSS,警戒!!


一、清除浮動的原理

沒錯,clear:both還真是清除浮動的關鍵,被我蒙對了。

clear是CSS中的定位屬性,規定元素的哪一側不允許其他浮動元素。那麼clear:both就是規定在左右兩側均不允許浮動元素。

clear屬性只能在塊級元素上其作用,這就是清除浮動樣式中display:block的作用。

另外visibility: hidden;height: 0;只要content的值為空。寫不寫都無所謂。

那麼為什麼要清除浮動,最常見的是因為外層容器高度坍塌,下面用一段代碼演示一下。

<style>.wrap {    width: 200px;    border: 1px solid #333;}.wrap:after {    content: '';    display: block;    clear: both;}.left {    float: left;    background: blue;    height: 100px;    width: 100px;}.right {    float: left;    background: red;    height: 50px;    width: 100px;}</style><body>    <div class='wrap'>        <div></div>        <div></div>    </div></body>

為了顯示清楚一點,在.wrap:after 樣式中的content設置為content: 'after偽元素' ,此時如下圖所示。

隨後在.wrap:after 樣式中加上clear:both,表明after偽元素左右兩側均不允許浮動元素,沒辦法只好把after偽元素放在下面,此時如下圖所示。

順帶撐起了.wrap父元素的高度,這樣就相當清除了浮動了,解決了外層容器高度坍塌的問題。

那麼我們把.wrap:after 樣式中的content設置為content:' ',最後就如下圖所示。

二、BFC的概念和應用
1、BFC的概念

BFC的全稱是 Block Formatting Contexts。

Formatting Contexts是頁面中的一塊渲染區域,它擁有一套渲染規則,決定其子元素將如何定位,以及和其它元素的關係和相互作用。說白了就是一個決定如何渲染元素的容器。


2、BFC的渲染規則

那麼BFC就是一個決定如何渲染元素的容器。我們要了解就是它的渲染規則。

1、內部的塊級元素會在垂直方向,一個接一個地放置。

2、塊級元素垂直方向的距離由margin決定。屬於同一個BFC的兩個相鄰塊級元素的margin會發生重疊。

3、對於從左往右的格式化,每個元素(塊級元素與行內元素)的左邊緣,與包含塊的左邊緣相接觸,(對於從右往左的格式化則相反)。即使包含塊中的元素存在浮動也是如此,除非其中元素再生成一個BFC。

4、BFC的區域不會與浮動元素重疊。

5、BFC是一個隔離的獨立容器,容器裡面的子元素和外面的元素互不影響。

6、計算BFC容器的高度時,浮動元素也參與計算。


3、BFC的渲染規則詳解3.1 規則二

以上渲染規則,第一點比較好理解。第二點我們用一個例子解釋一下。

<body>    <div style="width:100px;height:100px;background:red;margin:20px;"></div>    <div style="width:100px;height:100px;background:blue;margin:20px;"></div></body>

按樣式代碼來看,紅塊和藍塊之間間距應該是40px。但實際上是20px。這就是BFC渲染規則的第二點。

因為BFC的觸發條件之一就是根元素,所以body就是一個BFC容器,紅塊和藍塊是同在body下的相鄰塊級元素,其margin會生重疊,所以紅塊和藍塊之間間距只有20px。

3.2 規則三

第三點規則比較難理解我詳細解釋一下。首先要先理解包含塊的含義。

包含塊不是一個完整的box,一個完整的box包含margin包含塊,border包含塊,padding包含塊,content包含塊。

包含塊有可能是box的content包含塊,也可能是box的padding包含塊。這取決於被包含塊所包含的元素的position屬性。

例如,如果某個元素position屬性是absolute,包含塊就是由它的最近的position的值不是 static的父級元素的padding包含塊組成。

再例如,如果某個元素的position屬性是static或relative,包含塊就是由它的父級元素的content包含塊。

如果某個元素的position屬性是fixed,包含塊就是視口。

那麼。BFC中的元素應該與其自身的包含塊相接觸,而非與BFC相接觸,這個包含塊有可能是BFC中的一部分,也有可能和bfc無關。

正常元素都是從左往右的格式化,那麼對元素的position屬性是absolute,right為0,或者元素的float的屬性為right,那麼就是從右往左的格式化,元素的右邊緣和包含塊的右邊緣接觸。

元素H觸發生成BFC,其中有兩個元素A和元素B,元素A的float的屬性為left,那么元素A的左邊緣和元素H(也是元素A的包含塊)左邊緣接觸,如果元素B的float的屬性也為left,元素B的左邊緣不和元素H的左邊緣接觸,而是和元素A的右邊緣接觸。這種情況就可以用規則中的「即使包含塊中的元素存在浮動也是如此,除非其中元素再生成一個BFC」來解釋,元素的float的屬性不為none會觸發生成BFC,所以這種情況是不矛盾的。

3.3 規則四

這點是BFC最重要的一點渲染規則,可以用這個規則解決很多布局的問題。

3.4 規則五

這個規則,可以用來解決內部元素浮動,導致父級元素的高度坍塌問題。


4、BFC的觸發條件
三、BFC的應用

1、清除浮動

在文章最初,提到用clear:both來清除浮動,我們也可以根據BFC的渲染規則第6點(計算BFC容器的高度時,浮動元素也參與計算)來清除浮動,解決高度坍塌的問題。


2、解決上下margin邊距問題
<body>    <div style="width:100px;height:100px;background:red;margin:20px;"></div>    <div style="width:100px;height:100px;background:blue;margin:20px;"></div></body>

我們利用BFC渲染規則第2點(屬於同一個BFC的兩個相鄰塊級元素的margin會發生重疊),那麼不屬於同一個BFC的兩個相鄰塊級元素的margin就不會發生重疊。

那麼我們在第二個div元素用一個div元素包裹起來,並用overflow:auto觸發其BFC。再看一下效果是不是不重疊了。

<body>    <div style="width:100px;height:100px;background:red;margin:20px;"></div>    <div style="overflow:auto">        <div style="width:100px;height:100px;background:blue;margin:20px;"></div>    </div></body>

3、實現自適應兩欄布局

自適應兩欄布局,是一個主內容區域和一個側邊欄區域組成,兩個區域的寬度都可以隨窗口大小自適應。有很多種寫法可以實現。

這裡來實現一種利用BFC的渲染規則的寫法。

<style>    .main{        background: red;        height:500px;    }    .sider {        float: left;        width: 20%;        height:300px;        background: blue;    }</stley><body>    <div>我是側邊欄</div>    <div>我是主體內容</div><body>

首先我們根據規則1,要先把.sider div寫在.main div前面。這個.sider div才會浮動起來覆蓋在.main div上面。

再根據規則4(BFC的區域不會與浮動元素重疊),給.main加上overflow:auto;觸發.main div生成BFC。

四、IFC的概念和應用1、IFC的概念

IFC的全稱是Inline Formatting Contexts,也就是「內聯格式化上下文」。


2、IFC的生成條件

IFC的形成條件非常簡單,塊級元素中僅包含內聯級別元素,需要注意的是當IFC中有塊級元素插入時,會產生兩個匿名塊將父元素分割開來,產生兩個IFC。


3、IFC的渲染規則

子元素水平方向橫向排列,並且垂直方向起點為元素頂部。

子元素只會計算橫向樣式空間,【padding、border、margin】,垂直方向樣式空間不會被計算,【padding、border、margin】。

在垂直方向上,子元素會以不同形式來對齊(vertical-align)

能把在一行上的框都完全包含進去的一個矩形區域,被稱為該行的行框(line box)。行框的寬度是由包含塊(containing box)和與其中的浮動來決定。

IFC中的「line box」一般左右邊貼緊其包含塊,但float元素會優先排列。

IFC中的「line box」高度由 CSS 行高計算規則來確定,同個IFC下的多個line box高度可能會不同。

當 inline-level boxes的總寬度少於包含它們的line box時,其水平渲染規則由 text-align 屬性值來決定。

當一個「inline box」超過父元素的寬度時,它會被分割成多個boxes,這些 boxes 分布在多個「line box」中。如果子元素未設置強制換行的情況下,「inline box」將不可被分割,將會溢出父元素。


4、IFC的應用
五、FFC的概念和應用
1、FFC的概念

FFC的全稱是Flex formatting contexts,彈性盒模型。


2、FFC的生成條件

父級元素設置display:flex或者`display:inline-flex


3、FFC的渲染規則`

可以看阮一峰的Flex 布局教程:語法篇,講的非常詳細。

要注意一點。生成FFC後,其子元素的float、clear和vertical-align屬性將失效。


4、FFC的應用4.1、自動撐開頁面高度,底欄總是出現在頁面的底部
<style>.wrap{    display:flex;    padding:0;    margin:0;    min-height:100vh;    flex-direction:column;}.main{    flex-grow:1;}</style><body class="wrap">    <header style="line-height:50px;background:red;color:#fff;text-align:center">頭部</header>    <main class="main">內容</main>    <footer style="line-height:50px;background:#eeeeee;color:#333;text-align:center">底欄</footer></body>

4.2、經典的聖杯布局
<style>.wrap {    display: flex;    padding: 0;    margin: 0;    min-height: 100vh;    flex-direction: column;}header,footer {    flex: 0 0 50px;}
.content { display: flex; flex: 1}
.main { flex: 1;}.nav,.ads{ flex: 0 0 100px; background:green;}.nav{ order:-1; background:yellow;}</style><body class="wrap"> <header style="line-height:50px;background:red;color:#fff;text-align:center">頭部</header> <div class="content"> <main class="main">內容區</main> <nav class="nav">側邊導航</nav> <aside class="ads">側邊欄</aside> </div> <footer style="line-height:50px;background:#eeeeee;color:#333;text-align:center">底欄</footer></body>


相關焦點

  • 2020把留學生逼回國的不是疫情,而是美國的外賣小哥/(ㄒoㄒ)/~
    >>  從前外賣很慢,我在美國想吃個飯,18歲點單,19歲才吃到/(ㄒoㄒ)/~~    圖片來自微博博主@我是郭傑瑞  那價格呢?  圖片來自央視新聞  但二哥怎麼允許你們風裡雨裡,飢腸轆轆等著各種外賣投遞,這不 就幫你把2020年度的 mognavi 的日本零食大賞榜單上的零食都給你總結在這裡!
  • 開陽教師面試大樹多名學員上岸,斬獲考區第10,多個崗位第1
    恭喜開陽教師試講面試班李同學斬獲恭喜開陽教師試講面試班蒲同學斬獲>恭喜開陽教師試講面試班龍同學斬獲哈哈本次開陽教師試講考試中有兩位同學白雲已經成功上岸,有幾位學員/(ㄒoㄒ)/~~太可惜了,其實面試分數都已經超80+,因為筆試分差還是太大了,遺憾落榜,好在一些學員本就把開陽教師面試當成特崗前的練手,已經加入到新一輪的特崗衝刺面試班中了(要上車的同學,抓緊諮詢哦~)
  • 年末的大廠前端面試總結(20屆雙非二本)-終入字節
    css方向對於css而言,我覺得基礎應該是常用選擇器,權重,垂直居中方案,rem和em,flex,動畫...等等。對於這方面的準備,網上很多博客就能解決。如果想系統了解一下,推薦張鑫旭的《css世界》。flex的話,推薦小青蛙網站和阮一峰的博客。
  • Web前端面試題目匯總
    來自: 燎原之火的博客 _ Lyzh's blog作者: Lyzh連結:http://blog.linjiajun.com/2016/03/15/2016年Web前端面試題目匯總/ (點擊尾部閱讀原文前往)以下是收集一些面試中經常會遇到的經典面試題以及自己面試過程中無法解決的問題,通過對知識的整理以及經驗的總結,重新鞏固自身的前端基礎知識,如有錯誤或更好的答案,歡迎指正。
  • 自學web前端怎麼學?web前端學習路線css屬性
    自學web前端技術,如果才能找到一份web前端的工作。按照現在的招聘標準來看,無論你去哪個公司面試,你只需要滿足他們公司的需求就可以。找到一份web前端工作需要掌握的內容如下:首先是html,css這些簡單的靜態布局這是最基本的學習內容,不在多說。
  • 合格前端開發該了解的css知識
    css在現階段的前端面試中佔得比重確實低,有些公司甚至都只是一筆帶過。
  • 【乾貨】各大網際網路公司前端筆試面試題–HTML,CSS篇
    很多面試題是我自己面試BAT親身經歷碰到的。整理分享出來希望更多的前端er共同進步吧,不僅適用於求職者,對於鞏固複習前端基礎更是大有裨益。而更多的題目是我一路以來收集的,也有往年的,答案不確保一定正確,如有錯誤或有更好的解法,還請斧正。前面幾題是會很基礎,越下越有深度。1.你做的頁面在哪些流覽器測試過?
  • 好程式設計師web前端培訓分享HTML/CSS部分面試題
    好程式設計師web前端培訓分享HTML/CSS部分面試題。準備參加web前端面試的小夥伴們一起看一看吧,希望能夠對大家有所幫助! 4個部分一起構成了css中元素的盒模型。 2、行內元素有哪些?塊級元素有哪些? 空(void)元素有那些?
  • 隨便問個CSS就被幹趴了...面試官哭訴:再招不到人,我要被祭天了!
    有面試官在論壇上吐槽,現在前端工程師的水平真是參差不齊,懂點CSS的前端都屈指可數
  • Web前端面試題目及答案匯總
    以下是收集一些面試中經常會遇到的經典面試題以及自己面試過程中無法解決的問題
  • 我做前端技術面試官的一些體會
    ,之前的前端老大離職後,自己就扛起了一些前端方面的事務。所以有些求職者以為公司找了個新手來面試,我比較斯文,像個小白臉什麼的,求職者可能會低估。第一次面試的那個求職者還比較有意思,因為那會也是第一次面試別人,所以難免有點不知所措。
  • 你應該收藏的web前端面試題
    最新前端開發工程師面試題——HTML部分1、Doctype作用?
  • 前端html,css基本知識
    上一篇講到過html和css相當於人的身體和衣服的關係,html的歷史發展百度上可以搜到,這裡簡單了解一下,1989年開發出了世界上第一個Web伺服器與Web客戶端,並將這項發明取名為world wide web,也就是我們現在所說的WWW全球資訊網。HTML也因此誕生。
  • web前端開發面試題一之(html,css)
    看全部問題和答案點這裡(https://github.com/markyun/My-blog/tree/master/Front-end-Developer-Questions/Questions-and-Answers)本文由我收集總結了一些前端面試題,初學者閱後也要用心鑽研其中的原理,重要知識需要系統學習、透徹學習,形成自己的知識鏈。
  • 矚目 學分學費沒代扣怎麼破/(ㄒoㄒ)/
    為了能方便、快捷完成繳費,建議同學們於5月23日前將款項足額存入學校統一辦理的中國銀行卡上,5月25日可在「財務信息平臺--統一支付平臺」查詢銀行扣收情況。
  • 小夥面試時偷老闆錢包?沒學過面試十大禁忌吧!
    前幾天日本也有個小夥砸認認真真地準備著這些面試經,準備去一家電梯維修公司應聘。面試他的正是公司老闆,但是因為工作繁忙,面試屢次被打斷。這小夥砸和老闆桌上的錢包單獨相處的時間裡,一顆心就蠢蠢欲動起來……最終沒有抵住那萌動的心,趁機翻走了老闆錢包裡的大額鈔票,共計5萬日元(約3100元人民幣)。