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

2021-01-08 李天下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也會參與計算。

相關焦點

  • web前端學習什麼是css盒子模型
    web前端學習什麼是css盒子模型? 在網頁中,一個元素佔有空間的大小由幾個部分構成,其中包括元素的內容(content),元素的內邊距(padding),元素的邊框(border),元素的外邊距(margin)四個部分。
  • HTML+CSS:圖文結合讓你深入理解css盒模型
    本篇文章要給大家講的算是比較重點的內容了,css盒模型。理解了它對你以後頁面的排版和布局有著非常關鍵的作用。什麼是css盒模型?css盒子模型 又稱框模型 (Box Model) ,它包含了元素內容(content)、內邊距(padding)、邊框(border)、外邊距(margin)幾個要素。下圖就為我們標準的盒模型示意圖。css盒模型進階練習1)我們來看下邊的一個例子。
  • HTML+CSS實戰系列——盒模型製作
    主要內容盒模型的概念標準盒模型怪異盒模型彈性盒模型CSS盒模型本質上是一個盒子,封裝周圍的HTML元素,它包括:邊距(margin),邊框(border),填充(padding),和實際內容(content)。盒模型允許我們在其它元素和周圍元素邊框之間的空間放置元素。
  • 2020Web前端面試題匯總整理-開課吧
    2020Web前端開發面試題問題:有哪些常見的Plugin?: CSS提取到單獨的文件中,支持按需加載;問題:有哪些常見的Loader?css-loader:加載 CSS,支持模塊化、壓縮、文件導入等特性。style-loader:把 CSS 代碼注入到 JavaScript 中,通過 DOM 操作去加載CSS。 eslint-loader:通過 ESLint 檢查 JavaScript 代碼。
  • 前端進階:css必知的幾個底層知識和技巧
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫學習方法推薦問題學習法:帶著問題去學習,有利於集中注意力,目的明確,這既是有意學習的要求,也是發現學習的必要條件
  • 教資面試常考八大問題!
    教資面試官常考的八大問題 教資面試報名已經過了很久啦! 今天小優來帶你 一起來了解下考官常問八大問題 為什麼要選擇教師這個行業?
  • 一個在線css三角形生成器
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫為了提高 前端開發效率, 筆者先後寫了上百個前端工具, 有些是給公司內部使用的, 有些單純是因為自己太「懶」, 不想寫代碼, 所以才「被迫
  • 前端——css層疊樣式表關於引入問題
    我們通常寫css代碼有三種方式進行引入:①內聯樣式表② 內部樣式表 ③外部樣式表。1、內聯樣式表就是將css的樣式寫入html標籤當中,寫入效果如下:2、內部樣式表是將「style」當成一個標籤寫在html根元素裡面,因此,作為標籤,它也是有結束標籤的
  • 前端必不可少的CSS的發展史
    CSS 一般都是和 HTML 一起工作的,為 HTML 元素添加樣式,使得界面美觀,CSS 可以使用 標籤零散地添加在 HTML 文檔中,也可以全部寫入 .css 文件中,並引入文檔中。
  • css利器之sass
    內容導讀前言:Sass為web前端開發而生,它解決了直接進行css編寫時權重難以控制,嵌套層級多導致代碼編寫不方便的問題。並且加入了變量定義,循環,判斷等類似程式語言的代碼模式。極大的提高了編寫樣式的效率。
  • 擰一擰web前端面試試題螺絲,爭取面試通過造航母的船
    本文是根據多份關於web前端面試試題抽取的企業面試時用到最多的一些試題,僅供參考。怎麼去設計一個組件封裝?動畫和 js 動畫的差異1.代碼複雜度,js 動畫代碼相對複雜一些2.動畫運行時,對動畫的控制程度上,js 能夠讓動畫,暫停,取消,終止,css動畫不能添加事件3.動畫性能看,js 動畫多了一個js 解析的過程,性能不如 css 動畫好XSS
  • CSS面試須知,哪些需要掌握得CSS技巧
    1 介紹一下標準的CSS的盒子模型?與低版本IE的盒子模型有什麼不同的?標準盒子模型:寬度=內容的寬度(content)+ border + padding + margin低版本IE盒子模型:寬度=內容寬度(content+border+padding)+ margin2 box-sizing屬性?
  • 【第149期】讓CSS布局更加直觀:box-sizing
    如果你寫過CSS或者你接觸過CSS,相信你一定對盒子模型一點都不陌生。
  • Web前端學習第19課,簡單了解CSS層疊樣式表
    <p><b>要設為粗體的文字</b></p>(3) 使用樣式表來設置如果你需要更多了解和學習web前端基礎知識,請參考下面的書籍。通過引入樣式表解決了一個普遍的問題,樣式表定義如何顯示 HTML 元素,就像 字體格式化標籤和顏色屬性所起的作用那樣。樣式通常保存在外部的 .css 文件中。通過僅僅編輯一個簡單的 CSS 文檔,你就可以同時改變站點中所有頁面的布局和外觀。
  • 《前端5分鐘》之使用純css實現網站換膚和焦點圖切換動畫
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫今天我們來繼續復盤一些工作中常用的css技巧和知識,以便我們可以更加優雅的用css實現富有動感的網站.
  • 前端中的布局方式有哪些?
    在web前端開發中,存在有很多的布局模式,這些布局模式各有各的優勢,今天咱們就在說說,前端中的布局方式有哪些一、Table布局首先是table布局,table布局是一種非常古老的布局模式,很早之前都是使用
  • 深入理解CSS盒子模型
    前言:前陣子在做一個項目時,在頁面布局方面遇到了一點小問題,於是上stackoverflow上求助。ifaou在幫助我解決我問題的同時,還推薦我閱讀一篇有關CSS盒子模型的文章《The CSS Box Model》,閱讀之後受益匪淺,才知道自己對盒子模型知識還是如此欠缺。恰逢學期末,項目驗收後暫時告一段落,有空閒的時間。於是想把這篇文章翻譯出來,一方面再給自己一點挑戰和鍛鍊,另一方面也給大家參考,讓更多的人受益。這篇文章適合初級web設計朋友,讓你對盒子模型有更近一步的理解。
  • 群面問題大全及答案大全_廣東省考面試到體檢
    群面問題大全及答案大全_廣東省考面試到體檢由廣東公務員考試網考試快訊欄目由提供,更多關於廣東省考無領導小組面試,廣東公務員考試快訊的內容,請關注廣東公務員考試頻道/廣東公務員考試網!
  • 最全前端面試總結來襲!抓緊收藏了!
    盒模型有標準盒模型和IE的盒模型,IE盒模型:不同之處就是標準盒模型的內容大小就是content的大小,而IE的則是content + padding +border 總的大小。那麼隨之而來第二個問題–怎麼設置這兩種模型呢?
  • 前端零基礎入門「終結彈」用css設置文字樣式
    經過前面的文章,相信大家已經基本了解了前端最基本的一些規則了:html搭建結構,承載內容css則可以利用選擇器,來為相應的html標籤設置樣式前面提到過的樣式有最基礎的盒模型相關屬性:邊框(border)以及 背景(background),有了這兩個傢伙之後我們基本上就能清楚的看到一個盒子的相貌了,那麼現在我們就可以往裡面添加一些內容了