PC/H5端各瀏覽器兼容性問題及解決方案?

概念:所謂的瀏覽器兼容性問題,是指由於不一樣的瀏覽器對同一段代碼解析的差別,形成頁面顯示效果不統一的狀況。css

1>不一樣瀏覽器的標籤默認的外補丁和內補丁不一樣
問題症狀:隨便寫幾個標籤,不加樣式控制的狀況下,各自的margin 和padding差別較大。
解決方案:css裏 *{margin:0;padding:0;}html

2>塊屬性標籤同時設置了橫向margin值和float屬性後,在ie6顯示的橫向margin比設置的大一倍
問題症狀:常見症狀是ie6中後面的一塊被頂到下一行
碰到頻率:90%(稍微複雜點的頁面都會碰到,float佈局最多見的瀏覽器兼容問題)
解決方案:在float的標籤樣式控制中加入 display:inline;將其轉化爲行內屬性前端

3>行內屬性標籤設置display:block,float:left後,在ie6顯示的橫向margin比設置的大一倍
問題症狀:常見症狀是ie6中後面的一塊被頂到下一行
解決方案:在display:block;後面加入display:inline;或display:table;
備註:display有十幾種值,經常使用的是none/block/inline/inline-block/table等chrome

4>設置較小高度標籤(通常小於10px),在ie6,ie7,遨遊中高度超出本身設置高度
問題症狀:ie6-高度不受控制,超出本身設置的高度
解決方案:給超出高度的標籤設置overflow:hidden;或者設置行高line-height 小於你設置的高度。
備註:這種狀況通常出如今咱們設置小圓角背景的標籤裏。出現這個問題的緣由是ie8以前的瀏覽器都會給標籤一個最小默認的行高的高度。即便你的標籤是空的,這個標籤的高度仍是會達到默認的行高。瀏覽器

5>幾個img標籤放在一塊兒的時候,有些瀏覽器會有默認的間距,加了通配符(*{ margin:0; padding:0;})也不起做用。
解決方案:使用float屬性爲img佈局
備註:由於img標籤是行內屬性標籤,因此只要不超出容器寬度,img標籤都會排在一行裏,可是部分瀏覽器的img標籤之間會有個間距。去掉這個間距使用float是正道。app

6>標籤最低高度設置min-height不兼容
問題症狀:由於min-height自己就是一個不兼容的css屬性,因此設置min-height時不能很好的被各個瀏覽器兼容
解決方案:若是咱們要設置一個標籤的最小高度200px,須要進行的設置爲:{min-height:200px; height:auto !important; height:200px; overflow:visible;}
備註:在B/S系統前端開發時,有不少狀況下咱們有這種需求。當內容小於一個值(如300px)時。容器的高度爲300px;當內容高度大於這個值時,容器高度被撐高,而不是出現滾動條。這時候咱們就會面臨這個兼容性問題。佈局

7>css透明度的兼容設置
opacity: 0.8; //通用
filter: alpha(opacity=80); //IE
filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=80); //IE6的寫法this

IE6中3像素問題及解決辦法
當元素使用float浮動後,元素與相鄰的元素之間會產生3px的間隙。詭異的是若是右側的容器沒設置高度時3px的間隙在相鄰容器的內部,當設定高度後又跑到容器的相反側了。
解決方案:須要使佈局在同一行的元素都加上float浮動。prototype

IE7如下版本frame窗口輸入框默認不聚焦問題
解決方案:經過js給窗口添加focus.orm

IE6中奇數寬高的BUG
IE6中奇數的高寬顯示大小與偶數高寬顯示大小存在必定的不一樣。其中要問題是出在奇數高寬上。
解決方案:須要儘可能將外部定位的div高寬寫成偶數便可。

"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.爲浮動元素的最後一個條目加上條件註釋,<!–[if !IE]>xxx<![endif]–>
4.在容器的最後元素使用一個空白的div,爲這個div指定不超過容器的寬度。"


IE條件註釋
<!-- [if IE]>
//你想要執行的代碼
<![endif]-->
<!-- [if lt IE 8]>
//你想要執行的代碼
<![endif]-->
<!-- [if ! IE 8]>
//你想要執行的代碼
<![endif]-->

lt 小於;gt 大於; lte 小於等於; gte:不小於; !:不等於"


"!important 關鍵字
!important 在css中是聲明擁有最高優先級,也就是說,無論css的其餘優先級,只要!important出現,他的優先級就最高!遨遊1.6及更低版本、IE6及更低版本瀏覽器不能識別它。儘管這個!important 很實用,可是非到必要的時刻,不要使用它!"


"屬性過濾器(較爲經常使用的hack方法)
_:IE6識別; *:IE6,7識別; \9:IE8及如下瀏覽器都識別。
/* css hack*/
使用hacker 我能夠吧瀏覽器分爲3類:ie6 ;ie7和遨遊;其餘(ie8 chrome ff safari opera等)
ie6認識的hacker 是下劃線_ 和星號 *
ie7 遨遊認識的hacker是星號 * (包括上面問題6中的 !important也算是hack的一種。不過實用性較小。)
好比這樣一個css設置 height:300px;*height:200px;_height:100px;
ie6瀏覽器把高度設置爲100px;
ie7和遨遊讀到*height200px的時候就停下了,由於它們不認識_height。因此它們會把高度解析爲200px;
剩下的瀏覽器只認識第一個height:300px;因此他們會把高度解析爲300px。
由於優先級相同且想衝突的屬性設置後一個會覆蓋掉前一個,因此書寫的次序是很重要的。"


"a標籤CSS順序
link; visited; hover; active

24位的png圖片 透明度問題 IE6不支持
(1)使用8位的PNG圖片
(2)爲IE6準備一套特殊的圖片"


"盒模型差別
IE盒模型:margin 、 content(包含border、padding)
W3C盒模型: margin 、border、 padding、 content
CSS3中的box-sizing的屬性就是爲了這兩種模式,border-box(IE盒明星)和content-box(W3C)"


"IE8如下不兼容indexof()方法, 添加indexof的原型方法便可;
if (!Array.prototype.indexOf){
Array.prototype.indexOf = function(elt){
var len = this.length >>> 0;
var from = Number(arguments[1]) || 0;
from = (from < 0)? Math.ceil(from): Math.floor(from);
if (from < 0){
from += len;
}
for (; from < len; from++){
if (from in this && this[from] === elt){
return from;
}
}
return -1;
};
}"


"event.srcElement
IE下,even不存在target屬性
srcObj = event.srcElement ? event.srcElement : event.target;"
"父節點parentElement
ele.parentElement
//firebox不支持


ele.parentNode
//通用"
"在IE中使用innerHtml和appendChild無效
解決方法:
(1)將內容插入到tbody中
(2)使用jQuery的append()"


"座標event.x和event.pageX
var page = {};
page.x = event.x ? event.x : event.pageX;
page.y = event.y ? event.y:event.pageY;
//event的x,y在IE中支持,pageX和pageY在Firefox中支持"
"element.attachEvent和element.addEventListener
element.detachEvent和element.removeEventListener
//IE提供了attachEvent和detachEvent兩個接口,而Firefox提供的是addEventListener和removeEventListener。"


"鍵盤事件 keyCode和which
function getKeyCode(e){

//兼容IE和Firefox得到keyBoardEvent對象
e = e ? e : (window.event ? window.event : """")
//兼容IE和Firefox得到keyBoardEvent對象的鍵值
return e.keyCode ? e.keyCode : e.which;
}
//IE:e.keyCode
//fireFox: e.which"

"友情提示:IE7及如下版本瀏覽器窗口有默認滾動條。瀏覽器兼容性問題處理技巧:(1)每寫一小段代碼(佈局中的一行或者一塊)咱們都要在不一樣的瀏覽器中看是否兼容,固然熟練到必定的程度就沒這麼麻煩了。(建議常常會碰到兼容性問題的新手使用。)不少兼容性問題都是由於瀏覽器對標籤的默認屬性解析不一樣形成的,只要咱們稍加設置都能輕鬆地解決這些兼容問題。若是咱們熟悉標籤的默認屬性的話,就能很好的理解爲何會出現兼容問題以及怎麼去解決這些兼容問題。(2)寫一套Reset.css作瀏覽器兼容。"

相關文章
相關標籤/搜索