火狐與IE瀏覽器之間的一些差別收集

原文鏈接:http://blog.csdn.net/kingyangtao/article/details/6327801


一、IE與FireFox的js和css

png透明 AlphaImageLoader 
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=bEnabled,sizingMethod=sSize,src=sURL)

enabled:可選項。布爾值(Boolean)。設置或檢索濾鏡是否激活。true:默認值。濾鏡激活。false:濾鏡被禁止。
sizingMethod:可選項。字符串(String)。設置或檢索濾鏡作用的對象的圖片在對象容器邊界內的顯示方式。crop:剪切圖片以適應對象尺寸。image:默認值。增大或減小對象的尺寸邊界以適應圖片的尺寸。scale:縮放圖片以適應對象的尺寸邊界。
src:必選項。字符串(String)。使用絕對或相對 url 地址指定背景圖像。假如忽略此參數,濾鏡將不會作用。

firefox不能對innerText支持 
firefox支持innerHTML但卻不支持innerText,它支持textContent來實現innerText,不過默認把多餘的空格也保留了。如果不用textContent,如果字符串裏面不包含HTML代碼也可以用innerHTML代替。

禁止選取網頁內容 
在IE中一般用js:obj.onselectstart=function(){return false;}
而firefox用CSS:-moz-user-select:none

濾鏡的支持(例:透明濾鏡) 
IE:filter:alpha(opacity=10);
firefox:-moz-opacity:.10;

捕獲事件 
IE:obj.setCapture() 、obj.releaseCapture()
Firefox:document.addEventListener(”mousemove”,mousemovefunction,true);
document.removeEventListener(”mousemove”,mousemovefunction,true);

獲取鼠標位置 
IE:event.clientX、event.clientY
firefox:需要事件函數傳遞事件對象
obj.οnmοusemοve=function(ev){
X= ev.pageX;Y=ev.pageY;
}

DIV等元素的邊界問題 
比如:設置一個div的CSS::{width:100px;height:100px;border:#000000 1px solid;}
IE中:div的寬度(包括邊框寬度):100px,div的高度(包括邊框寬度):100px;
而firefox:div的寬度(包括邊框寬度):102px,div的高度(包括邊框寬度):102px;

判斷瀏覽器類型 
var isIE=document.all ? true : false;
我寫了一個變量,如果支持document.all語法那麼isIE=true,否則isIE=false

在不同瀏覽器下的CSS處理 
一般可以用!important來優先使用css語句(僅firefox支持)
比如:{border-width:0px!important;border-width:1px;}
在firefox下這個元素是沒有邊框的,在IE下邊框寬度是1px

document.formName.item(”itemName”) 問題 
問題說明:IE下,可以
使用 document.formName.item(”itemName”) 或 document.formName.elements
[”elementName”];Firefox下,只能使用document.formName.elements[”elementName”]。
解決方法:統一使用document.formName.elements[”elementName”]。

集合類對象問題 
問題說明:IE下,可以使用()或[]獲取集合類對象;Firefox下,只能使用[]獲取集合類對象。
解決方法:統一使用 [] 獲取集合類對象。

自定義屬性問題 
問題說明:IE下,可以使用獲取常規屬性的方法來獲取自定義屬性,也可以使用 getAttribute() 獲取自定義屬性;Firefox下,只能使用 getAttribute() 獲取自定義屬性。
解決方法:統一通過 getAttribute() 獲取自定義屬性。

eval(”idName”)問題 
問題說明:IE下,可以使用 eval(”idName”) 或
getElementById(”idName”) 來取得 id 爲 idName 的HTML對象;Firefox下,只能使用
getElementById(”idName”) 來取得 id 爲 idName 的HTML對象。
解決方法:統一用 getElementById(”idName”) 來取得 id 爲 idName 的HTML對象。

變量名與某HTML對象ID相同的問題 
問題說明:IE下,HTML對象的ID可以作爲 document 的下屬對象變量名直接使用,Firefox下則不能;Firefox下,可以使用與HTML對象ID相同的變量名,IE下則不能。
解決方法:使用 document.getElementById(”idName”) 代替 document.idName。最好不要取HTML對象ID相同的變量名,以減少錯誤;在聲明變量時,一律加上var關鍵字,以避免歧義。

const問題 
問題說明:Firefox下,可以使用const關鍵字或var關鍵字來定義常量;IE下,只能使用var關鍵字來定義常量。
解決方法:統一使用var關鍵字來定義常量。

input.type屬性問題 
問題說明:IE下 input.type 屬性爲只讀;但是Firefox下 input.type 屬性爲讀寫。
解決辦法:不修改 input.type 屬性。如果必須要修改,可以先隱藏原來的input,然後在同樣的位置再插入一個新的input元素。

window.event問題 
問題說明:window.event 只能在IE下運行,而不能在Firefox下運行,這是因爲Firefox的event只能在事件發生的現場使用。
解決方法:在事件發生的函數上加上event參數,在函數體內(假設形參爲evt)使用 var myEvent = evt?evt:(window.event?window.event:null)
示例:<input type=”button” οnclick=”doSomething(event)”/>
<script language=”javascript”>
function doSomething(evt) {
var myEvent = evt ? evt: (window.event ? window.event : null)

}

event.x與event.y問題 
問題說明:IE下,even對象有x、y屬性,但是沒有pageX、pageY屬性;Firefox下,even對象有pageX、pageY屬性,但是沒有x、y屬性。
解決方法:var myX = event.x ? event.x : event.pageX;var myY = event.y ? event.y:event.pageY;
如果考慮第8條問題,就改用myEvent代替event即可。

event.srcElement問題 
問題說明:IE下,even對象有srcElement屬性,但是沒有target屬性;Firefox下,even對象有target屬性,但是沒有srcElement屬性。
解決方法:使用srcObj = event.srcElement ? event.srcElement : event.target;
如果考慮第8條問題,就改用myEvent代替event即可。

window.location.href問題 
問題說明:IE或者Firefox2.0.x下,可以使用window.location或window.location.href;Firefox1.5.x下,只能使用window.location。
解決方法:使用 window.location 來代替 window.location.href。當然也可以考慮使用 location.replace()方法。

模態和非模態窗口問題 
問題說明:IE下,可以通過showModalDialog和showModelessDialog打開模態和非模態窗口;Firefox下則不能。
解決方法:直接使用 window.open(pageURL,name,parameters) 方式打開新窗口。

果需要將子窗口中的參數傳遞迴父窗口,可以在子窗口中使用window.opener來訪問父窗口。如果需要父窗口控制子窗口的話,使用var
subWindow = window.open(pageURL,name,parameters);來獲得新開的窗口對象。

frame和iframe問題 
以下面的frame爲例:
<frame src=”xxx.html” id=”frameId” name=”frameName” />
(1)訪問frame對象
IE:使用window.frameId或者window.frameName來訪問這個frame對象;
Firefox:使用window.frameName來訪問這個frame對象;
解決方法:統一使用 window.document.getElementById(”frameId”) 來訪問這個frame對象;

(2)切換frame內容
在IE和Firefox中都可以使用window.document.getElementById(”frameId”).src = “xxx.html”或window.frameName.location = “xxx.html”來切換frame的內容;
如果需要將frame中的參數傳回父窗口,可以在frame中使用parent關鍵字來訪問父窗口。

body載入問題 
問題說明:Firefox的body對象在body標籤沒有被瀏覽器完全讀入之前就存在;而IE的body對象則必須在body標籤被瀏覽器完全讀入之後才存在。
[注] 這個問題尚未實際驗證,待驗證後再來修改。
[注] 經驗證,IE6、Opera9以及FireFox2中不存在上述問題,單純的JS腳本可以訪問在腳本之前已經載入的所有對象和元素,即使這個元素還沒有載入完成。

事件委託方法 
問題說明:IE下,使用 document.body.onload = inject;其中function inject()在這之前已被實現;在Firefox下,使用 document.body.onload = inject();
解決方法:統一使用 document.body.οnlοad=new Function(”inject()”);或者 document.body.onload = function(){/* 這裏是代碼 */}
[注意] Function和function的區別

訪問的父元素的區別 
問題說明:在IE下,使用 obj.parentElement 或 obj.parentNode 訪問obj的父結點;在firefox下,使用 obj.parentNode 訪問obj的父結點。
解決方法:因爲firefox與IE都支持DOM,因此統一使用obj.parentNode 來訪問obj的父結點。

cursor:hand VS cursor:pointer 
問題說明:firefox不支持hand,但ie支持pointer ,兩者都是手形指示。
解決方法:統一使用pointer。

innerText的問題 
問題說明:innerText在IE中能正常工作,但是innerText在FireFox中卻不行。
解決方法:在非IE瀏覽器中使用textContent代替innerText。
示例:
if(navigator.appName.indexOf(”Explorer”) >-1){
document.getElementById(”element”).innerText = “my text”;
}else{
document.getElementById(”element”).textContent = “my text”;
}
[注] innerHTML 同時被ie、firefox等瀏覽器支持,其他的,如outerHTML等只被ie支持,最好不用。

對象寬高賦值問題 
問題說明:FireFox中類似 obj.style.height = imgObj.height 的語句無效。
解決方法:統一使用 obj.style.height = imgObj.height + “px”;

Table操作問題 
問題說明:ie、firefox以及其它瀏覽器對於 table 標籤的操作都各不相同,在ie中不允許對table和tr的innerHTML賦值,使用js增加一個tr時,使用appendChild方法也不管用。
解決方法:
//向table追加一個空行:
var row = otable.insertRow(-1);
var cell = document.createElement(”td”);
cell.innerHTML = “”;
cell.className = “XXXX”;
row.appendChild(cell);
[注] 由於俺很少使用JS直接操作表格,這個問題沒有遇見過。建議使用JS框架集來操作table,如JQuery。

ul和ol列表縮進問題 
消除ul、ol等列表的縮進時,樣式應寫成:list-style:none;margin:0px;padding:0px;
其中margin屬性對IE有效,padding屬性對FireFox有效。← 此句表述有誤,詳細見↓
[注] 這個問題尚未實際驗證,待驗證後再來修改。
[注]
經驗證,在IE中,設置margin:0px可以去除列表的上下左右縮進、空白以及列表編號或圓點,設置padding對樣式沒有影響;在Firefox
中,設置margin:0px僅僅可以去除上下的空白,設置padding:0px後僅僅可以去掉左右縮進,還必須設置list-style:none才
能去除列表編號或圓點。也就是說,在IE中僅僅設置margin:0px即可達到最終效果,而在Firefox中必須同時設置margin:0px、
padding:0px以及list-style:none三項才能達到最終效果。

CSS透明問題 
IE:filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=60)。
FF:opacity:0.6。
[注] 最好兩個都寫,並將opacity屬性放在下面。

CSS圓角問題 
IE:ie7以下版本不支持圓角。
FF:-moz-border-
radius:4px,或者-moz-border-radius-topleft:4px;-moz-border-
radius-topright:4px;-moz-border-radius-bottomleft:4px;-moz-border-
radius- bottomright:4px;。
[注] 圓角問題是CSS中的經典問題,建議使用JQuery框架集來設置圓角,讓這些複雜的問題留給別人去想吧。

二、IE6/IE7和Firefox對Div處理的差異

基本HTML代碼

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
http://www.w3.org/TR/xhtml1/DTD/xhtml1 -transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml ” >
<head>
<title>Div Float Sample</title>
<style type=”text/css”>
div { margin:3px; }
.d1 { width:250px; min-height:20px; border:1px solid #00cc00; }
.d2 { width:130px; min-height:40px; border:1px solid #0000cc; }
.d3 { width:100px; min-height:40px; border:1px solid #cc0000; }
</style>
</head>
<body>
<div class=”d1″>
<div class=”d2″> </div>
<div class=”d3″> </div>
</div>
</body>
</html>
以上代碼顯示的結果如下,很正常,結果相同。

當然所有這些情況也許是有合理解釋的,說不定增加某一個style的設置。

下面會在這個基礎上進行修改,修改的內容都在style中,其他代碼就不再重複寫了。

請注意,這裏的Style中用到了min-height,這個和height是不同的,min-height指定了對象的一個最小高度,當對象的子
內容高度超過這個最小高度是,這個對象會自動撐大。這是一個非常牛的style,可惜的是,在這個style和float這個同樣牛的style一起使用
的時候,就會出現各種問題。

內部一個Div修改成爲float:left

.d1 { width:250px; min-height:20px; border:1px solid #00cc00; }
.d2 { width:130px; min-height:40px; border:1px solid #0000cc; float: left; }
.d3 { width:100px; min-height:40px; border:1px solid #cc0000; }
顯示結果如下。

顯示結果如下,顯示結果如下!

IE6/IE7和Firefox對Div處理的差異(圖二)

顯示結果如下。:left的情況相同?

這個結果中,Firefox有點離譜了,兩個框疊在一起也就罷了,爲什麼那個紅框會變大捏?而且變的大小也很詭異,不知道是按照什麼公式計算出來的。IE在這裏的顯示應當是附和標準的。

內部兩個Div都修改成爲float:left

.d1 { width:250px; min-height:20px; border:1px solid #00cc00; }
.d2 { width:130px; min-height:40px; border:1px solid #0000cc; float: left; }
.d3 { width:100px; min-height:40px; border:1px solid #cc0000; float: left; }
這和前面第一種加float:left的情況相同。

顯示結果如下。

IE6/IE7和Firefox對Div處理的差異(圖三)

在這種情況下,Firefox的結果尚能解釋,可能是float把外層的Div也作爲內層float影響的範圍,這樣內層的就不會將外層的Div撐大了。IE在這裏出現了Margin失效的情況,可以解釋爲內層第二個float造成了影響。

乾脆把外層的Div也修改成爲float:left

.d1 { width:250px; min-height:20px; border:1px solid #00cc00; float: left; }
.d2 { width:130px; min-height:40px; border:1px solid #0000cc; float: left; }
.d3 { width:100px; min-height:40px; border:1px solid #cc0000; float: left; }
以上代碼在下面這些Doctype下試驗過,結果相同。

顯示結果如下,

IE6/IE7和Firefox對Div處理的差異(圖四)

這種情況下,Firefox正常了,而IE延續了前面的不正常情況。

外層是float:left,內層最後一個不再float:left

.d1 { width:250px; min-height:20px; border:1px solid #00cc00; float: left; }
.d2 { width:130px; min-height:40px; border:1px solid #0000cc; float: left; }
.d3 { width:100px; min-height:40px; border:1px solid #cc0000; }
left的情況相同。所以最好是padding和margin都不用?

顯示結果如下,

IE在這裏的顯示應當是附和標準的。

IE6/IE7和Firefox對Div處理的差異(圖五)

這和前面第一種加float:left的情況相同。

結論

再重申一次,本文討論的是一個比較高級的話題。如果在style中用height而不是min-height來設定高度,是不會出現以上這些問題的。不過,不用min-height就失去了div自動撐大這一個很有必要的特性。

在min-height和float:left的情況下,沒有一種完美的寫法讓Firefox和IE結果相同。不過仍然可以發現繞開的方法。

進一步試驗可以發現,margin遭到的影響在padding上比較好,所以最好是padding和margin都不用,或者只用padding。

兩者相同的代碼如下,

div { padding:3px; }
.d1 { width:250px; min-height:20px; border:1px solid #00cc00; float: left; }
.d2 { width:130px; min-height:40px; border:1px solid #0000cc; float: left; }
.d3 { width:100px; min-height:40px; border:1px solid #cc0000; float: left; }
left的情況相同。當對象的子內容高度超過這個最小高度是。

顯示結果如下,

IE6/IE7和Firefox對Div處理的差異(圖六)

呵呵,總算是一樣了,雖然是湊合着一樣了。幸好一樣了,否則只好用table了。

當然所有這些情況也許是有合理解釋的,說不定增加某一個style的設置,這些問題都迎刃而解了,不過目前我還沒有找到這個設置。

關於Doctype

可惜的是,在這個style和float這個同樣牛的style一起使用的時候。

以上代碼在下面這些Doctype下試驗過,結果相同。

<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01//EN”
http://www.w3.org/TR/html4/strict.dtd “>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
http://www.w3.org/TR/html4/loose.dtd “>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN”
http://www.w3.org/TR/xhtml1/DTD/xhtml1 -strict.dtd”>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
http://www.w3.org/TR/xhtml1/DTD/xhtml1 -transitional.dtd”>

三、CSS完美兼容IE6/IE7/FF的通用方法

關於CSS對各個瀏覽器兼容已經是老生常談的問題了, 網絡上的教程遍地都是.以下內容沒有太多新穎, 純屬個人總結, 希望能對初學者有一定的幫助.
一、CSS HACK

以下兩種方法幾乎能解決現今所有HACK.

1, !important

隨着IE7對!important的支持, !important 方法現在只針對IE6的HACK.(注意寫法.記得該聲明位置需要提前.)

2, IE6/IE77對FireFox

*+html 與 *html 是IE特有的標籤, firefox 暫不支持.而*+html 又爲 IE7特有標籤.

注意:
*+html 對IE7的HACK 必須保證HTML頂部有如下聲明:

二、萬能 float 閉合

關於 clear float 的原理可參見 [How To Clear Floats Without Structural Markup]
將以下代碼加入Global CSS 中,給需要閉合的div加上 class=”clearfix” 即可,屢試不爽.

三、其他兼容技巧

1, FF下給 div 設置 padding 後會導致 width 和 height 增加, 但IE不會.(可用!important解決)
2, 居中問題.
1).垂直居中.將 line-height 設置爲 當前 div 相同的高度, 再通過 vertical-align: middle.( 注意內容不要換行.)
2).水平居中. margin: 0 auto;(當然不是萬能)
3, 若需給 a 標籤內內容加上 樣式, 需要設置 display: block;(常見於導航標籤)
4, FF 和 IE 對 BOX 理解的差異導致相差 2px 的還有設爲 float的div在ie下 margin加倍等問題.
5, ul 標籤在 FF 下面默認有 list-style 和 padding . 最好事先聲明, 以避免不必要的麻煩. (常見於導航標籤和內容列表)
6, 作爲外部 wrapper 的 div 不要定死高度, 最好還加上 overflow: hidden.以達到高度自適應.
7, 關於手形光標. cursor: pointer. 而hand 只適用於 IE.

1 針對firefox ie6 ie7的css樣式
現在大部分都是用!important來hack,對於ie6和firefox測試可以正常顯示,
但是ie7對!important可以正確解釋,會導致頁面沒按要求顯示!找到一個針
對IE7不錯的hack方式就是使用“*+html”,現在用IE7瀏覽一下,應該沒有問題了。
現在寫一個CSS可以這樣:

#1 { color: #333; } /* Moz */
* html #1 { color: #666; } /* IE6 */
*+html #1 { color: #999; } /* IE7 */
那麼在firefox下字體顏色顯示爲#333,IE6下字體顏色顯示爲#666,IE7下字體顏色顯示爲#999。

2 css佈局中的居中問題
主要的樣式定義如下:

body {TEXT-ALIGN: center;}
#center { MARGIN-RIGHT: auto; MARGIN-LEFT: auto; }
說明:
首先在父級元素定義TEXT-ALIGN: center;這個的意思就是在父級元素內的內容居中;對於IE這樣設定就已經可以了。
但在mozilla中不能居中。解決辦法就是在子元素定義時候設定時再加上“MARGIN-RIGHT: auto;MARGIN-LEFT: auto; ”
需要說明的是,如果你想用這個方法使整個頁面要居中,建議不要套在一個DIV裏,你可以依次拆出多個div,
只要在每個拆出的div裏定義MARGIN-RIGHT: auto;MARGIN-LEFT: auto; 就可以了。

3 盒模型不同解釋

#box{ width:600px; //for ie6.0- w/idth:500px; //for ff+ie6.0}
#box{ width:600px!important //for ff width:600px; //for ff+ie6.0 width /**/:500px; //for ie6.0-}

4 浮動ie產生的雙倍距離

#box{ float:left; width:100px; margin:0 0 0 100px; //這種情況之下IE會產生200px的距離 display:inline; //使浮動忽略}
這裏細說一下block,inline兩個元素,Block元素的特點是:總是在新行上開始,高度,寬度,行高,邊距都可以控制(塊元素);Inline元素的特點是:和其他元素在同一行上,…不可控制(內嵌元素);

#box{ display:block; //可以爲內嵌元素模擬爲塊元素 display:inline; //實現同一行排列的的效果 diplay:table;

IE不認得min-這個定義,但實際上它把正常的width和height當作有min的情況來使。這樣問題就大了,如果只用寬度和高度,
正常的瀏覽器裏這兩個值就不會變,如果只用min-width和min-height的話,IE下面根本等於沒有設置寬度和高度。
比如要設置背景圖片,這個寬度是比較重要的。要解決這個問題,可以這樣:
#box{ width: 80px; height: 35px;}html>body #box{ width: auto; height: auto; min-width: 80px; min-height: 35px;}

6 頁面的最小寬度

min-width是個非常方便的CSS命令,它可以指定元素最小也不能小於某個寬度,這樣就能保證排版一直正確。但IE不認得這個,
而它實際上把width當做最小寬度來使。爲了讓這一命令在IE上也能用,可以把一個

放到 標籤下,然後爲div指定一個類:

然後CSS這樣設計:

#container{ min-width: 600px; width:expression(document.body.clientWidth < 600? "600px": "auto" );}

第一個min-width是正常的;但第2行的width使用了Javascript,這隻有IE才認得,這也會讓你的HTML文檔不太正規。它實際上通過Javascript的判斷來實現最小寬度。

7 清除浮動

.hackbox{ display:table; //將對象作爲塊元素級的表格顯示}或者.hackbox{ clear:both;}
或者加入:after(僞對象),設置在對象後發生的內容,通常和content配合使用,IE不支持此僞對象,非Ie 瀏覽器支持,
所 以並不影響到IE/WIN瀏覽器。這種的最麻煩的......#box:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden;}

8 DIV浮動IE文本產生3象素的bug

左邊對象浮動,右邊採用外補丁的左邊距來定位,右邊對象內的文本會離左邊有3px的間距.

#box{ float:left; width:800px;}#left{ float:left; width:50%;}#right{ width:50%;}*html #left{ margin-right:-3px; //這句是關鍵}
HTML代碼

9 屬性選擇器(這個不能算是兼容,是隱藏css的一個bug)

p[id]{}div[id]{}
這個對於IE6.0和IE6.0以下的版本都隱藏,FF和OPera作用
屬性選擇器和子選擇器還是有區別的,子選擇器的範圍從形式來說縮小了,屬性選擇器的範圍比較大,如p[id]中,所有p標籤中有id的都是同樣式的.

10 IE捉迷藏的問題

當div應用複雜的時候每個欄中又有一些鏈接,DIV等這個時候容易發生捉迷藏的問題。
有些內容顯示不出來,當鼠標選擇這個區域是發現內容確實在頁面。
解決辦法:對#layout使用line-height屬性 或者給#layout使用固定高和寬。頁面結構儘量簡單。

11 高度不適應

高度不適應是當內層對象的高度發生變化時外層高度不能自動進行調節,特別是當內層對象使用
margin 或paddign 時。
例:

p對象中的內容

CSS:#box {background-color:#eee; }
#box p {margin-top: 20px;margin-bottom: 20px; text-align:center; }
解決方法:在P對象上下各加2個空的div對象CSS代碼:.1{height:0px;overflow:hidden;}或者爲DIV加上border屬性。
六、CSS兼容要點分析IE vs FF

CSS 兼容要點:

DOCTYPE 影響 CSS 處理

FF: div 設置 margin-left, margin-right 爲 auto 時已經居中, IE 不行

FF: body 設置 text-align 時, div 需要設置 margin: auto(主要是 margin-left,margin-right) 方可居中

FF: 設置 padding 後, div 會增加 height 和 width, 但 IE 不會, 故需要用 !important 多設一個 height 和 width

FF: 支持 !important, IE 則忽略, 可用 !important 爲 FF 特別設置樣式

div 的垂直居中問題: vertical-align:middle; 將行距增加到和整個DIV一樣高 line-height:200px; 然後插入文字,就垂直居中了。缺點是要控制內容不要換行

cursor: pointer 可以同時在 IE FF 中顯示遊標手指狀, hand 僅 IE 可以

FF: 鏈接加邊框和背景色,需設置 display: block, 同時設置 float: left 保證不換行。參照 menubar, 給 a 和 menubar 設置高度是爲了避免底邊顯示錯位, 若不設 height, 可以在 menubar 中插入一個空格XHTML+CSS兼容性解決方案小集

使用XHTML+CSS構架好處不少,但也確實存在一些問題,不論是因爲使用不熟練還是思路不清晰,我就先把一些我遇到的問題寫在下面,省的大家四處找^^

1、在mozilla firefox和IE中的BOX模型解釋不一致導致相差2px解決方法:

div{margin:30px!important;margin:28px;}

注意這兩個margin的順序一定不能寫反,據阿捷的說法!important這個屬性IE不能識別,但別的瀏覽器可以識別。所以在IE下其實解釋成這樣:

div{maring:30px;margin:28px}

重複定義的話按照最後一個來執行,所以不可以只寫margin:XXpx!important;

2、IE5 和IE6的BOX解釋不一致IE5 下div{width:300px;margin:0 10px 0 10px;}div的寬度會被解釋爲300px-10px(右填充)-10px(左填充)最終div的寬度爲280px,而在IE6和其他瀏覽器上寬度則是以300px+10px(右填充)+10px(左填充)=320px來計算的。這時我們可以做如下修改

div{width:300px!important;width /**/:340px;margin:0 10px 0 10px}

,關於這個/**/是什麼我也不太明白,只知道IE5和firefox都支持但IE6不支持,如果有人理解的話,請告訴我一聲,謝了!:)

3、ul標籤在Mozilla中默認是有padding值的,而在IE中只有margin有值所以先定義

ul{margin:0;padding:0;}

就能解決大部分問題

4、關於腳本,在xhtml1.1中不支持language屬性,只需要把代碼改爲

< type="text/java">
就可以了
七、10個你未必知道的CSS技巧

1、CSS字體屬性簡寫規則

一般用CSS設定字體屬性是這樣做的:

font-weight:bold;

font-style:italic;

font-varient:small-caps;

font-size:1em;

line-height:1.5em;

font-family:verdana,sans-serif;

但也可以把它們全部寫到一行上去:

font: bold italic small-caps 1em/1.5em verdana,sans-serif;

真不錯!只有一點要提醒的:這種簡寫方法只有在同時指定font-size和font-family屬性時才起作用。而且,如果你沒有設定font-weight, font-style, 以及 font-varient ,他們會使用缺省值,這點要記上。

2、同時使用兩個類

一般只能給一個元素設定一個類(Class),但這並不意味着不能用兩個。事實上,你可以這樣:

同時給P元素兩個類,中間用空格格開,這樣所有text和side兩個類的屬性都會加到P元素上來。如果它們兩個類中的屬性有衝突的話,後設置的起作用,即在CSS文件中放在後面的類的屬性起作用。

補充:對於一個ID,不能這樣寫

也不能這樣寫

3、CSS border的缺省值

通常可以設定邊界的顏色,寬度和風格,如:

border: 3px solid #000

這位把邊界顯示成3像素寬,黑色,實線。但實際上這裏只需要指定風格即可。

如果只指定了風格,其他屬性就會使用缺省值。一般地,Border的寬度缺省是medium,一般等於3到4個像素;缺省的顏色是其中文字的顏色。如果這個值正好合適的話,就不用設那麼多了。

4、CSS用於文檔打印

許多網站上都有一個針對打印的版本,但實際上這並不需要,因爲可以用CSS來設定打印風格。

也就是說,可以爲頁面指定兩個CSS文件,一個用於屏幕顯示,一個用於打印:

第1行就是顯示,第2行是打印,注意其中的media屬性。

但應該在打印 CSS中寫什麼東西呢?你可以按設計普通CSS的方法來設定它。設計的同時就可以把這個CSS設成顯示CSS來檢查它的效果。也許你會使用 display: none 這個命令來關掉一些裝飾圖片,再關掉一些導航按鈕。要想了解更多,可以看“打印差異”這一篇。

5、圖片替換技巧

一般都建議用標準的HTML來顯示文字,而不要使用圖片,這樣不但快,也更具可讀性。但如果你想用一些特殊字體時,就只能用圖片了。

比如你想整個賣東西的圖標,你就用了這個圖片:

Buy widgets

這當然可以,但對搜索引擎來說,和正常文字相比,它們對alt裏面的替換文字幾乎沒有興趣這是因爲許多設計者在這裏放許多關鍵詞來騙搜索引擎。所以方法應該是這樣的:

Buy widgets

但這樣就沒有特殊字體了。要想達到同樣效果,可以這樣設計CSS:

h1 { background: url(/blog/widget-image.gif) no-repeat; height: image height text-indent: -2000px }
注意把image height換成真的圖片的高度。這裏,圖片會當作背景顯示出來,而真正的文字由於設定了-2000像素這個縮進,它們會出現在屏幕左邊2000點的地方,就看不見了。但這對於關閉圖片的人來說,可能全部看不到了,這點要注意。

6、CSS box模型的另一種調整技巧

這個Box模型的調整主要是針對IE6之前的IE瀏覽器的,它們把邊界寬度和空白都算在元素寬度上。比如:

#box { width: 100px; border: 5px; padding: 20px }

這樣調用它:

這時盒子的全寬應該是150點,這在除IE6之前的IE瀏覽器之外的所有瀏覽器上都是正確的。但在IE5這樣的瀏覽器上,它的全寬仍是100點。可以用以前人發明的Box調整方法來處理這種差異。

但用CSS也可以達到同樣的目的,讓它們顯示效果一致。

#box { width: 150px } #box div { border: 5px; padding: 20px }

這樣調用:

這樣,不管什麼瀏覽器,寬度都是150點了。

7、塊元素居中對齊

如果想做個固定寬度的網頁並且想讓網頁水平居中的話,通常是這樣:

#content { width: 700px; margin: 0 auto }

你會使用

來圍上所有元素。這很簡單,但不夠好,IE6之前版本會顯示不出這種效果。改CSS如下:

body { text-align: center } #content { text-align: left; width: 700px; margin: 0 auto }

這會把網頁內容都居中,所以在Content中又加入了

text-align: left 。

8、用CSS來處理垂直對齊

垂直對齊用表格可以很方便地實現,設定表格單元 vertical-align: middle 就可以了。但對CSS來說這沒用。如果你想設定一個導航條是2em高,而想讓導航文字垂直居中的話,設定這個屬性是沒用的。

CSS方法是什麼呢?對了,把這些文字的行高設爲 2em:line-height: 2em ,這就可以了。

9、CSS在容器內定位

CSS的一個好處是可以把一個元素任意定位,在一個容器內也可以。比如對這個容器:

#container { position: relative }

這樣容器內所有的元素都會相對定位,可以這樣用:

如果想定位到距左30點,距上5點,可以這樣:

#navigation { position: absolute; left: 30px; top: 5px }

當然,你還可以這樣:

margin: 5px 0 0 30px

注意4個數字的順序是:上、右、下、左。當然,有時候定位的方法而不是邊距的方法更好些。

10、直通到屏幕底部的背景色

在垂直方向是進行控制是CSS所不能的。如果你想讓導航欄和內容欄一樣直通到頁面底部,用表格是很方便的,但如果只用這樣的CSS:

#navigation { background: blue; width: 150px }

較短的導航條是不會直通到底部的,半路內容結束時它就結束了。該怎麼辦呢?

不幸的是,只能採用欺騙的手段了,給這較短的一欄加上個背景圖,寬度和欄寬一樣,並讓它的顏色和設定的背景色一樣。

body { background: url(/blog/blue-image.gif) 0 0 repeat-y }
此時不能用em做單位,因爲那樣的話,一旦讀者改變了字體大小,這個花招就會露餡,只能使用px。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章