input的width和padding-left同時存在時IE兼容問題

總的來說,text-indent不影響元素的最終寬度但是有兼容性問題,padding-left在中國主流瀏覽器IE低版本下影響最終寬度,但在chrome和firefox下不影響寬度,但是可以通過CSS reset解決多瀏覽器顯示不一的問題,使得他們最終都影響寬度。


text-indentpadding-left的基本區別:

  • padding-left基於盒模型,適用於inline和block層級的元素
  • text-indent基於行內排版,僅僅適用於block層級的元素,作用於block層級的元素的內部第一行文字

幾乎他們所有的表現區分都是這二者的區分。

padding-left會作用於inline框block框的左側padding區域,會影響到content-box,而文字子節點會出現在content-box內部,因此所有文字都會左移。

text-indent會作用於block框的第一行文字。無論是文字超過容器的寬度被white-space的相應規則截斷,還是文字中的回車被white-space的相應規則保留,最終導致第二行第三行第N行出現,後面的第二行第三行第N行都不會應用到相應的indent。text-indent的目的很純淨,就是爲了模擬現實排版需求中的首行縮進效果。

http://jsfiddle.net/humphry/3bSSX/


<input type="text">作爲一個inline-block層級的標籤,它是固定單行顯示的(而且還和white-space機制不一樣),上面所述區別並不存在。

那麼區別在哪裏呢:

  1. text-indent基於行內排版,導致應用了direction: rtl之後,text-indent提供的indent出現在右側;padding-left則不受direction影響。 當然,direction這個屬性不常用於<input type="text">

  2. padding-left基於盒模型,所以box-sizing屬性會和padding-leftwidth屬性一同影響到元素的最終寬度;而text-indent則始終不會影響元素的寬度。 這很重要,因爲webkit和firefox的默認樣式表裏,會設置input元素的box-sizing: border-box,若你同時設置了widthpadding-left,會出現webkit/firefox和IE低版本的很大的寬度區別。 因此,用到padding-left時,需要重置webkit和firefox的相應樣式:

input[type=text] { box-sizing : content-box; -moz-box-sizing : content-box; }

重置樣式之後,在所有瀏覽器裏面,有效的padding-left在所有情況均會加到元素的最終寬度上,如上面jsfiddle所示。這是需要額外考慮的事情。


至於前一個回答的text-indent的兼容性問題,出現在IE6/7中,一個原生的inline-block元素會被text-indent拐跑: http://jsfiddle.net/humphry/9zKjL/

IE6(VirtIE6模擬):

請輸入圖片描述

chrome:

請輸入圖片描述

把它轉化爲block層級即可解決這個問題: http://jsfiddle.net/humphry/9zKjL/4/

當然,這個時候,它不能和其他文字混排了。

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