總的來說,text-indent
不影響元素的最終寬度但是有兼容性問題,padding-left
在中國主流瀏覽器IE低版本下影響最終寬度,但在chrome和firefox下不影響寬度,但是可以通過CSS reset解決多瀏覽器顯示不一的問題,使得他們最終都影響寬度。
text-indent
和padding-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
機制不一樣),上面所述區別並不存在。
那麼區別在哪裏呢:
-
text-indent
基於行內排版,導致應用了direction: rtl
之後,text-indent
提供的indent出現在右側;padding-left
則不受direction
影響。 當然,direction
這個屬性不常用於<input type="text">
-
padding-left
基於盒模型,所以box-sizing
屬性會和padding-left
、width
屬性一同影響到元素的最終寬度;而text-indent
則始終不會影響元素的寬度。 這很重要,因爲webkit和firefox的默認樣式表裏,會設置input元素的box-sizing: border-box
,若你同時設置了width
和padding-left
,會出現webkit/firefox和IE低版本的很大的寬度區別。 因此,用到padding-left
時,需要重置webkit和firefox的相應樣式:
重置樣式之後,在所有瀏覽器裏面,有效的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/
當然,這個時候,它不能和其他文字混排了。