“display:block-inline形式的Span或Div中添加文字后,致使Span或Div排版掉落、错位”的缘由及解决方法;css
场景:两个 div 排在一行上,各有固定宽高,其中有一个 div 内部有文字和排版等其余填充;两个 div 杂七杂八的宽度加起来远小于 father 宽度。html
拿到设计图以后,略想了一下,这不 so easy 么,既然有足够的宽度空间,那不就是随意发挥么:两 son 变 inline-block,那个有内容的 div 内或 padding ,或 flex,大体弄个上下等距不就 ok 了么,正好前面的人用 table-cell 来垂直居中,正好能够试试。然而事实证实太 naive 了,inline-block 中就藏了一个坑。
浏览器
首先是思路中的效果:dom
.container { width: 900px; height: 300px; background-color: #eee; margin: 100px auto; } .inbox { display: inline-block; width: 400px; height: 100px; background-color: #7b7f88; } <div class="container"> <div class="inbox"></div> <div class="inbox"></div> </div>
很快啊,上面没什么问题(由于父元素的宽度足够,两个子元素之间的间隙能够忽略,固然这里也会出现隐藏坑,后叙)。因而很开心地去填充内容了,dom 结构变成:字体
<div class="container"> <div class="inbox"></div> <div class="inbox"> <div> <h2>55</h2> </div> </div> </div>
愉快地 ctrl + s 以后 F5,而后就懵逼了,这不对啊,怎么成这样了,刚才不还好好的么,就加了句话???flex
因而通过翻山越岭地 Google baidu 以后,找到了参考中的资料:css 有个属性 vertical-align,它只在 display为 inline 或者 inline-block 的状况下起做用,默认值是 baseline。这意味着把元素设置成 inline(-block) 的时候,内部的文字会按照基线对齐,这也是为何用尺子量,“55” 正好切了前一个 inbox 的 bottom。spa
那解决办法就简单了,每一个 inbox 设置 vertical-aligh: top(若是父元素的高度是撑开的话,设置成middle、bottom、text-bottom、text-top 均可以),就能够回归思路,以下图:
.net
在第一张图咱们也看到, inline-block 的盒子之间是存在一点间隙的,这个问题和 HTML 的结构有关。正如上面咱们贴的代码,两个 inbox 之间有一个换行,而浏览器在解释的时候遇到 inline(-block) 会把这个换行符解释成一个空白文本节点,这在视觉上就出现了间隙。解决办法有不少,贴两个常见的:设计
1. 代码写一行上,不过不利于维护;
htm
2.父元素设置 font-size: 0,子元素从新设置字体大小;
各有优缺点,按需取用。