高頻面試題之瀏覽器篇

1 瀏覽器兼容問題

略過了一些IE 6/7,選擇了相對常見的問題進行總結。

1.1 CSS部分

1.1.1 消除默認樣式

(1) 引入Normalize.css/reset.css

<link href="https://cdn.bootcss.com/normalize/7.0.0/normalize.min.css" rel="stylesheet">

(2) 通配符 *{margin: 0; padding: 0;}

1.1.2 H5標籤不識別

針對IE9以下瀏覽器對於h5新增標籤不識別的問題,引入html5shiv.js

<script type="text/javascript" src="https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"></script>

1.1.3 IE屬性過濾器

針對不同的IE瀏覽器,使用不同字符對特定版本瀏覽器進行樣式控制。
_color,*color,color:red\9 分別針對IE6,IE6/7,IE8及以下瀏覽器

1.1.4 清除浮動

.clearfix:after{
  display:block;
  clear:both;
  content:'.';
  visibility:hidden;
  height:0;
}
.clearfix{//IE 6/7
  *zoom:1;
}

1.2 JS部分

1.2.1 鍵盤碼keyCode

IE、FireFox、Chrome和Safari的event對象都支持一個charCode屬性,這個屬性只有在發生keypress事件時才包含值,代表按鍵字符表示的ASCII碼。此時的keyCode通常等於0或者按鍵鍵碼。IE8及之前版本和Opera則是在keyCode中保存字符的ASCII碼。

var EventUtil={
  getCharCode:function(event){
     if(typeof event.charCode=='number'){
       return event.charCode;
     }else{
       return event.keyCode; 
     }
  }
}

1.2.2 窗口大小

三者區別參考 https://www.cnblogs.com/kongxianghai/p/4192032.html
clientWidth:內容可視區寬度
offsetWidth:元素實際寬度(包括滾動條)
scrollWidth:實際內容寬度

var client_w=document.documentElement.clientWidth||document.body.clientWidth;
var client_h=document.documentElement.clientHeight||document.body.clientHeight;

同理可得 scrollWidth/scrollHeight offsetWidth/offsetHeight scrollTop
documentElement針對使用了DTD的文檔,body針對沒有使用DTD的文檔

1.2.3 跨瀏覽器的事件處理程序

var EventUtil={
  addHandler:function(element,type,handler){
    if(element.addEventListener){
      element.addEventListener(type,handler,false)
    }else if(element.attachEvent){
      element.attachEvent('on'+type,handler)
    }else{
      element['on'+type]=handler
    }
  },
  removeHandler:function(element,type,handler){
    if(element.removeEventListener){
      element.removeEventListener(type,handler,false)
    }else if(element.detachEvent){
      element.detachEvent('on'+type,handler)
    }else{
      element['on'+type]=null
    }
  }
}

JS部分還有很多類似的例子,以上只是一小部分。有問題的地方歡迎指正。

2 移動端click延遲300ms

參考 https://thx.github.io/mobile/300ms-click-delay
ios爲了分辨是縮放還是點擊而出現的問題
解決辦法:
(1) 粗暴型:禁用縮放
(2) 利用FastClick庫:原理是檢測到touchend事件後立刻觸發click事件,並且把瀏覽器300ms後真正觸發的事件給阻斷掉。

3 viewport和響應式佈局

參考 https://github.com/forthealllight/blog/issues/13
響應式佈局常用解決方案
(1) 媒體查詢 @media screen and (max-width:320px) 根據不同的設備採取不同的方式
(2) 百分比 因爲padding和margin都是針對父元素寬度而言 所以對於按比例的情況 可以使用height:0 padding:50%(2:1)
(3) rem 以根元素font-size爲基準 但是設置rem需要結合js代碼或者webpack等方式 耦合性不好

4 瀏覽器緩存機制

瀏覽器緩存策略通常分爲兩種:強緩存和協商緩存
強緩存
實現強緩存可以通過兩種響應頭實現:Expires和Cache-Control.強緩存表示在緩存期間不需要請求,state code爲200
HTTP/1.0:Expires:Wed,22 Oct 2018 08:41:00 GMT 表示資源會在該時間後過期,需要再次請求。並且Expires受制於本地時間,如果修改了本地時間,可能會造成緩存失效。
HTTP/1.1:Cache-control:max-age=30,優先級高於Expires,表示資源會在30秒後過期,需要再次請求。
協商緩存
如果緩存過期了,可以使用協商緩存來解決問題。協商緩存需要請求,緩存有效會返回304。並且需要客戶端和服務端共同實現。有兩種實現方式。
(1) Last-Modified和If-Modified-Since
前者表示本地文件最後修改日期,後者會將Last-Modified的值發送給服務器,詢問服務器在該日期後的資源是否有更新,有更新則會將新的資源發送回來。
但是如果在本地打開了緩存文件,就會造成Last-Modified被修改。所以在HTTP/1.1中出現了ETag。
(2) ETag和If-None-Match
ETag優先級比Last-Modified高。使用方式和(1)相同。
選擇合適的緩存策略
特殊地方使用特殊緩存策略
(1) 不需要緩存的地方使用Cache-control:no-store表示該資源不需要緩存
(2) 對於頻繁變動的資源來說,可以使用Cache-control:no-cache配合ETag,緩存前確認有效性,但是每次都會發送請求詢問資源是否更新。
(3) 對於代碼文件來說,通常使用Cache-control:max-age=315360000,然後對文件進行指紋處理,一旦文件名變動就會立刻下載新的文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章