PC端瀏覽器兼容淺談

代碼兼容:IE7及以上,360,chrome,firefox,opera,搜狗

1. 什么是瀏覽器兼容問題:

由于不同瀏覽器的內(nèi)核不同,同一瀏覽器的不同版本對CSS的支持及解析結(jié)果不一樣,因此渲染的效果也不相同。

2. 需注意的問題

  • 寫好標(biāo)準(zhǔn)頭: <!DOCTYPE html>
  • 首先引入初始化css,保證消除不同瀏覽器默認(rèn)樣式
  • PC端H5新標(biāo)簽盡量不用,比如header,footer,nav等
  • 不使用css選擇器nth-of-type
  • jquery只有1.x版本兼容ie678,目前官方只做bug維護(hù),不再增加新功能,最終版本是jquery1.12.4

3. 解決方式

1). 讓低版本兼容h5標(biāo)簽引入html5shiv.js,讓低版本兼容媒體查詢引入respond.js

實(shí)現(xiàn)方式:

 <meta http-equiv="X-UA-Compatible" content="IE=edge">
 <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
 <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
 <!--[if lt IE 9]>
 <script src="scripts/respond/html5shiv.min.js"></script>
 <script src="scripts/respond/respond.min.js"></script>
 <![endif]-->
2). 讓低版本兼容css3的box-sizing標(biāo)簽引入boxsizing.htc

只需在css代碼box-sizing標(biāo)簽下邊引入文件的當(dāng)前路徑即可

 box-sizing: border-box;
 *behavior: url(./scripts/box-sizing-polyfill/boxsizing.htc);
3). 讓低版本ie8兼容border-radius標(biāo)簽引入ie-css3.htc

ie-css3.htc下載

-moz-border-radius: 1px;
-webkit-border-radius: 1px;
border-radius: 1px;
behavior: url(./scripts/ie-css3.htc/ie-css3.htc);
4). 低版本瀏覽器點(diǎn)擊事件不兼容處理方法,及addEventListener attachEvent解決IE 6 7 8 this指向錯誤問題

在IE678中,使用attachEvent或detachEvent后事件處事函數(shù)里this指向window對象,而addEventListener或removeEventListener中this指向事件對象元素

var oBtn = $(".groupTitle");
/*兼容寫法*/
EventListen = {
    addEvent: function(str, fn, ele) {
        if (ele.addEventListener) {
            ele.addEventListener(str, fn);      //火狐谷歌IE9+支持addEventListener
        } else if (ele.attachEvent) {
            ele.attachEvent("on" + str, fn);       //IE678支持attachEvent
        } else {
            ele["on" + str] = fn;
        }
    }
};
for (var i = 0; i < oBtn.length; i++) {
    EventListen.addEvent("click", funShow, oBtn[i]);
}

function funShow(e) {
    //事件處理函數(shù)中this指window,使用事件源代替this關(guān)鍵字
    e = e || window.event;
    var _this = e.srcElement || e.target;
    $(_this).next().slideToggle().parent("li").siblings("li").children("div").hide();
};
5). CSS hack方式

CSS hack簡單講是指各版本瀏覽器對CSS解析后出現(xiàn)網(wǎng)頁內(nèi)容誤差的處理。它通過在CSS樣式中加入一些特殊符號,讓不同瀏覽器識別不同符號(不同瀏覽器識別什么樣的符號是有標(biāo)準(zhǔn)的,CSS hack就是讓你記住這個標(biāo)準(zhǔn)),以達(dá)到應(yīng)用不同CSS樣式的目的。


從上圖可分析出以下幾種情況:

  • 大部分特殊字符IE瀏覽器支持,其他主流瀏覽器firefox、chrome、opera、safari不支持(opera可識別除外)
  • \9:所有IE瀏覽器都支持
  • \0:IE8、IE9支持,opera部分支持
  • \9\0:IE8部分支持、IE9支持
  • \0\9:IE8、IE9支持
  • *:IE6、IE7支持
  • _和-:僅IE6支持
css Hack表現(xiàn)形式
(1).CSS屬性前綴法
  • Trident內(nèi)核:主要代表為IE瀏覽器,前綴為-ms
  • Gecko內(nèi)核:主要代表為Firefox,前綴為-moz
  • Presto內(nèi)核:主要代表為Opera,前綴為-o
  • Webkit內(nèi)核:產(chǎn)要代表為Chrome和Safari,前綴為-webkit
(2).選擇器前綴法

針對一些頁面表現(xiàn)不一致或需特殊對待的瀏覽器,在CSS選擇器前加一些只有某些特定瀏覽器才能識別的前綴進(jìn)行hack。


(3).IE條件注釋法
注:IE10+已不再支持注釋,這類hack不僅對css生效,對寫在判斷語句里的所有代碼都生效                                                                                                                   
各種css Hack情況介紹
(1).區(qū)別IE和非IE瀏覽器
.tip{                                                                               
background:blue;     //非IE背景藍(lán)色  因?yàn)樗袨g覽器都能解釋
background:red\9;   //IE6789背景紅色,因?yàn)閈9在IE6789中可識別,覆蓋上面樣式 IE10跟11應(yīng)該不識別,IE11測試確定                            
}
(2).區(qū)別IE6、7、8、Firefox
.tip{                                                                         
background:blue;       //Firefox背景變藍(lán)色 所有瀏覽器都支持
background:red\9;      // IE8背景變紅色 IE6、7、8、9支持覆蓋上面樣式 
*background:black;      // IE7背景變黑色 IE6、7支持又一次覆蓋上面樣式    
_background:orange;  //IE6背景變橘色 IE6支持又一次覆蓋上面樣式 
}      

【說明】:IE7可辨識「」和「!important」,但I(xiàn)E6只可辨識「」,至于Firefox可以讀取「!important」但不能辨識「*」因此可透過這樣的差異來有效區(qū)隔IE6、7、Firefox。

(3).區(qū)分IE6、7、8、9 (“:root”偽類IE只有IE9支持,其他主流瀏覽器均支持,opera部分支持**)
element{                                                                                          
color: #999\9\0;            //IE9專用                                                        
color: #999\9;            //IE6 7 8 9共用                                                 
color: #666\0;          //IE8、9共用                                                     
*color: #999;           //IE6、7共用                                                    
*+color: #999;          //IE7專用                                                         
_color: #999;         //IE6專用                                                                     
 }                                                                                                              
:root element{ color: #666\9; }    //IE9

建議:實(shí)際開發(fā)事先如果不是很清楚可以先寫布局代碼,寫一個階段用瀏覽器測試工具(常用工具推薦IETEST)測試各個版本瀏覽器的布局效果,如有問題針對有問題的瀏覽器單獨(dú)調(diào)試。

css Hack弊病

一般情況下,盡量避免使用CSS hack,但有些情況為顧及用戶體驗(yàn)實(shí)現(xiàn)向下兼容,不得已才使用hack。比如由于IE8及以下版本不支持CSS3,而我們的項(xiàng)目頁面使用大量CSS3新屬性。在IE9/Firefox/Chrome下正常渲染,這種情況下如果不使用css3pie或htc或條件注釋等方法,可能就得讓IE8-的專屬hack出馬了。使用hack雖然對頁面表現(xiàn)的一致性有好處,但過多的濫用會造成html文檔混亂不堪,增加管理和維護(hù)的負(fù)擔(dān)。

常見問題
  1. 背景透明問題

     IE: filter: alpha(opacity=10);                                                      
     FF: -moz-opacity:0.10;                    
     .box{filter:alpha(opacity=50);-moz-opacity:0.5; opacity:0.5;}
    
  2. 圖片默認(rèn)有間距

     問題癥狀:
     幾個img標(biāo)簽放一起時,有些瀏覽器會有默認(rèn)間距,加通配符也不起作用。                  
     解決方案:使用float屬性為img布局                           
    
  3. IE浮動 margin產(chǎn)生雙邊距

    .box {                                                                                           
    float:left;                                                                                  
    width:100px;                                                                                 
    margin:0 0 0 100px;          //這種情況之下IE會產(chǎn)生200px距離
    display:inline;      //使浮動忽略                                                            
    }
    
  4. Margin不一致問題:
    當(dāng)有多張圖片需排在一行時,通常使用“Float:Left”來實(shí)現(xiàn),這樣一來,瀏覽器就存在兼容性問題。導(dǎo)致圖片與后面的內(nèi)容存在margin不一致問題。對此解決方法就是給圖片添加“Display:inline”項(xiàng)即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 做前端多年,雖然不是經(jīng)常需要hack,但是我們經(jīng)常會遇到各瀏覽器表現(xiàn)不一致的情況?;诖耍承┣闆r我們會極不情愿的...
    大女表哥閱讀 1,132評論 0 9
  • 一、如何調(diào)試 IE 瀏覽器 IE7以上版本自帶的開發(fā)者工具,IE6可以用border的方法;例:IE11的開發(fā)者工...
    __Qiao閱讀 1,136評論 2 17
  • 一、問答部分 1. 如何調(diào)試 IE 瀏覽器 IE7及以上版本有調(diào)試臺,可以按F12啟動。Paste_Image.p...
    _hello__world_閱讀 484評論 0 1
  • CSS Hack 不同的瀏覽器對某些CSS代碼解析會存在一定的差異,因此就會導(dǎo)致不同瀏覽器下給用戶展示的頁面效果不...
    zx9426閱讀 408評論 0 0
  • 是的,最近很忙,忙得跟頭絆子,可是我還不想放棄。那么,問題來了,持續(xù)了七個月的運(yùn)動,為什么放棄了?為什么暫停了?難...
    行動就是生產(chǎn)力閱讀 209評論 0 5