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


概念:所謂的瀏覽器兼容性問題,是指因為不同的瀏覽器對同一段代碼解析的差異,造成頁面顯示效果不統一的情況。

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

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等

4>設置較小高度標簽(一般小於10px),在ie6,ie7,遨游中高度超出自己設置高度
問題症狀:ie6-高度不受控制,超出自己設置的高度
解決方案:給超出高度的標簽設置overflow:hidden;或者設置行高line-height 小於你設置的高度。
備注:這種情況一般出現在我們設置小圓角背景的標簽里。出現這個問題的原因是ie8之前的瀏覽器都會給標簽一個最小默認的行高的高度。即使你的標簽是空的,這個標簽的高度還是會達到默認的行高。

5>幾個img標簽放在一起的時候,有些瀏覽器會有默認的間距,加了通配符(*{ margin:0; padding:0;})也不起作用。
解決方案:使用float屬性為img布局
備注:因為img標簽是行內屬性標簽,所以只要不超出容器寬度,img標簽都會排在一行里,但是部分瀏覽器的img標簽之間會有個間距。去掉這個間距使用float是正道。

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的寫法

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

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

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做瀏覽器兼容。"

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM