為什么會(huì)有兼容問題?
使用Trident內(nèi)核的瀏覽器:IE、Maxthon、TT; 使用Gecko內(nèi)核的瀏覽器:Netcape6及以上版本、FireFox; 使用Presto內(nèi)核的瀏覽器:Opera7及以上版本; 使用Webkit內(nèi)核的瀏覽器:Safari、Chrome。
現(xiàn)在所說的兼容性問題,主要是說IE與幾個(gè)主流瀏覽器如firefox,google等。而對(duì)IE瀏覽器來說,IE7又是個(gè)跨度,因?yàn)橹暗陌姹靖律趼?,bug甚多。從IE8開始,IE瀏覽器漸漸遵循標(biāo)準(zhǔn),到IE9后由于大家都一致認(rèn)為標(biāo)準(zhǔn)很重要,可以說在兼容性上比較好了,但是在中國(guó)來說,由于xp的占有率問題,使用IE7以下的用戶仍然很多,所以我們不得不考慮低版本瀏覽器的兼容。
問題一: 不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外邊距和內(nèi)邊距不同
- 問題癥狀:不加樣式控制的情況下,各自的margin 和padding差異較大。
- 碰到頻率: 100%
- 解決方案:css里 *{margin:0;padding:0;}
- 備注:這個(gè)是最常見的也是最易解決的一個(gè)瀏覽器兼容性問題,幾乎所有的css文件開頭都會(huì)用通配符*來設(shè)置各個(gè)標(biāo)簽的內(nèi)外補(bǔ)丁是0。
問題二:塊屬性標(biāo)簽float后,又有橫行的margin情況下,在ie6顯示margin比設(shè)置的大
- 問題癥狀:常見癥狀是ie6中后面的一塊被頂?shù)较乱恍?/li>
- 碰到頻率:90%(稍微復(fù)雜點(diǎn)的頁面都會(huì)碰到,float布局最常見的瀏覽器兼容問題)
- 解決方案:在float的標(biāo)簽樣式控制中加入 display:inline;將其轉(zhuǎn)化為行內(nèi)屬性
- 備注:我們最常用的就是div+css布局了,而div就是一個(gè)典型的塊屬性標(biāo)簽,橫向布局的時(shí)候我們通常都是用div float實(shí)現(xiàn)的,橫向的間距設(shè)置如果用margin實(shí)現(xiàn),這就是一個(gè)必然會(huì)碰到的兼容性問題。
問題三:設(shè)置較小高度標(biāo)簽(一般小于10px),在ie6,ie7,遨游中高度超出自己設(shè)置高度
- 問題癥狀:ie6、7和遨游里這個(gè)標(biāo)簽的高度不受控制,超出自己設(shè)置的高度
- 碰到頻率:60%
- 解決方案:給超出高度的標(biāo)簽設(shè)置overflow:hidden;或者設(shè)置行高line-height 小于你設(shè)置的高度。
- 備注:這種情況一般出現(xiàn)在我們?cè)O(shè)置小圓角背景的標(biāo)簽里。出現(xiàn)這個(gè)問題的原因是ie8之前的瀏覽器都會(huì)給標(biāo)簽一個(gè)最小默認(rèn)的行高的高度。即使你的標(biāo)簽是空的,這個(gè)標(biāo)簽的高度還是會(huì)達(dá)到默認(rèn)的行高。
問題四:行內(nèi)屬性標(biāo)簽,設(shè)置display:block后采用float布局,又有橫行的margin的情況,ie6間距bug(類似第二種)
- 問題癥狀:ie6里的間距比超過設(shè)置的間距
- 碰到幾率:20%
- 解決方案:在display:block;后面加入display:inline;display:table;
- 備注:行內(nèi)屬性標(biāo)簽,為了設(shè)置寬高,我們需要設(shè)置display:block;(除了input標(biāo)簽比較特殊)。在用float布局并有橫向的margin后,在ie6下,他就具有了塊屬性float后的橫向margin的bug。不過因?yàn)樗旧砭褪切袃?nèi)屬性標(biāo)簽,所以我們?cè)偌由蟙isplay:inline的話,它的高寬就不可設(shè)了。這時(shí)候我們還需要在display:inline后面加入display:table。
問題五:圖片默認(rèn)有間距
- 問題癥狀:幾個(gè)img標(biāo)簽放在一起的時(shí)候,有些瀏覽器會(huì)有默認(rèn)的間距,加上問題一中提到的通配符也不起作用。
- 碰到幾率:20%
- 解決方案:使用float屬性為img布局
- 備注:因?yàn)閕mg標(biāo)簽是行內(nèi)屬性標(biāo)簽,所以只要不超出容器寬度,img標(biāo)簽都會(huì)排在一行里,但是部分瀏覽器的img標(biāo)簽之間會(huì)有個(gè)間距。去掉這個(gè)間距使用float是正道
問題六:標(biāo)簽最低高度設(shè)置min-height不兼容
- 問題癥狀:因?yàn)閙in-height本身就是一個(gè)不兼容的css屬性,所以設(shè)置min-height時(shí)不能很好的被各個(gè)瀏覽器兼容
- 碰到幾率:5%
- 解決方案:如果我們要設(shè)置一個(gè)標(biāo)簽的最小高度200px,需要進(jìn)行的設(shè)置為:{min-height: 200px; height: auto !important; height: 200px; overflow: visible;}
- 備注:當(dāng)內(nèi)容小于一個(gè)值(如300px)時(shí)。容器的高度為300px;當(dāng)內(nèi)容高度大于這個(gè)值時(shí),容器高度被撐高,而不是出現(xiàn)滾動(dòng)條。這時(shí)候我們就會(huì)面臨這個(gè)兼容性問題。
問題七:透明度的兼容css設(shè)置
.transparent_class {
filter:alpha(opacity=50); //ie
-moz-opacity:0.5; //old school versions of the Mozilla browsers
-khtml-opacity: 0.5; //old versions of safari(1.x)
opacity: 0.5;
}
問題總結(jié):
每寫一小段代碼(布局中的一行或者一塊)我們都要在不同的瀏覽器中看是否兼容,當(dāng)然熟練到一定的程度就沒這么麻煩了。建議經(jīng)常會(huì)碰到兼容性問題的新手使用。很多兼容性問題都是因?yàn)闉g覽器對(duì)標(biāo)簽的默認(rèn)屬性解析不同造成的,只要我們稍加設(shè)置都能輕松地解決這些兼容問題。如果我們熟悉標(biāo)簽的默認(rèn)屬性的話,就能很好的理解為什么會(huì)出現(xiàn)兼容問題以及怎么去解決這些兼容問題。
技巧一 css hack
使用hacker 我可以把瀏覽器分為3類:ie6 ;ie7和遨游;其他(ie8 chrome ff safari opera等)
ie6認(rèn)識(shí)的hacker 是下劃線_ 和星號(hào) *
ie7 遨游認(rèn)識(shí)的hacker是星號(hào) * (包括上面問題6中的 !important也算是hack的一種。不過實(shí)用性較小。)
比如這樣一個(gè)css設(shè)置 height:300px;height:200px;_height:100px;
ie6瀏覽器在讀到 height:300px的時(shí)候會(huì)認(rèn)為高時(shí)300px;繼續(xù)往下讀,他也認(rèn)識(shí)heihgt, 所以當(dāng)ie6讀到height:200px的時(shí)候會(huì)覆蓋掉前一條的相沖突設(shè)置,認(rèn)為高度是200px。繼續(xù)往下讀,ie6還認(rèn)識(shí)_height,所以他又會(huì)覆蓋掉200px高的設(shè)置,把高度設(shè)置為100px;
ie7和遨游也是一樣的從高度300px的設(shè)置往下讀。當(dāng)它們讀到height200px的時(shí)候就停下了,因?yàn)樗鼈儾徽J(rèn)識(shí)_height。所以它們會(huì)把高度解析為200px;
剩下的瀏覽器只認(rèn)識(shí)第一個(gè)height:300px;所以他們會(huì)把高度解析為300px。
因?yàn)閮?yōu)先級(jí)相同且相沖突的屬性設(shè)置后一個(gè)會(huì)覆蓋掉前一個(gè),所以書寫的次序是很重要的。
/* CSS屬性級(jí)Hack */
color:red; /* 所有瀏覽器可識(shí)別*/
_color:red; /* 僅IE6 識(shí)別 */
*color:red; /* IE6、IE7 識(shí)別 */
+color:red; /* IE6、IE7 識(shí)別 */
*+color:red; /* IE6、IE7 識(shí)別 */
[color:red; /* IE6、IE7 識(shí)別 */
color:red\9; /* IE6、IE7、IE8、IE9 識(shí)別 */
color:red\0; /* IE8、IE9 識(shí)別*/
color:red\9\0; /* 僅IE9識(shí)別 */
color:red \0; /* 僅IE9識(shí)別 */
color:red!important; /* IE6 不識(shí)別!important 有危險(xiǎn)*/
/* CSS選擇符級(jí)Hack */
*html #demo { color:red;} /* 僅IE6 識(shí)別 */
*+html #demo { color:red;} /* 僅IE7 識(shí)別 */
body:nth-of-type(1) #demo { color:red;} /* IE9+、FF3.5+、Chrome、Safari、Opera 可以識(shí)別
*/
head:first-child+body #demo { color:red; } /* IE7+、FF、Chrome、Safari、Opera 可以識(shí)別 */
:root #demo { color:red\9; } : /* 僅IE9識(shí)別 */
技巧二 padding,marign,height,width
盡量用padding,慎用margin,height盡量補(bǔ)上100%,父級(jí)height有定值子級(jí)height不用100%,子級(jí)全為浮動(dòng)時(shí)底部補(bǔ)個(gè)空clear:both的div寬盡量用margin,慎用padding,width算準(zhǔn)實(shí)際要的減去padding
技巧三:顯示類(display:block,inline)
display:block塊元素,元素的特點(diǎn)是: 總是在新行上開始;高度,行高以及頂和底邊距都可控制;寬度缺省是它的容器的100%,除非設(shè)定一個(gè)寬度
display:inline就是將元素顯示為行內(nèi)元素,元素的特點(diǎn)是:和其他元素都在一行上;高,行高及頂和底邊距不可改變;寬度就是它的文字或圖片的寬度,不可改變。span,a,label,input,img,strong和em是 inline 元素的例子
技巧四 怎樣使一個(gè)div層居中于瀏覽器中?
div里的內(nèi)容,IE默認(rèn)為居中,而FF默認(rèn)為左對(duì)齊,可以嘗試增加代碼margin: 0 auto;
技巧五:float的div閉合;清除浮動(dòng);自適應(yīng)高度
<div id="floatA"><div id="floatB"><div id="NOTfloatC">
這里的NOTfloatC希望往下排,在ff中必須將float標(biāo)簽閉合,在中間加上<div class="clear">
必須與兩個(gè)float屬性的div同級(jí),之間不能存在嵌套關(guān)系,否則會(huì)發(fā)生異常。
另一方面,外部的wrapper的div不要定死高度,為了讓高度自適應(yīng),要給wrapper加上overflow: hidden。float的box高度自適應(yīng)在IE下無效,,這時(shí)候應(yīng)該出發(fā)IE的layout私有屬性,用zoom: 1;可以做到兼容。
第三方面, 用float: left布局,外層高度塌陷,因?yàn)橥鈱硬皇莊loat屬性,切不方便給他設(shè)置float,可以給內(nèi)層float的部分包起來,給他float left且寬度為100%級(jí)就可以。
四,萬能float閉合
給需要的div加上class="clearfix"
clearfix:after{
content:"";
display:block;
height:0;
clear:both;
visiblity:hidden;
}
.clearfix{
zoom:1;
}
技巧六:div嵌套時(shí) y軸上 padding和 marign的問題
FF里 y 軸上 子div 到 父div 的距離為 父padding + 子marign
IE里 y 軸上 子div 到 父div 的距離為 父padding 和 子marign 里大的一個(gè)
FF里 y 軸上 父padding=0 且 border=0 時(shí),子div 到 父div 的距離為0,子marign 作用到 父div 外面