前端面試常考問題之css盒模型

2021-01-09 李天下xue

一、題目:談一談你對CSS盒模型的認識

專業的面試,一定會問 CSS 盒模型。對於這個題目,我們要回答一下幾個方面:

(1)基本概念:content、padding、margin。

(2)標準盒模型、IE盒模型的區別。不要漏說了IE盒模型,通過這個問題,可以篩選一部分人。

(3)CSS如何設置這兩種模型(即:如何設置某個盒子為其中一個模型)?如果回答了上面的第二條,還會繼續追問這一條。

(4)JS如何設置、獲取盒模型對應的寬和高?這一步,已經有很多人答不上來了。

(5)實例題:根據盒模型解釋邊距重疊。

前四個方面是逐漸遞增,第五個方面,卻鮮有人知。

(6)BFC(邊距重疊解決方案)或IFC。

如果能回答第五條,就會引出第六條。BFC是面試頻率較高的。

總結:以上幾點,從上到下,知識點逐漸遞增,知識面從理論、CSS、JS,又回到CSS理論。

二、接下來,我們把上面的六條,依次講解。

問題(1)

content就是內容區域,padding是內邊距,margin是外邊距,width和height則要根據是什麼模型決定

問題(2)標準盒模型和IE盒子模型

CSS盒模型和IE盒模型的區別:

在 標準盒子模型中,width 和 height 指的是內容區域的寬度和高度。增加內邊距、邊框和外邊距不會影響內容區域的尺寸,但是會增加元素框的總尺寸。IE盒子模型中,width 和 height 指的是內容區域+border+padding的寬度和高度。問題(3)CSS如何設置這兩種模型

備註:我們通常說的盒子默認為標準盒模型。

問題(4)JS如何設置、獲取盒模型對應的寬和高

方式一:通過DOM節點的 style 樣式獲取

缺點:通過這種方式,只能獲取行內樣式,不能獲取內嵌的樣式和外鏈的樣式。

這種方式有局限性,但應該了解。

方式二(通用型)

```

// window.getComputedStyle(element).width/height;

111

222

var oDiv1 = document.getElementById("div1");

console.log( window.getComputedStyle(oDiv1).width ) ;

```

這種方式能兼容 Chrome、火狐。是通用型方式。

方式三(IE獨有的)

```

//element.currentStyle.width/height;

var oDiv1 = document.getElementById("div1");

console.log( oDiv1.currentStyle.width);

```

和方式二相同,但這種方式只有IE獨有。獲取到的是運行完之後的寬高(三種css樣式都可以獲取)。

方式四

```

// element.getBoundingClientRect().width/height;

var oDiv1 = document.getElementById("div1");

console.log(oDiv1.getBoundingClientRect().width);

```

這種方式獲得到的寬度是內容content+padding+border

此 api 的作用是:獲取一個元素的絕對位置。絕對位置是視窗 viewport 左上角的絕對位置。

此 api 可以拿到四個屬性:left、top、width、height。

上面的四種方式,要求能說出來區別,以及哪個的通用型更強。

問題(5)margin塌陷/margin重疊

只有在標準文檔流中,而且是豎直方向的margin不疊加,只取較大的值作為margin

其他情況比如說,標準文檔流的水平方向的margin是可以疊加的,即水平方向沒有塌陷現象,and 如果不在標準流,比如盒子都浮動了,那麼兩個盒子之間是沒有margin重疊的現象的。

1.兄弟元素之間

2.子元素和父元素之間

對於上面那段代碼,兒子設了個上外邊距10px,那兒子不應該在父元素裡面往下竄10px嘛,而且父元素由於上面沒給高,所以搞應該是子元素100+margin10 =110px才對呀?然而,現實卻是子元素帶著父元素一塊往下竄了10px,而且父元素高度和子元素一樣是100px而不是110px,為啥子嘞?

因為兒子和父親在豎直方向上,共一個margin,margin塌陷

如果我們給父元素加個邊框border

或者我們給父元素設置一個屬性:overflow: hidden都可以避免這個問題

此時父親的高度是110px,這個用到的就是BFC(下一段講解)。

綜上

margin這個屬性,本質上描述的是兄弟和兄弟之間的距離; 最好不要用這個marign表達父子之間的距離。

所以,如果要表達父子之間的距離,我們一定要善於使用父親的padding,而不是兒子的margin。

問題(6)BFC(邊距重疊解決方案)

1.BFC的概念

BFC(Block Formatting Context):塊級格式化上下文。你可以把它理解成一個獨立的區域。

另外還有個概念叫IFC。不過,BFC問得更多。

2.BFC 的原理/BFC的布局規則【非常重要】

BFC 的原理,其實也就是 BFC 的渲染規則(能說出以下四點就夠了)。包括:

(1)BFC 內部的子元素,在垂直方向,邊距會發生重疊。

(2)BFC在頁面中是獨立的容器,外面的元素不會影響裡面的元素,反之亦然。(稍後看舉例1)

(3)BFC區域不與旁邊的float box區域重疊。(可以用來清除浮動帶來的影響)。(稍後看舉例2)

(4)計算BFC的高度時,浮動的子元素也參與計算。(稍後看舉例3)

3.如何生成BFC

有以下幾種方法:

方法1:overflow: 不為vidible,可以讓屬性是 hidden、auto。【最常用】

方法2:浮動中:float的屬性值不為none。意思是,只要設置了浮動,當前元素就創建了BFC。

方法3:定位中:只要posiiton的值不是 static或者是relative即可,可以是absolute或fixed,也就生成了一個BFC。

方法4:display為inline-block, table-cell, table-caption, flex, inline-flex

5.BFC 原理解釋說明

(1)解決 margin 重疊

當父元素和子元素發生 margin 重疊時,解決辦法:給子元素或父元素創建BFC。

應用原理第二條:BFC區域是一個獨立的區域,不會影響外裡面的元素。

(2)清除浮動

上圖中,由於左側的小綠塊浮動了。所以下面的紅色塊就上去了,有一部分在綠塊下面

如果要解決這個問題,可以將右側的元素創建BFC,應用原理第三條:BFC區域不與float box區域重疊。解決辦法如下:(將right區域添加overflow屬性)

(3)清除浮動

現在有下面這樣的結構:

上面的代碼中,兒子浮動了,但由於父親沒有設置高度,導致看不到父親的背景色(此時父親的高度為0)。正所謂有高度的盒子,才能關住浮動。

如果想要清除浮動帶來的影響,方法一是給父親設置高度,然後採用隔牆法。方法二是 BFC:給父親增加 overflow=hidden屬性即可, 增加之後,效果如下:

為什麼父元素成為BFC之後,就有了高度呢?這就應用到了原理第四條:計算BFC的高度時,浮動元素也參與計算。意思是,在計算BFC的高度時,子元素的float box也會參與計算。

相關焦點

  • CSS常考知識點
    給元素添加的內聯樣式 (例如 style="font-weight:bold") 總會覆蓋外部樣式表的任何樣式 ,因此可看作是具有最高的優先級面試官:複雜的項目裡往往會遇到樣式給覆蓋的問題,解決此類問題行之有效方法有哪些呢?(拓展題)最簡單的方法是給這個樣式後面增加 !
  • css-盒模型
    的寬度,height指的是內容區域content的高度標準盒模型下盒子的大小 = content + border + padding + margin怪異盒模型中的width指的是內容、邊框、內邊距總的寬度(content + border + padding
  • HTML+CSS實戰系列——盒模型製作
    主要內容盒模型的概念標準盒模型怪異盒模型彈性盒模型CSS盒模型本質上是一個盒子,封裝周圍的HTML元素,它包括:邊距(margin),邊框(border),填充(padding),和實際內容(content)。盒模型允許我們在其它元素和周圍元素邊框之間的空間放置元素。
  • 前端進階:css必知的幾個底層知識和技巧
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫學習方法推薦問題學習法:帶著問題去學習,有利於集中注意力,目的明確,這既是有意學習的要求,也是發現學習的必要條件
  • 2019前端面試經典(html5+css3+JavaScript)
    複製代碼新標籤兼容低版本ie9之前版本通過createElement創建html5新標籤引入html5shiv.jsCSS相關1.盒模型1.ie盒模型算上border、padding及自身(不算margin),標準的只算上自身窗體的大小 css設置方法如下/* 標準模型 */box-sizing:content-box; /*IE模型*/box-sizing
  • 小白必知什麼是css和盒模型
    CSS盒模型概念CSS 盒模型 也叫框模型 (Box
  • 一個在線css三角形生成器
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫為了提高 前端開發效率, 筆者先後寫了上百個前端工具, 有些是給公司內部使用的, 有些單純是因為自己太「懶」, 不想寫代碼, 所以才「被迫
  • 牢記這些常見的HTML5前端面試問題!
    因此,企業也對web前端人才的需求不斷加大。那麼,想要在企業上任web前端崗位,就離不開面試。接下來,上海千鋒就向大家分享一些HTML5面試中常見的有關技術點的問題,希望能助大家面試一臂之力!
  • 2020Web前端程式設計師常見面試題及答案-開課吧
    Web前端面試題及答案使用css解析:減少加載多張圖的 HTTP 請求數(張雪碧圖只需要個請求)提前加載資源css sprites如何操作?解析:使具(PS之類的)將多張圖打包成張雪碧圖,並為其成合適的 CSS。
  • 2020Web前端面試題匯總-開課吧
    Web前端面試題說說前端中的事件流以上就是小科今天整理提供的Web前端開發面試題,希望為Web前端同學提供了有用的面試素材,以後小科每日均會提供Python、Web及MySQL資料庫相關的習題。學習沒有捷徑,希望大家都能少走一些彎路,順利找到工作!
  • 2020年6月英語四級聽力常考話題:求職面試
    新東方網>大學教育>四六級>複習輔導>四級>四級輔導>聽力>正文2020年6月英語四級聽力常考話題:求職面試 2020-05-25 23:17 來源
  • 《前端5分鐘》之使用純css實現網站換膚和焦點圖切換動畫
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫今天我們來繼續復盤一些工作中常用的css技巧和知識,以便我們可以更加優雅的用css實現富有動感的網站.
  • 26自學轉行前端(寫給和1年前一樣迷茫的我的你)
    然後聊了那麼久,最後我還是給他機會了,我和他說基礎很重要,你面試的是前端,給你個PSD圖,做個靜態來看看先(結果你們肯定想不到。。。、js大部分基礎知識,還有實戰,質量還是可以的,唯一不足的是老師說學完這套視頻運氣好可以找份5000左右的工作,我居然又信了(這裡除了求職者,可能還有用人公司的問題,後文寫到求職經歷時再行說明)我是個比較糾結的人,之後還看了很多html和css的基礎視頻,幾乎都是講解屬性作用的,當然還有編碼規範,我覺得不能相信一家之詞,所以看了很多相同的視頻,甚至還刷了一遍W3C
  • 前端工程化(ES6模塊化和webpack打包css,less,scss,圖片,字體...
    模塊化規範傳統開發模式主要問題/* 1. 命名衝突 2. 文件依賴*/通過模塊化解決上述問題/* 模塊化就是把單獨的一個功能封裝在一個模塊(文件)中,模塊之間相互隔離, 但是可以通過特定的接口公開內部成員,也可以依賴別的模塊.
  • 最全前端面試總結來襲!抓緊收藏了!
    盒模型有標準盒模型和IE的盒模型,IE盒模型:不同之處就是標準盒模型的內容大小就是content的大小,而IE的則是content + padding +border 總的大小。那麼隨之而來第二個問題–怎麼設置這兩種模型呢?
  • 讓你見識一下什麼叫最完整、最系統的前端學習路線
    調查由淺入深,從一般性的問題開始,並逐漸延伸至各領域的科技趨勢。 回顧全球現狀,我們發現了一些有趣的現象:64% 的受訪者選擇 JavaScript 作為他們最常用的程式語言。根據開發者生態系統 2018 的調查數據,排名前三的程式語言分別是:Java (72%)、JavaScript (41%)、Python (36%) js是前端的核心,不會js更別說會前端,從2012年至今,「Web前端工程師」的需求持續走高,薪酬也是水漲船高,所以,有不少人立志要成為前端開發工程師。
  • 從前端性能優化引申出來的5道經典面試題
    渲染優化渲染優化是前端優化中一個很重要的部分,一個好的首屏時間能給用戶帶來很好的體驗,這裡要說的一點是關於首屏時間的定義,不同的團隊對首屏時間定義不一樣,有的團隊認為首屏時間就是白屏時間,是從頁面加載到第一個畫面出現的時間。
  • 2020Web前端開發常見面試題匯總-開課吧
    以下是小編為大家整理的web前端面試題及答案,供各位參考。Web前端面試題:異步請求適合在哪個生命周期調?解析:官實例的異步請求是在mounted命周期中調的,實際上也可以在created命周期中調。Web前端面試題:各個生命周期的作用是什麼?
  • Python學習第233課——css中的長度單位
    我們還是回到css的知識,css是用來修飾網頁的,前面說到網頁中的元素一般需要我們給定寬高,這個寬度和高度就需要在css裡面去寫。無論是寬度還是高度,都屬於長度,既然是長度,就有長度單位,比如公裡、米、分米、釐米、毫米等。
  • 2020Web前端開發常見面試題及答案全解析-開課吧Web前端
    Web前端開發問題一:前端如何進行seo優化,以下說法錯誤的是:A.爬蟲依賴於標籤來確定上下文和各個關鍵字的權重;HTML代碼放在最前:搜尋引擎抓取HTML順序是從上到下,保證重要內容一定會被抓取C.重要內容要用js輸出:爬蟲會執行js獲取內容D.非裝飾性圖片必須加alt解析:重要內容不能用js輸出:爬蟲不會執行js獲取內容,選C問題二