by zhangxinxu from http://www.zhangxinxu.com
本文地址:http://www.zhangxinxu.com/wordpress/?p=56
前言
目前中文網(wǎng)站上面的文字,就我的個(gè)人感覺(jué)而言,絕大多數網(wǎng)站的主流文字大小為12px,因為在目前高分辨率顯示器屏幕下,11px的漢字,其像素點(diǎn)開(kāi)始不規整,文字不如12px來(lái)的顯示良好。12px大小的文字就是主流也是底線(xiàn)。然而12px的文字與單選框和復選框是不對齊的。例如下面這張雅虎中國首頁(yè)在火狐瀏覽器下的截圖:

雅虎中國首頁(yè)單選框復選框與文字不對齊
這里,不是說(shuō),雅虎中國的團隊不夠認真,而因為這12px大小文字與單選框和復選框對齊的問(wèn)題不是好解決的??紤]到兼容性,控件本身的特殊性以及代碼成本的控制等,使得這個(gè)問(wèn)題不是簡(jiǎn)單就能解決的。
這不是我第一次研究單選框復選框對齊的問(wèn)題了,因為平時(shí)對這個(gè)問(wèn)題注意的比較多,也經(jīng)常做些測試,對這個(gè)問(wèn)題還是有一定的了解,也總結了不少自己的解決方法。今天我就寫(xiě)下來(lái),供交流與參考。
一、問(wèn)題產(chǎn)生的條件
對于14像素大小的字體是沒(méi)有本篇所要探討的單(復)選框與文字對齊的問(wèn)題的。(見(jiàn)下圖)

14像素大小文字與單復選框無(wú)對齊的問(wèn)題
但是,對于12像素大小的文字,則就存在對齊問(wèn)題了,尤其在Firefox火狐瀏覽器以及chrome谷歌瀏覽器下。(見(jiàn)下圖)

12像素文字相對于單復選框位置偏下不對齊
這就是本文所要研究與解決的問(wèn)題。這種不對齊的根本原因我不清楚,但我可以肯定的是單復選框與文字默認以vertical-align:baseline的方式對齊的。
二、解決方案
下面我將提供五種解決方案,有三個(gè)方案沒(méi)有使用任何hack,且IE6,IE7,Firefox,chrome瀏覽器下表現都很好的,有一種方案使用了一個(gè)IE hack,但成本較低,各個(gè)瀏覽器表現良好。還有一種方案,代碼成本很低,但在chrome瀏覽器下文字稍微偏上,使用input類(lèi)型選擇器,或chrome hack可以解決這個(gè)問(wèn)題,但是對于單復選框這類(lèi)控件,代碼一多反而不劃算,權衡之下,不針對chrome瀏覽器單獨處理。
這些方案都是我經(jīng)過(guò)平時(shí)積累,反復試驗得出的結論,其兼容性值得信賴(lài)。要使用的話(huà)就給單復選框命名一個(gè)class,該class樣式為下面方案提供的css樣式即可。
1.以vertical-align:text-bottom為基礎的css代碼如下:vertical-align:text-bottom; margin-bottom:2px; *margin-bottom:-2px;
css代碼如下:vertical-align:text-bottom; margin-bottom:2px; margin-bottom:-2px\9;
結果如下圖(以IE6瀏覽器和Firefox瀏覽器示例):

IE6瀏覽器下的樣式表現

Firefox瀏覽器下的樣式表現
2.以vertical-align:text-top為基礎的
css代碼如下:height:13px; vertical-align:text-top; margin-top:0;
結果如下圖(以IE7瀏覽器和chrome瀏覽器截圖示例):

IE7下的樣式表現

chrome下的樣式表現
3.以vertical-align:bottom為基礎的
css代碼如下:height:15px; vertical-align:bottom; margin-bottom:3px; margin-top:-1px;
結果如下圖(以IE6和Firefox瀏覽器截圖做示例):

IE6下的表現

Firefox下的表現
4.以vertical-align:top為基礎的
css代碼如下:height:14px; vertical-align:top;
結果如下圖(chrome下文字略微偏上,其他瀏覽器下很完美,以IE7和chrome瀏覽器示例):

IE7下的表現

chrome下的表現-文字偏上
5.以vertical-align:middle為基礎的
css代碼如下:vertical-align:middle; margin-top:-2px; margin-bottom:1px;
結果如下截圖(以IE6和Firefox示例):

IE6下的樣式表現

Firefox瀏覽器下的表現
最后的說(shuō)明
*未顯示在opera瀏覽器下測試的結果,原因一是opera市場(chǎng)份額奇怪的小,即使不管它也影響不大;二是減輕自己的截圖,對比處理的工作量。這里就直接用文字表述在opera瀏覽器下的表現吧。opera是個(gè)怪胎,應該來(lái)說(shuō),它對標準的支持應該是很好的,但是14像素的文字和單選框復選框卻是不對齊的,當然,12像素更不用說(shuō)了。但是,在方案3和方案5下的表現卻是意外的好,所以方案3和方案5是不錯的方案。
*IE8瀏覽器下未測試,不是不想測,而是現在手頭上就一臺電腦,IE8由于系統原因,測不了,抱歉。
*以上方案不一定是最優(yōu)的方法,我沒(méi)有加入padding進(jìn)行測試,還有其他一些屬性,只要有時(shí)間,將各類(lèi)組合一個(gè)一個(gè)的試驗,可能會(huì )找到另外的方法。
*Firefox瀏覽器和chrome瀏覽器下的單選框和復選框默認是由一個(gè)margin值的。其兩者的值大小近乎一致,拿chrome瀏覽器舉例。在chrome谷歌瀏覽器下,radio單選框的默認margin值是:margin:3px 3px 0 5px;checkbox復選框的margin值為margin:3px 3px 3px 4px;而IE瀏覽器下似乎沒(méi)有margin值,但是對margin敏感。這是不用hack解決對齊問(wèn)題的難點(diǎn)之一。
*最后,說(shuō)句結論性的話(huà),方案3和方案5從兼容性,代碼的利用率,css的消耗等來(lái)講都是我非常推薦的兩種方法。建議您試試!
作者補充于11月3號凌晨2:40,曾在人人網(wǎng)的css代碼中看到使用vertialc-align:-3px解決此問(wèn)題,我試過(guò),雖然表現不能用完美形容,但確實(shí)緩解了對齊的問(wèn)題,是個(gè)性?xún)r(jià)比非常高的方法。我是建議您試試的。
尾聲,獻上本文的終極demo實(shí)例頁(yè)面,狠狠地點(diǎn)擊這里吧。
原創(chuàng )文章,轉載請注明來(lái)自 張?chǎng)涡?鑫空間-鑫生活 [http://www.zhangxinxu.com]
本文地址:http://www.zhangxinxu.com/wordpress/?p=56
10 條評論 發(fā)表在“復選框單選框與文字對齊問(wèn)題的研究與解決”上


講的很細致,說(shuō)的非常到位。。
非常好的解決方法,采用了!謝謝!
除了和直接文字和文字對齊,和label對齊怎么弄?因為我們會(huì )常用到label的for屬性。但IE和FF中老是一個(gè)高一個(gè)低的。
LZ你好 我用了vertical-align:text-bottom; margin-bottom:2px; *margin-bottom:-2px;這個(gè)方法在IE8很不對齊 不知道為什么
你好,這是我的問(wèn)題,當時(shí)寫(xiě)此文時(shí),無(wú)法再I(mǎi)E8下進(jìn)行測試,您試試將*margin-bottom:-2px;改為margin-bottom:-2px\9;試試~~
中英文混排的時(shí)候很多方案就是個(gè)杯具,還是用她好嗎字體來(lái)的好…表單元素其實(shí)還有很多對齊問(wèn)題比如這個(gè)下面的提交評論 按鈕的文字 ie6下就無(wú)法垂直居中,需要調節…有空博主不妨寫(xiě)寫(xiě)關(guān)于所有表單元素對齊問(wèn)題…
站長(cháng)推薦的“vertialc-align:-3px”是個(gè)不錯的解決方案。其他瀏覽器都測試過(guò),問(wèn)題不太大,在chrome瀏覽器里的表現稍微有點(diǎn)牽強!但已經(jīng)足夠完美了!
應該是vertical-align吧,博主疏忽了……
博主 你好??!我的表達不強 就是當今天在改頁(yè)面的時(shí)候 發(fā)現當*{margin:0;padding:0}時(shí)顯示有問(wèn)題 不知。。。。。
樓主這次不給力了,五個(gè)方法就第五好用一點(diǎn),但是還是有很輕微的偏差,不仔細觀(guān)察發(fā)現不了,問(wèn)題不大。
測試瀏覽器:IE6\IE8\火狐6.0.1
方法1:IE6和IE8不能統一,完全按樓主給的屬性IE8正常但在IE6文字會(huì )向上偏差2像素;調整為margin-bottom:0px\9;時(shí)IE6正常,但是IE8向下偏差2像素。我的解決方法是給文字再加個(gè)span控制margin-bottom屬性。
方法2:火狐和IE偏差2像素。
方法3:差距很大,火狐向下偏差1像素,IE6向上偏差1像素,IE8向下偏差2像素
方法4:IE8不給力,多向上偏差2像素(還有就是不知道是不是樓主粗心,完全按樓主給的屬性值,我這邊火狐和IE6都向上偏了1像素)