Android、IOS瀏覽器的適配問題整理

相關知識點: javascript

移動端、 兼容/適配 、 IOS點擊事件300ms延遲 、點擊穿透 、 定位失敗 ...css

手機瀏覽器特有的事件: html

onTouchmove 、 ontouched 、 ontouchstart 、 ontouchcancel。html5

使用Zepto的緣由: java

jQuery適用於PC端桌面環境,桌面環境更加複雜,jQuery須要考慮的因素很是多,尤爲表如今兼容性上面。jquery

與PC端相比,移動端的發展遠不及PC端,手機上的帶寬永遠比不上pc端。android

pc端下載jQuery到本地只須要1~3秒(90+K),可是移動端就慢了不少,2G網絡下你會看到一大片空白網頁在加載,這樣用戶可能就沒打開的慾望了。ios

zepto解決了這個問題: 只有不到10K的大小,2G網絡環境下也毫無壓力,表現不遜色於jquery。css3

因此移動端開發首選框架,我的推薦zepto.js。web

1.  IOS移動端click事件300ms的延遲響應
移動設備上的web網頁是有300ms延遲的,這樣每每會形成按鈕點擊延遲甚至是點擊失效。

此問題是因爲區分單擊事件和雙擊屏幕縮放的歷史緣由形成的。

2007年蘋果發佈首款iphone上IOS系統搭載的safari爲了將適用於PC端上大屏幕的網頁能比較好的展現在手機端上,使用了雙擊縮放(double tap to zoom)的方案。

好比在手機上用瀏覽器打開一個PC上的網頁,可能看到的頁面內容雖然能夠撐滿整個屏幕,可是字體、圖片都很小看不清,此時能夠快速雙擊屏幕上的某一部分,你就能看清該部分放大後的內容,再次雙擊後能回到原始狀態。

雙擊縮放是指用手指在屏幕上快速點擊兩次,iOS 自帶的 Safari 瀏覽器會將網頁縮放至原始比例。

緣由就出在瀏覽器須要如何判斷快速點擊上,當用戶在屏幕上單擊某一個元素時候,例如跳轉連接<a href="#"></a>,此處瀏覽器會先捕獲該次單擊,但瀏覽器不能決定用戶是單純要點擊連接仍是要雙擊該部分區域進行縮放操做,因此,捕獲第一次單擊後,瀏覽器會先Hold一段時間t,若是在t時間區間裏用戶未進行下一次點擊,則瀏覽器會作單擊跳轉連接的處理,若是t時間裏用戶進行了第二次單擊操做,則瀏覽器會禁止跳轉,轉而進行對該部分區域頁面的縮放操做。那麼這個時間區間t有多少呢?在IOS safari下,大概爲300毫秒。這就是延遲的由來。

形成的後果: 用戶純粹單擊頁面,頁面須要過一段時間才響應,給用戶慢體驗感受,對於web開發者來講是,頁面js捕獲click事件的回調函數處理,須要300ms後才生效,也就間接致使影響其餘業務邏輯的處理。

解決方案:

fastclick能夠解決在手機上點擊事件的300ms延遲
zepto的touch模塊,tap事件也是爲了解決在click的延遲問題
觸摸事件的響應順序爲 touchstart --> touchmove --> touchend --> click,也能夠經過綁定ontouchstart事件,加快對事件的響應,解決300ms延遲問題
2. 一些狀況下, 對非可點擊元素(如label,span)監聽click事件 , IOS不會觸發
解決方案: 

CSS增長 cursor: pointer;

3. 三星手機遮罩層下的input、select、a等元素能夠被點擊和focus(點擊穿透)
問題發現於三星手機,這個在特定需求下才會有,所以若是沒有相似問題的能夠不看。

首先需求是浮層操做,在三星上被遮罩的元素依然能夠獲取focus、click、change,

解決方案有2種:

1.經過層顯示之後加入對應的class名控制,截斷顯示層下方可獲取焦點元素的事件獲取
2.經過將可獲取焦點元素加入的disabled屬性,也能夠利用屬性加dom鎖定的方式(disabled的一種變換方式)
4. 安卓瀏覽器看背景圖時,有些設備會模糊
用同等比例的圖片在PC機上很清楚,可是手機上很模糊,緣由是什麼呢?

通過研究,是devicePixelRatio做怪。

由於手機分辨率過小,若是按照分辨率來顯示網頁,這樣字會很是小,因此蘋果當初就把iPhone 4的960*640分辨率,在網頁裏只顯示了480*320,這樣devicePixelRatio=2。

如今android比較亂,有1.5的,有2的也有3的。

想讓圖片在手機裏顯示更爲清晰,必須使用2x的背景圖來代替img標籤(通常狀況都是用2倍)。

例如一個div的寬高是100*100,背景圖必須得200*200,而後background-size:contain;,這樣顯示出來的圖片就比較清晰了。

代碼能夠以下:

background:url(../images/icon/all.png) no-repeat center center;
-webkit-background-size:50px 50px;
background-size: 50px 50px;
display:inline-block;
width:100%;
height:50px;
5. H5頁面有個很頭疼的問題: 當輸入框在最底部,點擊軟鍵盤後輸入框會被遮擋。
可採用以下方式解決: 

var oHeight = $(document).height(); //瀏覽器當前的高度
$(window).resize( function(){
if( $(document).height() < oHeight ){
$("#footer").css("position","static");
}else{
$("#footer").css("position","absolute");
}
});
關於Web移動端Fixed佈局的解決方案,這篇文章也不錯 http://efe.baidu.com/blog/mobile-fixed-layout/

6. 消除 transition 閃屏
-webkit-transform-style: preserve-3d; /*設置內嵌的元素在 3D 空間如何呈現:保留 3D*/
-webkit-backface-visibility: hidden; /*(設置進行轉換的元素的背面在面對用戶時是否可見:隱藏)*/
7. CSS3動畫頁面閃白,動畫卡頓
 解決方法:

1.儘量地使用合成屬性transform和opacity來設計CSS3動畫,不使用position的left和top來定位
2.開啓硬件加速
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
8. 阻止旋轉屏幕時自動調整字體大小
html, body, form, fieldset, p, div, h1, h2, h3, h4, h5, h6 {
-webkit-text-size-adjust:none;
}
 9. Input 的placeholder會出現文本位置偏上的狀況
      PC端, 設置 line-height = height ;

      移動端, 設置 line-height : normal;

10. 往返緩存問題
      點擊瀏覽器的回退,有時候不會自動執行js,特別是在mobile safari中。這與 往返緩存(bfcache) 有關係。

      解決方法 :

window.onunload = function(){};
11. calc的兼容性處理
       CSS3中的calc變量

       在iOS6瀏覽器中必須加-webkit-前綴,目前的FF瀏覽器已經無需-moz-前綴。

       Android瀏覽器目前仍然不支持calc,因此要在以前增長一個保守尺寸:

div {
width: 95%;
width: -webkit-calc(100% - 50px);
width: calc(100% - 50px);
}
12. 加上一個CSS3的屬性後,所關聯的元素的事件監聽都會失效,至關於讓元素變得「看得見,點不着」。
     IE到11纔開始支持,其餘瀏覽器的當前版本基本都支持。

pointer-events : none;
   詳細介紹見這裏:https://developer.mozilla.org/zh-CN/docs/Web/CSS/pointer-events

13. 防止手機中網頁放大和縮小
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0" />
14. 上下拉動滾動條時卡頓、慢
body {
-webkit-overflow-scrolling:touch;
overflow-scrolling: touch;
}
  Android3+ 和 iOS5+ 支持 C3的新屬性: overflow-scrolling

15. 關於圖片加載
  關於圖片加載很慢的問題,在手機開發通常用canvas方法加載:
  具體的canvas API 參見:http://javascript.ruanyifeng.com/htmlapi/canvas.html

  下面是一個可行的canvas例子: 

<li><canvas></canvas></li>

js動態加載圖片和li 總共舉例17張圖片!

var total = 17;
var zWin = $(window);
var render = function(){
var padding = 2;
var winWidth = zWin.width();
var picWidth = Math.floor( (winWidth-padding*3)/4 );
var tmpl ='';
for(var i = 1; i <= totla; i++){
var p = padding;
var imgSrc = 'img/' + i + '.jpg';
if( i%4 == 1){
p=0;
}
tmpl +='<li style="width:'+picWidth+'px;height:'+picWidth+'px;padding-left:'+p+'px;padding-top:'+padding+'px;"><canvas id="cvs_'+i+'"></canvas></li>';
var imageObj = newImage();
imageObj.index = i;
imageObj.onload = function(){
var cvs =$('#cvs_'+this.index)[0].getContext('2d');
cvs.width = this.width;
cvs.height = this.height;
cvs.drawImage(this,0,0);
}
imageObj.src = imgSrc;
}
}
render();

16. 關於Zepto點透
zepto的tap是經過兼聽綁定在document上的touch事件來完成tap事件的模擬的,同時tap事件是冒泡到document上觸發的。

在點擊完成時的tap事件(touchstart\touchend)須要冒泡到document上纔會觸發。

而在冒泡到document以前,用戶手的接觸屏幕(touchstart)和離開屏幕(touchend)是會觸發click事件的,由於click事件有延遲觸發(這就是爲何移動端不用click而用tap的緣由)(大概是300ms,爲了實現safari的雙擊事件的設計),因此在執行完tap事件以後,彈出來的選擇組件立刻就隱藏了,此時click事件還在延遲的300ms之中。當300ms到來時,click到的其實不是完成而是隱藏以後的下方的元素。若是正下方的元素綁定的有click事件此時便會觸發,若是沒有綁定click事件的話就當沒click,可是正下方的是input輸入框(或者select選擇框或者單選複選框),點擊會默認聚焦而彈出輸入鍵盤,也就出現了上面的點透現象。

   解決方案 : 


//(1)引入fastclick.js,在頁面中加入以下js代碼
window.addEventListener( "load", function() {
FastClick.attach( document.body );
}, false );

//(2)有zepto或者jQuery的js裏面加上
$(function() {
FastClick.attach(document.body);
});

//(3)固然require的話就這樣:
var FastClick = require('fastclick');
FastClick.attach(document.body, options);

//(4)用touchend代替tap事件並阻止掉touchend的默認行爲preventDefault()
$("#cbFinish").on("touchend", function (event) {
//不少處理好比隱藏什麼的
event.preventDefault();
});

//(5)延遲必定的時間(300ms+)來處理事件
$("#cbFinish").on("tap", function (event) {
setTimeout(function(){
//不少處理好比隱藏什麼的
},320);
});
17.html5調用安卓或者ios的撥號功能
     H5 提供了自動調用撥號的標籤: 只要在 <a>標籤的 href中添加 tel: 就能夠實現。

<a href="tel:4008106999,1034">400-810-6999 轉 1034 </a>

撥打手機直接以下:
<a href="tel:15677776767">點擊撥打15677776767</a>
   IOS中好像並未生效。

18. 禁止文本選中
Element {
-webkit-user-select:none;
-moz-user-select:none;
-khtml-user-select:none;
user-select:none;
}
禁止ios和android用戶選中文字
-webkit-user-select:none
 

19. 關於Android和IOS
在ios和andriod中,audio元素和video元素沒法自動播放
        解決方案: 觸屏即播

$('html').one('touchstart', function(){ audio.play()} )
fixed定位缺陷

       IOS下, fixed元素容易定位出錯:  軟鍵盤彈出時,影響fixed元素的定位。

       Android下 , fixed表現要比IOS更好。軟鍵盤彈出時,不會影響fixed元素定位

       IOS4 下不支持 : position : fixed

       解決方案:  使用 iScroll插件

在移動端修改難看的點擊的高亮效果,iOS和安卓下都有效:
*{
-webkit-tap-highlight-color:rgba(0,0,0,0);
}
        不過此方法在如今的Android瀏覽器下,只能去掉橙色的背景色,點擊產生的高亮邊框並無去掉。

20. 關於Android
不讓 Android 手機識別郵箱

<meta content="email=no" name="format-detection" />
 

 android下取消輸入語音按鈕

input::-webkit-input-speech-button {display: none}
 

 
21. 關於IOS
禁止 iOS 識別長串數字爲電話
<meta content="telephone=no" name="format-detection" />
禁止 iOS 彈出各類操做窗口
-webkit-touch-callout:none
iOS 系統 中文輸入法 輸入英文時,字母之間可能會出現一個六分之一空格   
       使用正則去掉: 

this.value = this.value.replace( /\u2006/g , '' );
ios下取消input在輸入時默認的英文首字母大寫
<input autocapitalize="off" autocorrect="off" />
iOS6下僞類:hover
        除<a>標籤以外的元素都無效; 在Android下則有效。 相似

div#topFloatBar_l:hover
#topFloatBar_menu { display:block; }
        這樣的導航顯示在iOS6點擊沒有點擊效果,只能經過增長點擊偵聽器給元素增減class來控制子元素。

22. IOS 和 Android 下觸摸元素是出現半透明灰色遮罩
    設置 alpha 值爲0 便可去除半透明灰色遮罩。

    注: transparent屬性值在Android下無效。

Element {
-webkit-tap-highlight-color : rgba( 255,255,255, 0);
}
  參考文檔http://www.jb51.net/post/phone_web_ysk

23. 去掉 iPhone 和 iPad 下輸入框 默認內陰影
Element{
-webkit-appearance: none;
}
24. active兼容處理 即 僞類 :active 失效
方法一:body添加ontouchstart
<body ontouchstart="">
方法二:js給 document 綁定 touchstart 或 touchend 事件
<style>
a {
color:#000;
}
a:active {
color:#fff;
}
</style>
<a herf=foo >bar</a>
<script>
document.addEventListener('touchstart',function(){},false);
</script>
25. 動畫定義3D啓用硬件加速
Element {
-webkit-transform:translate3d(0,0,0)
transform: translate3d(0,0,0);
}
注意:3D變形會消耗更多的內存與功耗
26. Retina屏的1px邊框
Element{
border-width:thin;
}
27. webkit mask 兼容處理
某些低端手機不支持css3 mask,能夠選擇性的降級處理。
好比可使用js判斷來引用不一樣class:
if('WebkitMask'indocument.documentElement.style){
alert('支持mask');
}else{
alert('不支持mask');
}
28. 圓角bug
某些Android手機圓角失效
解決方案:background-clip: padding-box;
29. 頂部狀態欄背景色
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
說明:除非你先使用apple-mobile-web-app-capable指定全屏模式,不然這個meta標籤不會起任何做用。
若是content設置爲default,則狀態欄正常顯示。
若是設置爲blank,則狀態欄會有一個黑色的背景。
若是設置爲blank-translucent,則狀態欄顯示爲黑色半透明。
若是設置爲default或blank,則頁面顯示在狀態欄的下方,即狀態欄佔據上方部分,頁面佔據下方部分,兩者沒有遮擋對方或被遮擋。
若是設置爲blank-translucent,則頁面會充滿屏幕,其中頁面頂部會被狀態欄遮蓋住(會覆蓋頁面20px高度,而iphone4和itouch4的Retina屏幕爲40px)。
默認值是default。
30. 設置緩存
<meta http-equiv="Cache-Control"content="no-cache"/>
手機頁面一般在第一次加載後會進行緩存,而後每次刷新會使用緩存而不是去從新向服務器發送請求。
若是不但願使用緩存能夠設置no-cache。
31. 桌面圖標
<link rel="apple-touch-icon"href="touch-icon-iphone.png"/>
<link rel="apple-touch-icon"sizes="76x76"href="touch-icon-ipad.png"/>
<link rel="apple-touch-icon"sizes="120x120"href="touch-icon-iphone-retina.png"/>
<link rel="apple-touch-icon"sizes="152x152"href="touch-icon-ipad-retina.png"/>
iOS下針對不一樣設備定義不一樣的桌面圖標。若是不定義則以當前屏幕截圖做爲圖標。
上面的寫法可能你們會以爲會有默認光澤,下面這種設置方法能夠去掉光澤效果,還原設計圖的效果!
<link rel="apple-touch-icon-precomposed"href="touch-icon-iphone.png"/>
圖片尺寸能夠設定爲5757(px)或者Retina能夠定爲114114(px),ipad尺寸爲72*72(px)
32. 啓動畫面
<link rel="apple-touch-startup-image"href="start.png"/>
iOS下頁面啓動加載時顯示的畫面圖片,避免加載時的白屏。
能夠經過madia來指定不一樣的大小:
<!--iPhone-->
<link href="apple-touch-startup-image-320x460.png"media="(device-width: 320px)" rel="apple-touch-startup-image"/>
<!-- iPhone Retina -->
<link href="apple-touch-startup-image-640x920.png"media="(device-width: 320px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image"/>
<!-- iPhone 5-->
<link rel="apple-touch-startup-image"media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)" href="apple-touch-startup-image-640x1096.png">
<!-- iPad portrait-->
<link href="apple-touch-startup-image-768x1004.png"media="(device-width: 768px) and (orientation: portrait)" rel="apple-touch-startup-image"/>
<!-- iPad landscape-->
<link href="apple-touch-startup-image-748x1024.png"media="(device-width: 768px) and (orientation: landscape)" rel="apple-touch-startup-image"/>
<!-- iPad Retina portrait-->
<link href="apple-touch-startup-image-1536x2008.png"media="(device-width: 1536px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image"/>
<!-- iPad Retina landscape-->
<link href="apple-touch-startup-image-1496x2048.png"media="(device-width: 1536px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 2)"rel="apple-touch-startup-image"/>
33. 瀏覽器私有及其它meta
如下屬性在項目中沒有應用過,能夠寫一個demo測試如下!
//QQ瀏覽器私有
全屏模式
<meta name="x5-fullscreen"content="true">
強制豎屏
<meta name="x5-orientation"content="portrait">
強制橫屏
<meta name="x5-orientation"content="landscape">
應用模式
<meta name="x5-page-mode"content="app">
//UC瀏覽器私有
全屏模式
<meta name="full-screen"content="yes">
強制豎屏
<meta name="screen-orientation"content="portrait">
強制橫屏
<meta name="screen-orientation"content="landscape">
應用模式
<meta name="browsermode"content="application">
//其它
針對手持設備優化,主要是針對一些老的不識別viewport的瀏覽器,好比黑莓
<meta name="HandheldFriendly" content="true">
微軟的老式瀏覽器
<meta name="MobileOptimized" content="320">
windows phone 點擊無高光
<meta name="msapplication-tap-highlight" content="no">
34. IOS中input鍵盤事件keyup、keydown、keypress支持不是很好
問題是這樣的,用input search作模糊搜索的時候,在鍵盤裏面輸入關鍵詞,會經過ajax後臺查詢,而後返回數據,而後再對返回的數據進行關鍵詞標紅。用input監聽鍵盤keyup事件,在安卓手機瀏覽器中是能夠的,可是在ios手機瀏覽器中變紅很慢,用輸入法輸入以後,並未馬上相應keyup事件,只有在經過刪除以後才能相應!
解決辦法:
能夠用html5的oninput事件去代替keyup
<input type="text"id="testInput">
<script type="text/javascript">
document.getElementById('testInput').addEventListener('input',function(e){
varvalue = e.target.value;
});
</script>
而後就達到相似keyup的效果!
35. H5網站input 設置爲type=number的問題
      H5網頁input 的type設置爲number通常會產生3個問題:
         1. maxlength屬性很差用了。
         2. form提交的時候,默認給取整了。由於form提交默認作了表單驗證,step默認是1。
         3. 部分安卓手機出現樣式問題。

      問題1的解決方案  : 

<input type="number" oninput="checkTextLength(this ,10)">

functioncheckTextLength(obj, length) {
if( obj.value.length > length) {
obj.value = obj.value.substr(0, length);
}
}
    問題2的解決方案:  設置step屬性

<input type="number" step="0.01" />

假如step和min一塊兒使用,那麼數值必須在min和max之間。
    問題3的解決方案:   去除input的默認樣式

input[type=number] {
-moz-appearance:textfield;
}
input[type=number]::-webkit-inner-spin-button,
input[type=number]::-webkit-outer-spin-button {
-webkit-appearance:none;
margin:0;
}
36. IOS設置 input按鈕樣式會被 默認樣式覆蓋
  解決方案:  設置默認樣式爲 none

input,textarea {
border: 0;
-webkit-appearance: none;
}
37. select下拉選擇設置右對齊
select option {
direction: rtl;
}
38. 經過transform進行skew變形, rotate旋轉 會產生 鋸齒現象
     解決方案: 

-webkit-transform: rotate(-4deg) skew(10deg) translateZ(0);
transform: rotate(-4deg) skew(10deg) translateZ(0);
outline: 1px solid rgba(255,255,255,0);
39. 關於IOS 和 OSX 端字體的優化(橫豎屏會出現字體加粗不一致的現象)
     iOS 瀏覽器 橫屏時會重置字體大小,設置 text-size-adjust 爲 none 能夠解決 iOS 上的問題,
     但桌面版 Safari 的字體縮放功能會失效,所以最佳方案是將 text-size-adjust 爲 100% 。

-webkit-text-size-adjust:100%;
-ms-text-size-adjust:100%;
text-size-adjust:100%;
40. 移動端H5的 audio的autoplay屬性失效問題
這個不是 BUG。

因爲自動播放網頁中的音頻或視頻,會給用戶帶來一些困擾或者沒必要要的流量消耗,因此蘋果系統和安卓系統一般都會禁止自動播放和使用 JS 的觸發播放,必須由用戶來觸發才能夠播放。

解決方法思路:先經過用戶 touchstart 觸碰,觸發播放並暫停(音頻開始加載,後面用 JS 再操做就沒問題了)。

document.addEventListener('touchstart',function() {
document.getElementsByTagName('audio')[0].play();
document.getElementsByTagName('audio')[0].pause();
});
41. 移動端 H5的 input data不支持placeholder的問題  
<input placeholder="Date" class="textbox-n" type="text" onfocus="(this.type='date')" id="date">
42. type爲search的input,部分機型會自帶close按鈕樣式
      有些機型的搜索input控件會自帶close按鈕(一個僞元素)。

      而一般爲了兼容全部瀏覽器,一般會本身實現一個,此時去掉原生close按鈕的方法爲: 

Search::-webkit-search-cancel-button{
display:none;
}
    若是想使用原生close按鈕,又想使其符合設計風格,能夠對這個僞元素的樣式進行修改。

43. select的option展開
       zepto方式: 

$(sltElement).trigger("mousedown");
      原生js方式: 

functionshowDropdown(sltElement) {
var event;
event = document.createEvent('MouseEvents');
event.initMouseEvent('mousedown',true,true, window);
sltElement.dispatchEvent(event);
};
 

一樣的代碼,有的瀏覽器效果顯示「正常」,有的顯示「不正常」。

什麼是兼容問題,那麼:

不正常的緣由是什麼?(不支持 標籤屬性 or 存在bug )
該如何讓其顯示正常?
 

爲何瀏覽器會存在兼容問題?

同一瀏覽器,版本越老,存在bug越多,相對於版本越新的瀏覽器,對新屬性和標籤、新特性支持越少。
不一樣瀏覽器,核心技術不一樣,標準不一樣,實現方式也有差別,最終呈現出來在大衆面前的效果也是會有差別。
 

處理兼容問題的思路:

一、要不要作?

產品的角度(產品的受衆、受衆的瀏覽器比例、效果優先仍是基本功能優先)。
成本的角度 (有無必要作某件事)。
二、作到什麼程度?

讓哪些瀏覽器支持哪些效果。
三、如何作?

根據兼容需求選擇技術框架/庫(如jquery 1.x.x)。
根據兼容需求選擇兼容工具:html5shiv、Respond.js、CSS Reset、normalize.css、Modernizr.js、 postcss。
條件註釋、CSS Hack、js 能力檢測作一些修補。
 

漸進加強和優雅降級

漸進加強(progressive enhancement): 針對低版本瀏覽器進行構建頁面,保證最基本的功能,而後再針對高級瀏覽器進行效果、交互等改進和追加功能達到更好的用戶體驗
優雅降級`(graceful degradation): 一開始就構建完整的功能,而後再針對低版本瀏覽器進行兼容。
 

具體方法:

1. IE條件註釋 (conditional comment) 是於HTML源碼中被IE有條件解釋的語句。

條件註釋可被用來向IE提供及隱藏代碼。

注意:只有 IE9如下的瀏覽器才能識別這種語法,其餘瀏覽器僅僅認爲是普通註釋。

<!--[if IE 6]>
<p>IE6下 這句生效,在其餘瀏覽器下認爲是普通註釋</p>
<![endif]-->
<!--[if !IE]><!-->
<script>alert("在 IE 下條件語法生效,但script不執行。在非 IE 下上下兩句都被當作註釋因此當前 script 會執行");</script>
<!--<![endif]-->
<!--[if IE 8]>
<link href="ie8only.css" rel="stylesheet">
<![endif]-->
 

 
使用了條件註釋的頁面在ie9 及之前 中可正常工做,但在ie10 之後再也不支持。

 

2. CSS hack是利用瀏覽器遺留 bug 的原理來識別舊的瀏覽器。

.box{
color: red;
_color: blue; /*只有ie6認識*/
*color: pink; /*只有ie67認識*/
color: yellow\9; /*ie瀏覽器都能識別*/
}
 
如下是一些常見屬性的兼容狀況

inline-block: >=ie8
min-width/min-height: >=ie7
:before,:after: >=ie8
div:hover: >=ie7
inline-block: >=ie8
background-size: >=ie9
圓角: >= ie9
陰影: >= ie9
動畫/漸變: >= ie10
 

一些兼容寫法範例:

.clearfix:after{
content: '';
display: block;
clear: both;
}
.clearfix{
*zoom: 1; /* 僅對ie67有效,zoom:1觸發hasLayout,起到相似BFC的效果 */
}

.target{
display: inline-block;
*display: inline; /*僅對ie67生效*/
*zoom: 1; /*僅對ie67生效*/
}


<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->


<!DOCTYPE html>
<!--[if lt IE 7 ]> <html class="no-js ie6"> <![endif]-->
<!--[if IE 7 ]> <html class="no-js ie7"> <![endif]-->
<!--[if IE 8 ]> <html class="no-js ie8"> <![endif]-->
<!--[if (gte IE 9)|!(IE)]><!--><html class="no-js"><!--<![endif]-->
 
一些和兼容相關的工具/庫:

html5shiv
Respond.js
CSS Reset
normalize.css
Modernizr.js
postcss
特別是Modernizr.js 和 postcss 頗有實踐價值,值得好好看看用法。

 
 
 
 
 
 
 
 
————————————————
版權聲明:本文爲CSDN博主「wei_jia007」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。
原文連接:https://blog.csdn.net/wei_jia007/article/details/82426197

相關文章
相關標籤/搜索