要用到的基本術語和概念:css
須要知道的畫外音:html
這樣纔會進入正題:chrome
part 1:爲何行級非替換元素好比span設置margin-top和margin-bottom並無什麼卵用?字體
你也許會說由於span不是塊級元素因此設置margin-top和margin-bottom纔會沒用,那我反問你爲什麼span設置了margin-left和margin-right就起做用呢,他們都是margin一族的啊?不知道了吧,因此真正緣由不是那麼簡單。我是從行高方面分析的,也許不徹底正確,但誰又知道css的渲染機制到底內部是怎樣或是w3c爲何要這樣規定呢...spa
首先你須要知道行框(說通俗點也就是行高line-height)是怎麼來的,由行內框肯定的是否是,而span這個行級非替換元素的行內框就是它的內容區(也就是它的em框,說通俗點就是font-size)+上下行間距。上面說過內容區相似於一個塊級元素的盒子模型中的內容框content,任你怎麼設置margin-top和margin-bottom,就算你設置border-top,boder-bottom,padding-top,padding-bottom都對行高沒什麼卵用。對於span來講行高只和em框,上下行間距有關。若是說盒子模型不是反映元素在文檔流中佔據位置的必要條件,畢竟行高還反映着元素在文檔流中佔據的高度。若是說span元素的內容區像img替換元素這樣內容區自己就包含着邊框,內外間距,那確實會影響該元素的行高。設計
part 2:利用line-height爲何會使文本或子元素的文本垂直居中?code
1 <p style="height:50px;background-color:red"> 2 <span style="background-color:yellow"> 3 我是子元素的文本 4 </span> 5 </p>
因爲沒有給span元素設置padding和border,此時黃色部分就是span元素的內容區啦,span元素此時繼承來的font-size爲16px(chrome下默認html的font-size爲16px),增長內容區上下的行間距使span元素的行高撐滿父元素,文本不就居中了。父元素的content內容高度爲50px,因此直接給span元素設置line-height爲50px就大功告成。不少人誤認爲這樣是把span元素居中了,其實不是的,span元素並沒移動,而是它的行高增長了。htm
參考:部分概念內容參考自《css權威指南》,大部分爲本身理解,如理解有誤還望各位菊苣指出好讓我迷途知返及時改正blog