本文最終總結出來辦法就是要對齊的表單內容(含文字、圖片、表單各種元素、label)字體設置為Tahoma,則可以完美的實現對齊(Verdana等字體也可以),其中個別的input元素如radio的padding和margin設置為0,即可完美解決表單元素input等對齊問題。
最近的項目涉及到很多表單的制作,特別是復選框(checkbox)和單選框(radio)。但是在前端開發過程中發現,單(復)選框和它們后面的提示文字在不進行任何設置的情況下,是無法對齊的,而且在Firefox和IE中相差甚大。即使設置了vertical-align:middle,也依然不能完美對齊。如下圖所示:

于是上網查看了一些網站,發現這個問題是普遍存在的,如下圖(FF3.5):

在很多網站涉及到表單的頁面中,都存在這種表單元素與提示文字無法對齊的問題。于是打算研究一下這個問題。首先,搜索到了wheatlee前輩的文章《大家都對vertical-align的各說各話》。wheatlee在他的文章中關于垂直居中提到了這樣幾個關鍵點:
1、vertical-align:middle的時候,是該元素的中心對齊周圍元素的中心。
2、這里“中心”的定義是:圖片當然就是height的一半的位置,而文字應該是基于baseline往上移動0.5ex,亦即小寫字母“x”的正中心。但是很多瀏覽器往往把ex這個單位定義為0.5em,以至于其實不一定是x的正中心
(baseline等名詞如果不懂,請先閱讀wheatlee的文章)
按照這個思路,對照我遇到的問題,首先想到的是先驗證一下瀏覽器對于“復選框”和圖片是不是使用同樣的規則來渲染(是不是把復選框當成一個正方形圖片來對待)。于是寫出下面的代碼:
~~~
<style>
body{font-size:12px;}
</style>
<input style="vertical-align:middle;" name="test" type="checkbox">
<img style="vertical-align:middle;" src="testpic.gif" />
~~~
測試文字
代碼中的testpic.gif是一個尺寸與復選框完全一樣的黑色圖片。FF3.5下顯示如下:

事實證明,FF3.5對于復選框和圖片的垂直對齊方式是采用同樣的規則進行渲染的,即將復選框當作一個正方形的圖片(IE不是)。按照wheatlee“middle的時候,是該元素的中心對齊周圍元素的中心”的觀點,如果我在復選框后面輸入英文字符,那么復選框的中心將與英文中小寫字母x的中心對齊。經測試,FF3.5下面基本上是這樣的(在一些字號的時候會有一定的誤差,比如,如果字體高度是偶數,那么這個中心點有時在一般偏上1px,有時在一半偏下1px)。如圖:

但是這對于中文來說,并不是一個好的結果。因為中文是方塊字,并且相同字號的情況下,高度會比小寫的x高出很多。所以,按照瀏覽器內置的方式,只用 vertical-align:middle是無論如何也無法對齊中文的(無論是只寫中文,中文在前,英文在前,FF3.5都是按照小寫x中心那種方法來對齊的)。但是回頭再看看wheatlee的文章,他說這個小寫x中心對齊的渲染方式,是對于“文字”來說的。那么,如果不是文字呢…?如果復選框后面跟的是一個行內元素,如label,而文字是寫在它內部的,會是什么樣呢?瀏覽器會不會將這個內聯元素整體看作一個“塊”,然后依照類似圖片的規則進行渲染呢?如果那樣,我們就達到目的了。
但是經過測試,很遺憾,事實并不是這樣,加上label后跟沒加沒有任何區別。FF3.5/IE6/IE7均是如此。在FF3.5中用firebug看一下,證明瀏覽器并沒有按照label的高度值來去對齊中心點。如圖:

如果按照之前的設想,紅藍兩線應該是重合的。但現在的情況是,它們相差了1px。并且這1px是沒有規律的,隨著字號的放大,并不恒定,貌似輕易也無法提煉出對應關系來。于是想到,再試一下將label也加上vertical-align:middle。結果如圖:

在FF3.5和IE7下面已經很接近于我們希望的狀態了,只差1px。IE6下… 無語了。
經過以上折騰,我得出了跟wheatlee相同的結論,就是,各種瀏覽器之間對這個問題的處理貌似沒有任何規律。并且,似乎每一種瀏覽器對于 vertical-align:middle的渲染都不是完全遵從W3C所說的“Align the vertical midpoint of the box with the baseline of the parent box plus half the x-height of the parent.”
但是經過仔細總結和分析,發現好像最終對齊的結果跟label的高度和當前字體中小寫x的中心點都有關系,兩者同時影響著渲染結果(雖然不明白為什么會這樣)。那么,既然現在的情況以及非常接近于希望的狀態了,是否可以通過設置字體的方式來改變小寫x的中心點的位置,進而對垂直對齊的結果進行“微調”呢?
最終,在不斷的測試中發現,如果將font-family中的第一個字體設置為Tahoma,則可以完美的實現對齊(Verdana等字體也可以)。而且在FF3.5/IE6/IE7/IE8和Chrome中均顯示正常。
最終效果:

至此,多選框(checkbox)和提示文字對齊的問題已經解決,那么其他表單元素呢?試驗了一下單選框(radio),發現,還是有問題。提示文字依然是偏上。用firebug看了一下,發現radio元素默認有5px的左邊距和3px的上、右邊距,卻沒有下邊距。如圖:

于是,嘗試去掉radio的外邊距,刷新后顯示正常。(其實多選框checkbox也是有外邊距的,只是它的外邊距四個方向都有,并且相等,所以對于垂直對齊沒有影響。)下圖是一些常用表單元素的最終顯示效果以及最終代碼,大家可以用不同瀏覽器看一下實際的效果(注:由于演示使用的12px的中文實際只有11px高,而 IE下文本框等元素的高度是22px,一個是奇數,一個是偶數,所以這些部分在IE中是無論如何也對不齊的,差1px。如果手動控制文本框高度為奇數,或者將文字設置成為偶數的高度,則顯示正常):

- 前端工程師
- HTML
- 使用meta實現頁面的定時刷新或跳轉
- 表單相關
- 表單元素input、按鈕、文字完美垂直居中對齊方法
- CSS
- 相關工具網站
- JS
- jQuery
- 第1章 初始jQuery
- 環境搭建
- jQuery對象與DOM對象
- jQuery對象轉化成DOM對象
- DOM對象轉化成jQuery對象
- 第2章 jQuery選擇器
- id選擇器
- 類選擇器
- 元素選擇器
- 全選擇器(*選擇器)
- 層級選擇器
- 基本篩選選擇器
- 內容篩選選擇器
- 可見性篩選選擇器
- 屬性篩選選擇器
- 子元素篩選選擇器
- 表單元素選擇器
- 表單對象屬性篩選選擇器
- 特殊選擇器this
- 第3章 jQuery的屬性與樣式
- 元素的數據存儲
- 問題解決方案
- 解決innerHTML包含的js代碼不能被執行的問題
- webpackdoc
- 前端開發框架
- Bootstrap 3.3.6
- 起步
- 全局 CSS 樣式
- 概覽
- 柵格系統
- PHP
- PHP入門篇
- 基礎總結
- PHP環境變量$_SERVER和系統常量詳細說明
- PHP進階篇
- 數組
- 函數
- 類
- 字符串操作
- 正則表達式
- 會話控制
- 文件系統
- 日期和時間
- 圖形圖像操作
- PHP異常處理
- 數據庫操作
- WEB在線文件管理器
- PHP文件操作
- 獲取首層目錄信息
- 獲取文件信息
- 列表顯示文件及大小
- PHP與MySQL關系大揭秘
- PHP支持哪些數據庫
- 數據庫擴展
- 連接MySQL數據庫
- 執行MySQL查詢
- 插入新數據到MySQL中
- MVC架構模式分析與設計
- Smarty模版語法
- Smarty的基本語法
- Smarty的條件判斷語句
- Smarty的循環語句
- Smarty的文件引用
- Smarty類和對象賦值與使用
- Smarty函數的使用
- functions函數插件的定義和使用
- modifiers變量調節器插件的定義和使用
- block functions區塊函數插件的定義和使用
- Smarty實例
- MVC微型框架的建立
- 網絡摘抄
- PHPExcel如何讀取超大excel文件
- Composer
- Composer技巧
- PHP 開發者該知道的 5 個 Composer 小技巧
- composer常用命令
- Composer使用方法整理(Cy23)
- 利用Composer一步一步搭建自己的PHP框架
- ThinkPHP
- ThinkPHP中RBAC類詳解(一)
- 附:添加注釋版RBAC類源碼
- 常見問題
- 常見方法
- thinkphp 合并兩個字段組合成一個臨時字段concat函數
- ThinkPHP Where 條件中使用表達式
- 編程相關工具
- Eclipse
- Eclipse或Zendstudio漢化
- Zend studio
- Zendstudio快捷鍵
- Zend Studio實用快捷鍵一覽表
- Sublime text
- Sublime text快捷鍵
- 16 個 Sublime Text 快捷鍵
- Emmet的用法及相關語法
- VS Code
- 數據庫
- MySql
- 問題匯總
- mysql創建存儲過程失敗1307錯誤解決
- Mysql出現Field * doesn't have a default value解決辦法
- mysql:ADO連接mysql數據庫,驅動程序和ODBC數據源問題
- 自己如何正確獲取MYSQL的ADO連接字符串
- 網上摘抄
- mysql 存在更新 不存在插入
- Mysql字符串字段中是否包含某個字符串,用 find_in_set
- mysql字段類型對應的數字編號
- 5.7mysql group分組查詢錯誤問題
- mysql常用操作語句
- SQL2005
- SQL常見錯誤
- 使用 sp_change_users_login 修復產生的孤 立賬戶 & 還原中的孤立用戶
- ASP
- Url編碼解碼函數合集 含utf-8和gb2312
- 其他前端相關技巧
- 聯機查看 Office 文檔
- 服務器配置
- windows
- 服務器安裝
- XAMPP自帶TOMCAT插件可以支持php+java
- IIS
- iis7服務器,客戶端無法下載exe文件的解決之道
- Linux
- ubuntu
- Linux安裝JDK
- 輔助開發工具
- Git