要用到的基本术语和概念: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