前端面試中如何回答「談談瀏覽器兼容性」的問題?

很多前端的面試或筆試中,都有比較籠統的「說說你所知道的各瀏覽器存在的兼容問題」,個人感覺這個問題問的太「大」了些,從樣式到腳本,都會有很多不一樣的地方(特別是IE8-對比主流瀏覽器)。實際回答的時候就會暈乎乎的不清楚如何抓住重點地來闡述。

請問我應當怎樣回答這個問題,才能較為全面又不失重點,並讓面試官感到滿意呢?


還有筆試, 估計還是在校生。

面試官問這種泛泛的兼容問題的目的,我覺得有2個可能原因.

1. 想看你總結能力,很多問題可以歸結為一個原因,如果沒經驗,坦率講沒遇到過。 我遇到太多背書的同學了,基本一問就露餡。

2. 面試官沒想好題目, 你如果實力不錯,可以藉此機會調戲下。

3. 看你是否經驗豐富,能否快速進入開發。

但是如果面試官糾結於你沒回答出某個兼容性問題,即使要了你也不要去。 特別是那種還在炫耀IE6+ 1px技能的老先生。 現在還談IE6+兼容性的面試官,真的挺掉公司的價的。

相比這麼問

「IE低版本的事件怎麼綁定?標準怎麼綁定?阻止事件的API分別是什麼」

我面試中更傾向於這麼問

「jQuery怎麼事件委託呢? 給你這個方法和這個方法,怎麼實現jQuery這種形式的事件委託。」

對過時瀏覽器的兼容性問題是沉重的知識包袱, 關鍵是這種知識沒有延續性,會影響你學習和使用新技術


我一般不問那麼籠統的問題。要問的話(通常前提是面試對象在簡歷里寫了或在交談中提及自己熟悉/擅長/精通兼容性處理),我會讓他講講自己遇到的最嚴重的兼容性case,需求是什麼,一開始怎麼做的,怎麼發現有問題,怎麼找到問題的原因,有哪些解決方案,最後選了哪一種,為什麼選這種方式,這個過程里學到了什麼,再做一次類似case會有什麼改變,將來怎麼避免等等。

你如果遇到籠統的問你的面試官,能按照這些方面有條理的敘述,估計他會喜出望外。

注意,別把我說的這些僅僅作為應試技巧,否則僥倖過得了面試也過不了試用期。


「談談瀏覽器兼容性」的問題

和「說說你所知道的各瀏覽器存在的兼容問題」

是兩個完全不同的問題。

前者,鬼知道他想要問什麼,得追問。

比如得問「您說的是哪個瀏覽器的哪類問題?還是常用瀏覽的(前端)API差異?渲染差異?等等。還是要談談瀏覽器為什麼存在兼容問題?兼容存在的歷史原因?歷史必然性等等」。

反正,偶咋感覺這貨是表達能力不行呢。

但凡腦子沒點問題,要不就是實在閑的沒事兒想跟你嘮一下午嗑的,才不會這麼問吧。

後者,基本上是個有著較明確邊界範圍的開放問題。

基本上可以知道,他是想了解你常用的常見到的常解決到的,或者近期剛剛解決過的一些瀏覽器兼容問題。從而判斷你這部分知識面、解決問題的思路等等方面內容,而且不像前者一樣慢無邊界的。

起碼,這麼問的是不太閑,不想陪你嘮嗑的。


說一個css的說一個js。

然後微笑。


先不說題目本身。

雖然有時候也會問出這種問題來,不過我一般都會趕緊自我糾正,因為這種問題太難回答了。

不過其實我的目的是讓對方自己發揮,知道什麼說什麼,自己表達出你對技術的思考。免得我問一堆問題你沒聽說過,然後就斷定你知識不達標,有些片面了,畢竟是去網上看篇文章就能掌握的事情而已。

再說題目本身:

1)太low,過時,啥年代了,還問瀏覽器兼容性?如果問移動瀏覽器的兼容性還可以原諒,如果還拿ie8一下說事,立馬走人不幹了!

2)說實話,當年ie6的bug說的一溜一溜的,現在基本都不太記得了,感覺出去面試要被鄙視了。

3)招移動前端開發,告別ie。

讓面試官滿意最好的辦法,就是,多表達自己,免得讓面試官主動問你,然後一問三不知,面試官也很尷尬的。說說你擅長的,讓對方看到你的發光點,就夠了,不必太多猜想面試官的意圖和口味。


整理了些網路收集的有關兼容性的問題,原作者不詳(侵刪),之前面試的時候也經常被問,泛泛而問,泛泛而答,其實個人感覺:提出兼容性問題,結合自己在開發中遇到這個問題的時候,解決辦法,大致說兩三個問題就差不多了,最後補充說還有一些其他問題,然後就可以把下文中有關IE兼容性的總結說出來。

##不同瀏覽器的標籤默認的外補丁和內補丁不同

問題癥狀:隨便寫幾個標籤,不加樣式控制的情況下,各自的margin 和padding差異較大。

解決方案:CSS里加 *{margin:0;padding:0;}

備註:幾乎所有的CSS文件開頭都會用通配符*來設置各個標籤的內外補丁是0。

##塊屬性標籤float後,又有橫行的margin情況下,在IE6顯示margin比設置的大(即雙倍邊距bug)

問題癥狀:常見癥狀是IE6中後面的一塊被頂到下一行

解決方案:在float的標籤樣式控制中加入 display:inline;將其轉化為行內屬性

##設置較小高度標籤(一般小於10px),在IE6,IE7,遨遊中高度超出自己設置高度

問題癥狀:IE6、7和遨遊里這個標籤的高度不受控制,超出自己設置的高度

解決方案:給超出高度的標籤設置overflow:hidden;或者設置行高line-height 小於你設置的高度。

備註:這種情況一般出現在我們設置小圓角背景的標籤里。出現這個問題的原因是IE8之前的瀏覽器都會給標籤一個最小默認的行高的高度。即使你的標籤是空的,這個標籤的高度還是會達到默認的行高。

##行內屬性標籤,設置display:block後採用float布局,又有橫行的margin的情況,IE6間距bug

問題癥狀:IE6里的間距比超過設置的間距

解決方案:在display:block;後面加入display:inline;display:table;

備註:行內屬性標籤,為了設置寬高,我們需要設置display:block;(除了input標籤比較特殊)。在用float布局並有橫向的margin後,在IE6下,他就具有了塊屬性float後的橫向margin的bug。不過因為它本身就是行內屬性標籤,所以我們再加上display:inline的話,它的高寬就不可設了。這時候我們還需要在display:inline後面加入display:table。

##圖片默認有間距

問題癥狀:幾個img標籤放在一起的時候,有些瀏覽器會有默認的間距,加了問題一中提到的通配符也不起作用。

解決方案:使用float屬性為img布局

備註:因為img標籤是行內屬性標籤,所以只要不超出容器寬度,img標籤都會排在一行里,但是部分瀏覽器的img標籤之間會有個間距。使用float是正道。

##標籤最低高度設置min-height不兼容

問題癥狀:因為min-height本身就是一個不兼容的CSS屬性,所以設置min-height時不能很好的被各個瀏覽器兼容

解決方案:如果我們要設置一個標籤的最小高度200px,需要進行的設置為:{min-height:200px; height:auto !important; height:200px; overflow:visible;}

備註:在B/S系統前端開時,有很多情況下我們又這種需求。當內容小於一個值(如300px)時。容器的高度為300px;當內容高度大於這個值時,容器高度被撐高,而不是出現滾動條。這時候我們就會面臨這個兼容性問題。

#附:IE6中的常見BUG與相應的解決辦法

##一、IE6雙倍邊距bug

例如「margin-left:10px」 在IE6中,該值就會被解析為20px。

解決方案:需要在該元素中加入display:inline 或 display:block 明確其元素類型

##二、IE6中3像素問題及解決辦法

當元素使用float浮動後,元素與相鄰的元素之間會產生3px的間隙。詭異的是如果右側的容器沒設置高度時3px的間隙在相鄰容器的內部,當設定高度後又跑到容器的相反側了。

解決方案:需要使布局在同一行的元素都加上float浮動。

##三、IE6中奇數寬高的BUG

IE6中奇數的高寬顯示大小與偶數高寬顯示大小存在一定的不同。其中要問題是出在奇數高寬上。

解決方案:需要盡量將外部定位的div高寬寫成偶數即可。

##四、IE6中圖片鏈接的下方有間隙

IE6中圖片的下方會存在一定的間隙,尤其在圖片垂直挨著圖片的時候,即可看到這樣的間隙。

解決方案:需要將img標籤定義為display:block 或定義vertical-align對應的屬性。也可以為img對應的樣式寫入font-size:0

##五、IE6下空元素的高度BUG

如果一個元素中沒有任何內容,當在樣式中為這個元素設置了0-19px之間的高度時。此元素的高度始終為19px。

解決的方法如下:

1.在元素的css中加入:overflow:hidden

2.在元素中插入html注釋:&

3.在元素中插入html的空白符:nbsp;

4.在元素的css中加入:font-size:0

##六、重複文字的BUG

在某些比較複雜的排版中,有時候浮動元素的最後一些字元會出現在clear清除元素的下面。

解決方法如下:

1.確保元素都帶有display:inline

2.在最後一個元素上使用「margin-right:-3px

3.為浮動元素的最後一個條目加上條件注釋,&xxx&

4.在容器的最後元素使用一個空白的div,為這個div指定不超過容器的寬度。

##七、IE6中 z-index失效

具體BUG為,元素的父級元素設置的z-index為1,那麼其子級元素再設置z-index時會失效,其層級會繼承父級元素的設置,造成某些層級調整上的BUG

原因:z-index起作用有個小小前提,就是元素的position屬性要 是relative,absolute或是fixed。

解決方案:

1.position:relative改為position:absolute;

2.去除浮動;

3.浮動元素添加position屬性(如relative,absolute等)。

**IE6結語:實際上中,很多BUG的解決方法都可以使用display:inline、font-size:0、float解決。因此我們在書寫代碼時要記住,一旦使用了float浮動,就為元素增加一個display:inline樣式,可以有效的避免浮動造成的樣式錯亂問題。使用空DIV時,為了避免其高度影響布局美觀,也可以為其加上font-size:0 這樣就很容易避免一些兼容上的問題。**

##子元素不會繼承透明效果

``` css

.opacity{

background-color: #000000;

filter: alpha(opacity=50);

background-color: rgba(0, 0, 0, 0.5);

}

```

##避免使用負的margin和padding


這個其實是需要分類去答,css兼容性網上很多,至於js的兼容性,看看jquery代碼裡面的注釋就可以了,有問題可以評論問我


也談兼容性——通用hack方法/CSS兼容方案/js兼容方案全推送

&>&>&>通用hack方法篇&<&<&<

&>&>&>CSS兼容方案篇&<&<&<

&>&>&>js兼容方案篇&<&<&<

基本夠用了

鏈接:知乎專欄


如果面的公司要求兼容 IE10 以下,就告訴他「希望你能成功」,然後很穩重的握個手,走人。

我要表達的並不是不要去了解如何兼容舊 IE,而是要更加符合趨勢,關注優秀的、流行的東西。

目前前端領域面臨的挑戰不是舊 IE,不能一直抓著不放,要學會忘記過去。當然,除了 IE 上有兼容性問題,其他瀏覽器(尤其是 Android 上的低版本瀏覽器和第三方廠商定製的瀏覽器)也有較多問題。是否要關注兼容性問題,要和業務掛鉤,空口說說都是扯。

如 @賀師俊 所講的,這麼籠統的問題不太負責任。

---- 2016-06-21 ----

時至今日,Chrome 佔據了國內 39% 以上的份額(來源:瀏覽器市場份額 ,來自 Chrome 的瀏覽量/時長肯定高於這個值),相當一部分公司已經用著並喜歡上 ES2015,相當一部分工具、庫和框架都已經 IE 10+。

誰來晒晒線上產品,以及用戶的瀏覽器分布,我們用事實說話。

---- 2018-01-22 ----

Chrome 攀升到 46.49%,IE10 以下的用戶比例還剩多少?


這種問題就是讓你說關於這個問題你對這個問題的認識的。

一般來說就是為什麼會產生兼容性問題。

就是瀏覽器廠商各自的技術標準和實現,對w3c標準執行的不一樣之類的,瀏覽器先一步實現了未成型的標準和自己定義了一些標準之類的。幾大內核和在這些內核上開發出來的瀏覽器因為內核的原因之類的。

怎麼處理兼容性問題。

通過各種判斷和hack和降級之類的你所知道的儘可能多的方法。

兼容性問題的發展方向

將來會出現那些更新的問題,怎麼提前避免,避免不了怎麼辦之類的。

這種問題就和寫年終總結一樣:去年怎麼樣,今年怎麼樣,明年怎麼樣。


要是我我可能會回答,要是我再考慮瀏覽器兼容性問題的時候,我首先考慮的是我的目標客戶是誰。然後把他引到我目前的客戶身上,你看吧,銀行只認IE8。所以不存在瀏覽器兼容性的問題,因為只要兼容IE8!over。


明明在進入時判斷一下瀏覽器然後再提示一句為了讓你能有最佳的用戶體驗請安裝Chrome就能解決的問題,非要將大量的人力物力浪費在兼容IE8上。請問這些能容忍IE8運行效率的訪問者真的是現在網站的目標人群?(^~^;)ゞ


這種問題經常被問到,問題是我不善於總結,對這種問題都很無力,後來學精了,把之前仿淘寶的一個頁面,兼容到ie6,問到這個直接看項目,然後就一切簡單了。。。


之前面試實習生的時候被問到如何處理瀏覽器兼容性的問題。面試官考察的是你的項目經歷做的多不多,遇到的坑多不多,有沒有做一些方法上的總結。可以從css兼容性和js兼容性兩方面上舉一些項目細節回答一些你遇到的坑。


不少面試官答著答著跑題的。還是接地氣站在題主的角度幫你參考下。

一般問出這個問題的企業,都是有瀏覽器兼容的基本需求。

然後可以和面試官交流下貴司的用戶瀏覽器分布佔比,把「各瀏覽器」的範圍縮小到這家公司主要面對(日常開發)的幾款瀏覽器。

比如IE系,IE系常見的兼容情況(css js),這裡例舉主要是展示有豐富的填坑經驗。

比如webkit系,可以介紹下對css3的實際應用,在應用的同時IE又有哪些不支持降級處理。

最後可以介紹下自己的發展方向,IE8-一路開發過來知曉理解,但更側重於現代瀏覽器,把精力投入在現在和將來。

基本分做及格了,再去談加分項。

當然所謂的加分項在一線互聯網公司僅僅是基本項,深挖自己的發展方向就是另一個話題了。


推薦閱讀:

極樂技術周報(第二十期)
開發者和用戶之間的世界觀距離有多大?
前端系列教學(入門篇) - 響應式設計(2)
[譯]2017年,一個Node開發者的好習慣

TAG:前端開發 | 前端工程師 | 瀏覽器兼容性 |